1. 程式人生 > >Kaggle競賽優勝者原始碼剖析(一)

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.py

ben.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編碼稀疏化處理等。另外,這些特徵工程並不是都用上,而是有選擇的使用,使用不同的特徵工程方法,能得到不同的資料集。

utils.py

  輔助指令碼,提供了兩個輔助函式stringify()和compute_auc(),前者用正則表示式將模型和該模型用到的資料集的名稱進行組合作為一個identifier,而後者是計算auc值的函式

ml.py

  提供了 模型訓練的框架,包括AUCRegressor、MLR和StackedClassifier這三個類。其中StackedClassifier是主力,它將幾個模型整合到一起以期達到最好的效果(用AUC來衡量),用來計算AUC的模型輸出值有三中形式可供選擇,mean_preds、stack_preds和fwls_preds,其中mean_preds是模型組合中所有模型輸出結果的簡單平均值,stack_preds和fwls_preds都是利用RidgeCV選擇最佳的引數,fwls相較於stack增加了metafeatures。而find_params()函式利用GridSearchCV()篩選出最優的引數值,該函式的輸出結果作為classifier.py中model.set_params(),從而保證能利用到最優引數值。函式fit_predict()用來訓練每個模型並輸出結果的平均值。