實戰(zhàn)微博互動預測之三_xgboost答疑解惑

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)了伯襟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猿涨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子姆怪,更是在濱河造成了極大的恐慌叛赚,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稽揭,死亡現(xiàn)場離奇詭異俺附,居然都是意外死亡,警方通過查閱死者的電腦和手機溪掀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門事镣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揪胃,你說我怎么就攤上這事璃哟。” “怎么了喊递?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵随闪,是天一觀的道長。 經(jīng)常有香客問我骚勘,道長铐伴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任俏讹,我火速辦了婚禮当宴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泽疆。我一直安慰自己户矢,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布殉疼。 她就那樣靜靜地躺著梯浪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪株依。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天延窜,我揣著相機與錄音恋腕,去河邊找鬼。 笑死逆瑞,一個胖子當著我的面吹牛荠藤,可吹牛的內(nèi)容都是我干的伙单。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼哈肖,長吁一口氣:“原來是場噩夢啊……” “哼吻育!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淤井,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤布疼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后币狠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體游两,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年漩绵,在試婚紗的時候發(fā)現(xiàn)自己被綠了贱案。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡止吐,死狀恐怖宝踪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碍扔,我是刑警寧澤瘩燥,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站蕴忆,受9級特大地震影響颤芬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜套鹅,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一站蝠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卓鹿,春花似錦菱魔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杰妓,卻和暖如春藻治,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背巷挥。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工桩卵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓雏节,卻偏偏與公主長得像胜嗓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子钩乍,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容