Kaggle競賽優勝者原始碼剖析(一)
比賽題目連結:https://www.kaggle.com/c/amazon-employee-access-challenge
優勝者Github:https://github.com/pyduan/amazonaccess 該題目提供的資料集特徵數較少,能拿到比賽的頭名足以見得需要利用業務知識不斷地進行變數轉換建立新變數。作者用到的演算法也是Kaggle中很常規的LR、GBDT、RandomForest和ExtraTrees,演算法上沒有特別新的地方,能拿到頭名足以見得特徵工程的重大貢獻。讓我們一起領略作者的特徵工程技巧吧。 共有ben.py、greedy.py、feature_extraction.py、utils.py、ml.py等指令碼,最後得到結果需要執行classifier.pyben.py
該指令碼構建了基礎資料集bsfeats,只對原始資料集做了最基本的特徵工程。1.對個別變數進行線性組合得到新變數 2.按變數對資料進行分組,計算不同觀測在組中出現的次數並取對數 3.計算各部門的資源使用率 4.計算各經理的資源佔有量。需要強調的是,這些特徵工程都是緊緊圍繞業務知識展開的。
greedy.py
該指令碼構建資料集greedy,greedy1,greedy2。分別將各列兩兩組合生成元組,對元組取雜湊得到新的列,這個新的列可以代表之前組合的兩列的互動作用,將原始資料集橫向合併新生成的列得到了全是新特徵的tuples資料集。同理,將各列三個一組進行組合用同樣的方法得到全是組合再hash後全是新特徵的triples資料集。最後將原始資料集、tuples資料集以及triple資料集橫向拼在一起,即把新生成的特徵放進去。由於不管是原始資料集還是新生成的tuples、triples資料集,很多都是類別型變數,對它們分別進行One-hot編碼得到稀疏矩陣Xts。遍歷Xts中的每一個特徵,用自編的cv-loop函式分別計算auc得分,依照auc得分篩選出good_features。這裡用的是前進法,比如第五個特徵符合要求屬於good_features,考查第六個特徵時,把該特徵與前五個特徵一起放到函式中計算auc得分,相當於每放一個feature進來就計算一次auc,遍歷完所有特徵後對auc進行排序。需要注意的是,由於之前進行過one-hot編碼,計算得分前要用scipy中的tocsr()將稀疏矩陣轉化為壓縮形式。
feature_extraction.py
tuples和triples函式分別對資料集中的變數兩兩組合和三三組合得到新的變數,至此,資料集的六大框架(bsfeats,greedy,greedy2,greedy3,tuples,triples)都已構建好。create_feature()函式按照基礎模型、LR模型、Trees模型(這裡指的是GradientBoostingClassifier、RandomForestClassifer和ExtraTreesClassifier)分別構建含有不同特徵的資料集。在構建的過程中使用了變數的取平方、取平均、取對數、除總算頻率等特徵工程方法。其中用於LR模型和Trees的資料集都進行了進一步的預處理過程,包括各特徵相互乘除構造新特徵(用於表徵特徵間的相互作用)、去除常數變數、變數標準化處理、變數值加上1取對數、變數取平方、變數取三次方、用One-Hot編碼稀疏化處理等。另外,這些特徵工程並不是都用上,而是有選擇的使用,使用不同的特徵工程方法,能得到不同的資料集。