1. 說明
?前兩篇完成了特征工程的相關工作:加入用戶的統(tǒng)計特征,分析文本信息內(nèi)容封孙,并作為新特征加入了數(shù)據(jù)集已慢。
本篇我們來看看算法逾礁,實戰(zhàn)微博互動預測(后簡稱本例)的評估算法如下:
?公式中f代表轉(zhuǎn)發(fā)苞尝,c代表評論畸肆,l代表贊,p代表預測宙址,r代表真實值轴脐;deviation是真實值與預測值的偏差,具體公式如下:
precision是準確率抡砂,根據(jù)偏差算出:
sig為符號函數(shù)大咱,當x>0時sig(x)=1,當x<=0時注益,sig(x)為0碴巾。Counti為每篇的反饋總數(shù),當Counti>100時丑搔,以按100計算厦瓢。
?與大多數(shù)評估算法不同,本例中每個實例有不同權(quán)重啤月,反饋越多實例權(quán)重越大旷痕。而我們常用的算法比如GBDT是根據(jù)誤差迭代改進的,默認情況下各實例權(quán)重是一樣的顽冶,這塊兒需要單獨處理一下。
?具體算法還是使用xgboost庫售碳,之前看到的大多數(shù)關于xgboost的文章强重,要么是講數(shù)學原理,要么是參數(shù)的中文說明贸人,xgboost似乎還是一個黑盒间景,下面就結(jié)合具體問題看看xgboost的使用。
2. xgboost注意事項
?xgboost提供兩種調(diào)用方式艺智,一種是自身接口倘要,一種是類似sklearn的接口,建議使用自身接口十拣,因為很多重要功能封拧,如存取模型,評估功能都無法通過sklearn接口調(diào)用夭问。
?在資料泽西,示例和文檔都不多的情況下,建議下載源碼缰趋,學習其中的example,demo捧杉,test中的使用方法陕见,以及直接分析源碼的調(diào)用流程。
3. xgboost源碼
?一般使用xgboost直接用pip install安裝即可味抖,下載源碼主要以學習為主评甜。
?下載使用命令:
git clone https://github.com/dmlc/xgboost
?xgboost主要是c語言實現(xiàn)的,本例中主要通過python接口調(diào)用仔涩,在demo目錄中可以看到示例忍坷。
4. xgboost學習率與迭代次數(shù)
?xgboost是一種迭代改進的算法,它每次給錯誤分類的實例增加權(quán)重红柱,并進入下一次迭代承匣。因此需要指定迭代次數(shù)和每次權(quán)重改進的程度(學習率)。
?迭代次數(shù)通過num_boost_round設置锤悄,次數(shù)越多韧骗,花費時間越長,xgboost除了可以設置固定迭代次數(shù)以外零聚,還可以根據(jù)評估袍暴,判斷如果n次不再改進,則停止迭代(具體見eval部分)隶症。
?學習率通過eta設置政模,它是每次迭代之后對原模型的改進程度,學習率越高收斂越快蚂会,但也可能因為粒度太大淋样,錯過極值點。
調(diào)參方法是先粗調(diào)再細調(diào):一開始將學習率設大一點胁住,比如0.1-0.3趁猴;次數(shù)設少一點,比如50次彪见,即能快速改善模型又不花太長時間儡司。后面細調(diào)時再變小學習率,增加迭代次數(shù)余指。
5. xgboost的eval系列參數(shù)
?eval系列參數(shù)用于評估模型的狀態(tài)捕犬,可以在每次迭代之后給模型打分,它本身與模型如何計算無關(無論它設成什么酵镜,最終模型都不變)碉碉,只是評估當前模型好壞。這個功能非常重要淮韭,比如:有時候會看到在迭代過程中訓練集評分提高誉裆,而測試集評分下降,一般就是過擬合了缸濒。使用它還可以控制當模型不再改進時足丢,停止迭代(具體通過early_stopping_rounds設置)粱腻。
1) evals設置估計數(shù)據(jù)
?evals可設置訓練集和測試集,在每次迭代后用訓練集和測試集代入模型斩跌,并給預測結(jié)果評分绍些。
2) eval_metric現(xiàn)成的評估函數(shù)
?可以設置rmse,logloss,error,merror,mlogloss,auc,ndcg,map等xgb自帶的評估函數(shù)。
3) feval自定義評估函數(shù)
?本例就需要自定義估伻函數(shù)耀鸦,使用feval方法實現(xiàn)柬批。它和梯度下降算法無法,主要用于顯示袖订,并判斷何時終止迭代氮帐。最好別寫太復雜,否則會延長計算時間洛姑。
4) early_stopping_rounds自動停止迭代
?通過early_stopping_rounds設置上沐,如果在n輪內(nèi)正確率沒有提升,則退出迭代楞艾,具體根據(jù)evals給出的數(shù)據(jù)判斷参咙,若其中包含多組數(shù)據(jù),則取最后一個硫眯。
?如果設置了early_stopping_rounds蕴侧,模型會生成三個屬性,best_score, best_iteration, bst.best_ntree_limit两入,以便下次選擇最合適的迭代次數(shù)净宵。
5) verbose_eval輸出評估信息
?如果設置為True輸出評估信息,設置為數(shù)字裹纳,如5則每5次評估輸出一次塘娶。
6. 樣本不均衡問題
1) 設置scale_pos_weight
?有時會遇到樣本不均衡的問題,比如正例占99%痊夭,反例占1%,那么如果預測為全正例或者隨機抽機脏里,正確率也占99%她我。此時可使用scale_pos_weight提高反例權(quán)重,默認為1迫横,不增加權(quán)重番舆。
2) DMatrix設置weight
?使用xgb自帶的調(diào)用接口 (非sklearn接口),需要把數(shù)據(jù)轉(zhuǎn)成DMatrix格式矾踱,如果想給不同實例分配不同權(quán)重恨狈,可以轉(zhuǎn)換時使用weight參數(shù),它傳入與實例個數(shù)等長的數(shù)組呛讲,數(shù)組中每個數(shù)對應一個實例的權(quán)重禾怠,在xgb每次迭代后調(diào)整權(quán)重時也會將它計算在內(nèi)返奉。
7. Xgboost自帶的調(diào)參方法
?之前文章中說過Xgboost與sklearn的GridSearchCV結(jié)合調(diào)參的方法。Xgboost內(nèi)部的cv()函數(shù)提供了交叉驗證的功能吗氏,也可用于調(diào)參芽偏。網(wǎng)上例程不多,具體可參見源碼中的:demo/guide-python/cross_validation.py
8. Xgboost的誤差函數(shù)
?Xgboost可以處理二分類弦讽,多分類污尉,回歸問題。處理不同問題往产,主要的區(qū)別在于指定不同的誤差函數(shù)被碗,xgboost會根據(jù)不同誤差函數(shù)計算的結(jié)果調(diào)整權(quán)重進行下一次迭代。通過參數(shù)objective可設置xgb自帶的誤差函數(shù):回歸一般用reg:xxx(如reg:linear)仿村,二分類用binary:xxx(如binary:logistic)锐朴,多分類用multi:xxx(如multi:softmax)。誤差函數(shù)的功能是通過訓練集的label和預測值計算一階梯度奠宜,二階梯度包颁,在源碼中可以看到它們是如何實現(xiàn)的(C語言部分)。在調(diào)用train()訓練時压真,也可以用參數(shù)obj自定義誤差函數(shù)娩嚼。
9. 本例中xgb的使用
1) 評估
?本例的評分算法和普通算法差別很大,因此使用feval自定義了評估函數(shù)滴肿,效果還不錯岳悟,就是計算時間比較長。所以有時會把它暫時注釋掉泼差。
2) 誤差函數(shù)
?本例是一個回歸問題贵少,因此使用了reg:linear,線性計算誤差函數(shù)堆缘,它的實現(xiàn)非常簡單滔灶,一階梯度是預測值與標簽值相減,二階梯度是1.0吼肥。
3) 關于權(quán)重
?本題要求反饋多的實例在計算結(jié)果時擁有更大的權(quán)重录平,一開始的想法是給這些實例加權(quán),于是使用了在DMatrix轉(zhuǎn)換時設置weight缀皱,后來又自定義了誤差函數(shù)斗这。但效果都不好,正確率不升反降啤斗。我覺得可能由于這是一個回歸問題表箭,回歸的權(quán)重算法是:偏差越大,權(quán)重越大钮莲,以促進快速收斂免钻。一般反饋多的實例偏差都大彼水,如果再把權(quán)重計算再內(nèi),就重復加權(quán)了伯襟。