天池智能製造預測大賽-解決思路筆記
前言:去年年底嘗試參加了天池上的智能製造預測大賽,因為瑣事纏身只做了一半沒有完成,但是對最後dalao們的獲獎總結很感興趣,大致閱讀了一下技術圈的分享貼,做了一個小的閱讀筆記,總結了一點自己在做的時候的一些疑問。
比賽介紹傳送門:
天池-智能製造大賽
1. 高維小樣本的回歸預測,取多少特徵合適?
訓練集有4000+特徵,只有1000+的樣本。這個問題在比賽中十分讓人困擾,本地CV的 結果可能因選取特徵數量越多越好,很難判斷是不是過擬合。根據本案例中技術圈大佬的分享,大致最後選擇的特徵個數都在100~200之間,這可以為以後相關類型的問題提供一定依據。
2. 該不該構建特徵,怎樣選擇構建的特徵?
本問題本身的特徵維度就很大,大部分解決方案的建議是不做特徵構建,直接對原始數據降維。但是冠軍選手構建了很多特徵,這裡概述一下他的思路。在訓練集樣本數很少的時候,大可以生成所有的特徵再統一選擇。但是很多時候,樣本集過大,如果完成所有特徵構建再選擇時間複雜度太高。這裡冠軍選手的方案很簡單,每生成一個或者一批特徵,實時計算其與label標籤的Pearson相關係數,設定一定的閾值直接選擇。
具體特徵構建的一些通用的方式,可以參考 @光喻 的這篇文章:【持續更新】機器學習特徵工程實用技巧大全,很贊。
3. 怎樣做特徵降維和特徵選擇?
高維小樣本的問題是肯定要做特徵降維的,盡量減少模型複雜度能提高預測的泛化能力。所有分享思路都提到了降維問題,並且一致表示PCA降維的效果很差。思路主要是直接從原數據集特徵中選擇。
特徵選擇的指標很多,可能不同的指標選擇出的重要特徵都不相同,這個是很麻煩的事情。這裡概述一下不同的思路:
a) 把樣本分為若干子集,分別對每個子集採用帶L1正則約束的Lasso回歸選擇特徵,最後選擇在每個子集都表現良好的特徵;
b) 直接用GBDT模型生成的feature_importance排名選擇特徵;
c) 分別採用相關性/互信息/遞歸消除REF/單變數方差分析選擇特徵,對每一種方式生成的特徵集訓練並做CV實驗,CV結果越好的特徵集選取更多的特徵。比如某季軍思路由相關性係數選了100個特徵,由互信息選擇了50個特徵,合併二者得到了138個特徵(去重後)。
4. Stacking適合多大的數據集?
以前看Stacking的概念,有一條是Stacking不適合小樣本集。那麼這個小的定義是多小?在這個問題中,一部分方案認為該問題數據集樣本太小,不適合stacking而僅採用了簡單加權合併的ensemble方式,一部分認為stacking很有效,並且通過stacking獲得了顯著提升。這裡筆者覺得Stacking應該對1000+大小的數據集還是適用的。
5. 怎麼做本地CV?
做好本地CV對控制建模進程有很重要的意義,本地CV做好了就不會每次提交結果像賭博一樣。書上的概念是減少過擬合應該是同時減少方差和偏差,選擇二者的一個trade-off。那麼實戰的時候怎麼判斷這個方差和偏差?
一個思路是比如做10折CV的時候,計算10個CV結果的均值和方差,把均值作為其偏差,結果的方差作為預測的方差,找二者均比較小的模型或特徵集作為最優模型。
另外一個思路是做深度學習或者Xgboost這類boosting模型的時候,每若干輪迭代取一次其訓練集和測試集的誤差,選擇一個比較大的max_iterations或者max_estimators,記錄這些誤差並畫圖,判斷最優的迭代數。
6. 數據清洗的注意事項
很多小白對數據集缺失值的處理可能直接就pandas.dropna(),pandas.fillna()搞定了,但是該案例里很多缺失值是被0或者負數或者極端大的值填充的!這就需要手工去判斷和處理了。
另外,可以對很重要但是分布趨於偏正態分布的特徵取log,使其更趨於正態分布。
參考資料:
天池智能製造預測-技術圈
推薦閱讀:
※1-3 What is Machine Learning
※梯度下降及其優化演算法
※全面理解word2vec
※【頂級資源】掌握線性代數為機器學習打下堅實基礎!
※[PRML學習筆記] CHA 4 Linear Models for Classification