關於xgboost的學習推薦兩篇博客,每篇看2遍,我都能看懂,你肯定沒問題
兩篇方法互通,知識點互補!記錄下來,方便以后查看
第一篇:作者:milter鏈接:https://www.jianshu.com/p/7467e616f227
第二篇:https://blog.csdn.net/a1b2c3d4123456/article/details/52849091
1、你需要提前掌握的幾個知識點
1、監督學習
監督學習就是訓練數據有標簽的學習。比如說,我有10萬條數據,每個數據有100個特征,還有一個標簽。標簽的內容取決於學習的問題,如果數據是病人進行癌症診斷做的各項檢查的結果,標簽就是病人是否得癌症。是為1,不是為0.
監督學習就是要從這10萬條數據中學習到根據檢查結果診斷病人是否得癌症的知識。由於學習的范圍限定在這10萬條數據中,也就是說,學習的知識必須是從這10萬條數據中提煉出來。形象地理解,就是在這10萬條帶標簽數據的“監督”下進行學習。因此稱為監督學習。
2、監督學習的成果
監督學習學習到的知識如何表示,又是如何被我們人類使用呢?簡單講,學習到的知識用一個模型來表示,我們人類就用這個模型來使用學習到的知識。
那么,模型是什么東西?
模型就是一個數學表達式。最簡單的一個模型就是線性模型,它長這個樣子:y^i=∑_j θ_j*x_ij。用我們上面的例子講,x_i就是我們10萬條數據中的第i條,x_ij就是第i條數據中的第j個檢查結果。y^i就是模型對這條數據的預測結果,這個值越大,表明病人得癌症的概率也大。通常,我們還需將y^i處理成0到1的值,以更清晰地表明這是一個概率預測,處理的方法一般是用sigmoid函數,不熟悉的朋友可參考其他資料。θ_j就是第j個檢查結果對病人是否得癌症的“貢獻度”,它是我們模型的參數,也就是我們從10萬條數據中學習到的知識。
可見,所謂監督學習,就是兩步,一是定出模型確定參數,二是根據訓練數據找出最佳的參數值,所謂最佳,從應用角度看,就是最大程度地吸收了10萬條訓練數據中的知識,但從我們尋找參數的過程來看,卻有另一番解釋,下文會詳細解釋,找到最佳參數后,我們就得出一個參數都是已知的模型,此時,知識就在其中,我們可以自由使用。
3、如何找出最佳參數
以上面的線性模型為例,病人有100個檢查結果,那么就有100個參數θ_j(j從1到100)。每個參數可取值都是實數,100個參數的組合顯然有無窮多個,我們怎么評判一組參數是不是最佳的呢?
此時,我們需要另外一個函數來幫助我們來確定參數是否是最佳的,這就是目標函數(object function)。
目標函數如何確定呢?用我們上面的例子來講,我們要判斷病人是否得癌症,假設我們對上面的線性模型的值y^i進行了處理,將它規約到了0到1之間。我們的10萬條訓練數據中,得癌症的病人標簽為1,沒得的標簽為0.那么顯然,最佳的參數一定就是能夠將得癌症的病人全預測為1,沒得癌症的病人全部預測為0的參數。這幾乎就是完美的參數!
因此,我們的目標函數可以設為MSE函數:obj = ∑_i (sigmoid(∑_jθ_j*x_ij) - y_i)^2
上面的函數的意思就是對第i條數據,將模型預測的值規約到0到1,然后與該條數據的真是標簽值(0和1)做差,再求平方。這個平方值越大,表明預測的越不准,就是模型的預測誤差,最后,我們將模型對10萬條數據的預測誤差求和。就得出了一組具體的參數的預測好壞的度量值。
果真這樣就完美了嗎?
不是的。上面的目標函數僅僅評測了參數對訓練數據來說的好壞,並沒有評測我們使用模型做預測時,這組參數表現好壞。也就是說,對訓練數據來說是好的參數,未必在預測時就是好的。為什么?
- 一是10萬條數據中有錯誤存在
- 二是10萬條數據未必涵蓋了所有種類的樣本,舉個極端的例子,假如10萬條數據全是60歲以上老人的檢查結果,我們用學習到的模型取預測一個10歲的小孩,很可能是不准的。
那么,怎么評測一組參數對預測是好是壞呢?
答案是測了才知道!
這不是廢話嗎。
事實就是這樣。真實的預測是最權威的評判。但我們還是可以有所作為的,那就是正則化。
所謂正則化就是對參數施加一定的控制,防止參數走向極端。以上面的例子來說,假如10萬條數據中,得癌症的病人都是60歲以上老人,沒得癌症的病人都是30歲以下年輕人,檢查結果中有一項是骨質密度,通常,老人骨質密度低,年輕人骨質密度高。那么我們學習到的模型很可能是這樣的,對骨質密度這項對應的參數θ_j設的非常大,其他的參數都非常小,簡單講,模型傾向於就用這一項檢查結果去判斷病人是否得癌症,因為這樣會讓目標函數最小。
明眼人一看便知,這樣的參數做預測肯定是不好的。
正則化可以幫助我們規避這樣的問題。
常用的正則化就是L2正則,也就是所有參數的平方和。我們希望這個和盡可能小的同時,模型對訓練數據有盡可能好的預測。
最后,我們將L2正則項加到最初的目標函數上,就得出了最終的目標函數:
obj = ∑_i(sigmoid(∑_j θ_j*x_ij) - y_i)^2 + ∑_j(θ_j^2)
能使這個函數值最小的那組參數就是我們要找的最佳參數。這個obj包含的兩項分別稱為損失函數和正則項。
這里的正則項,本質上是用來控制模型的復雜度。
Notes:
上面,我們為了盡可能簡單地說明問題,有意忽略了一些重要的方面。比如,我們的例子是分類,但使用的損失函數卻是MSE,通常是不這樣用的。
對於回歸問題,我們常用的損失函數是MSE,即:

對於分類問題,我們常用的損失函數是對數損失函數:

乍一看,這個損失函數怪怪的,我們不免要問,為什么這個函數就是能評判一組參數對訓練數據的好壞呢?
我們用上面的例子來說明,假如有一條樣本,它的標簽是1,也就是y_i = 1,那么關於這條樣本的損失函數中就只剩下了左邊那一部分,由於y_i = 1,最終的形式就是這樣的:

頭上帶一個小尖帽的yi就是我們模型的預測值,顯然這個值越大,則上面的函數越傾向於0,yi趨向於無窮大時,損失值為0。這符合我們的要求。
同理,對於yi=0的樣本也可以做出類似的分析。
至於這個損失函數是怎么推導出來的,有兩個辦法,一個是用LR,一個是用最大熵。具體的推導過程請參閱其他資料。
2、xgboost
既然xgboost就是一個監督模型,那么我們的第一個問題就是:xgboost對應的模型是什么?
答案就是一堆CART樹。
此時,可能我們又有疑問了,CART樹是什么?這個問題請查閱其他資料,我的博客中也有相關文章涉及過。然后,一堆樹如何做預測呢?答案非常簡單,就是將每棵樹的預測值加到一起作為最終的預測值(本質),可謂簡單粗暴。
下圖就是CART樹和一堆CART樹的示例,用來判斷一個人是否會喜歡計算機游戲:


第二圖的底部說明了如何用一堆CART樹做預測,就是簡單將各個樹的預測分數相加。
xgboost為什么使用CART樹而不是用普通的決策樹呢?(還可以用線性分類器)
簡單講,對於分類問題,由於CART樹的葉子節點對應的值是一個實際的分數,而非一個確定的類別,這將有利於實現高效的優化算法。xgboost出名的原因一是准,二是快,之所以快,其中就有選用CART樹的一份功勞。
知道了xgboost的模型,我們需要用數學來准確地表示這個模型,如下所示:

這里的K就是樹的棵數,F表示所有可能的CART樹,f表示一棵具體的CART樹。這個模型由K棵CART樹組成。模型表示出來后,我們自然而然就想問,這個模型的參數是什么?因為我們知道,“知識”蘊含在參數之中。第二,用來優化這些參數的目標函數又是什么?
我們先來看第二個問題,模型的目標函數,如下所示:

這個目標函數同樣包含兩部分,第一部分就是損失函數,第二部分就是正則項,這里的正則化項由K棵樹的正則化項相加而來,你可能會好奇,一棵樹的正則化項是什么?可暫時保持住你的好奇心,后面會有答案。現在看來,它們都還比較抽象,不要着急,后面會逐一將它們具體化。
3、訓練xgboost
上面,我們獲取了xgboost模型和它的目標函數,那么訓練的任務就是通過最小化目標函數來找到最佳的參數組。
問題是參數在哪里?
我們很自然地想到,xgboost模型由CART樹組成,參數自然存在於每棵CART樹之中。那么,就單一的 CART樹而言,它的參數是什么呢?
根據上面對CART樹的介紹,我們知道,確定一棵CART樹需要確定兩部分,第一部分就是樹的結構,這個結構負責將一個樣本映射到一個確定的葉子節點上,其本質上就是一個函數。第二部分就是各個葉子節點上的分數。
似乎遇到麻煩了,你要說葉子節點的分數作為參數,還是沒問題的,但樹的結構如何作為參數呢?而且我們還不是一棵樹,而是K棵樹!
讓我們想像一下,如果K棵樹的結構都已經確定,那么整個模型剩下的就是所有K棵樹的葉子節點的值,模型的正則化項也可以設為各個葉子節點的值的平方和。此時,整個目標函數其實就是一個K棵樹的所有葉子節點的值的函數,我們就可以使用梯度下降或者隨機梯度下降來優化目標函數。現在這個辦法不靈了,必須另外尋找辦法。
4、加法訓練
所謂加法訓練,本質上是一個元算法,適用於所有的加法模型,它是一種啟發式算法。運用加法訓練,我們的目標不再是直接優化整個目標函數,這已經被我們證明是行不通的。而是分步驟優化目標函數,首先優化第一棵樹,完了之后再優化第二棵樹,直至優化完K棵樹(貪心算法)。整個過程如下圖所示:

在第t步時,我們添加了一棵最優的CART樹f_t,這棵最優的CART樹f_t是怎么得來的呢?非常簡單,就是在現有的t-1棵樹的基礎上,使得目標函數最小的那棵CART樹,如下圖所示:

上圖中的constant就是前t-1棵樹的復雜度,再忍耐一會兒,我們就會知道如何衡量樹的復雜度了,暫時忽略它。
假如我們使用的損失函數時MSE,那么上述表達式會變成這個樣子:

這個式子非常漂亮,因為它含有f_t(x_i)的一次式和二次式,而且一次式項的系數是殘差。你可能好奇,為什么有一次式和二次式就漂亮,因為它會對我們后續的優化提供很多方便,繼續前進你就明白了。
注意:f_t(x_i)是什么?它其實就是f_t的某個葉子節點的值。之前我們提到過,葉子節點的值是可以作為模型的參數的。
但是對於其他的損失函數,我們未必能得出如此漂亮的式子,所以,對於一般的損失函數,我們需要將其作泰勒二階展開,如下所示:

其中:

這里有必要再明確一下,gi和hi的含義。gi怎么理解呢?現有t-1棵樹是不是?這t-1棵樹組成的模型對第i個訓練樣本有一個預測值y^i是不是?這個y^i與第i個樣本的真實標簽yi肯定有差距是不是?這個差距可以用l(yi,y^i)這個損失函數來衡量是不是?現在gi和hi的含義你已經清楚了是不是?(如果不清楚,先鎮定,在第二篇中會講)
如果你還是覺得抽象,我們來看一個具體的例子,假設我們正在優化第11棵CART樹,也就是說前10棵 CART樹已經確定了。這10棵樹對樣本(x_i,y_i=1)的預測值是y^i=-1,假設我們現在是做分類,我們的損失函數是

在y_i=1時,損失函數變成了

我們可以求出這個損失函數對於y^i的梯度,如下所示:

將y^i =-1代入上面的式子,計算得到-0.27。這個-0.27就是g_i。該值是負的,也就是說,如果我們想要減小這10棵樹在該樣本點上的預測損失,我們應該沿着梯度的反方向去走,也就是要增大y^i 的值,使其趨向於正,因為我們的y_i=1就是正的。
來,答一個小問題,在優化第t棵樹時,有多少個gi和hi要計算?嗯,沒錯就是各有N個,N是訓練樣本的數量。如果有10萬樣本,在優化第t棵樹時,就需要計算出個10萬個gi和hi。感覺好像很麻煩是不是?但是你再想一想,這10萬個gi之間是不是沒有啥關系?是不是可以並行計算呢?聰明的你想必再一次感受到了,為什么xgboost會辣么快!
好,現在我們來審視下這個式子,哪些是常量,哪些是變量。式子最后有一個constant項,聰明如你,肯定猜到了,它就是前t-1棵樹的正則化項。l(yi, yi^t-1)也是常數項。剩下的三個變量項分別是第t棵CART樹的一次式,二次式,和整棵樹的正則化項。再次提醒,這里所謂的樹的一次式,二次式,其實都是某個葉子節點的值的一次式,二次式。
我們的目標是讓這個目標函數最小化,常數項顯然沒有什么用,我們把它們去掉,就變成了下面這樣:

好,現在我們可以回答之前的一個問題了,為什么一次式和二次式顯得那么漂亮。因為這些一次式和二次式的系數是gi和hi,而gi和hi可以並行地求出來。而且,gi和hi是不依賴於損失函數的形式的,只要這個損失函數二次可微就可以了。這有什么好處呢?好處就是xgboost可以支持自定義損失函數,只需滿足二次可微即可。強大了我的哥是不是?
5、模型正則化項
上面的式子已然很漂亮,但是,后面的Ω(ft)仍然是雲遮霧罩,不清不楚。現在我們就來定義如何衡量一棵樹的正則化項。這個事兒並沒有一個客觀的標准,可以見仁見智。為此,我們先對CART樹作另一番定義,如下所示:

需要解釋下這個定義,首先,一棵樹有T個葉子節點,這T個葉子節點的值組成了一個T維向量w,q(x)是一個映射,用來將樣本映射成1到T的某個值,也就是把它分到某個葉子節點,q(x)其實就代表了CART樹的結構。w_q(x)自然就是這棵樹對樣本x的預測值了。
有了這個定義,xgboost就使用了如下的正則化項:

注意:這里出現了γ和λ,這是xgboost自己定義的,在使用xgboost時,你可以設定它們的值,顯然,γ越大,表示越希望獲得結構簡單的樹,因為此時對較多葉子節點的樹的懲罰越大。λ越大也是越希望獲得結構簡單的樹。
為什么xgboost要選擇這樣的正則化項?很簡單,好使!效果好才是真的好。
6、見證奇跡的時刻
至此,我們關於第t棵樹的優化目標已然很清晰,下面我們對它做如下變形,請睜大雙眼,集中精力:

這里需要停一停,認真體會下。Ij代表什么?它代表一個集合,集合中每個值代表一個訓練樣本的序號,整個集合就是被第t棵CART樹分到了第j個葉子節點上的訓練樣本。理解了這一點,再看這步轉換,其實就是內外求和順序的改變。如果感覺還有困難,歡迎評論留言。
進一步,我們可以做如下簡化:

其中的Gj和Hj應當是不言自明了。
對於第t棵CART樹的某一個確定的結構(可用q(x)表示),所有的Gj和Hj都是確定的。而且上式中各個葉子節點的值wj之間是互相獨立的。上式其實就是一個簡單的二次式,我們很容易求出各個葉子節點的最佳值以及此時目標函數的值。如下所示:

obj*代表了什么呢?
它表示了這棵樹的結構有多好,值越小,代表這樣結構越好!也就是說,它是衡量第t棵CART樹的結構好壞的標准。注意~注意~注意~,這個值僅僅是用來衡量結構的好壞的,與葉子節點的值可是無關的。為什么?請再仔細看一下obj*的推導過程。obj*只和Gj和Hj和T有關,而它們又只和樹的結構(q(x))有關,與葉子節點的值可是半毛關系沒有。如下圖所示:

Note:這里,我們對w*_j給出一個直覺的解釋,以便能獲得感性的認識。我們假設分到j這個葉子節點上的樣本只有一個。那么,w*_j就變成如下這個樣子:

這個式子告訴我們,w*_j的最佳值就是負的梯度乘以一個權重系數,該系數類似於隨機梯度下降中的學習率。觀察這個權重系數,我們發現,h_j越大,這個系數越小,也就是學習率越小。h_j越大代表什么意思呢?代表在該點附近梯度變化非常劇烈,可能只要一點點的改變,梯度就從10000變到了1,所以,此時,我們在使用反向梯度更新時步子就要小而又小,也就是權重系數要更小。
7、找出最優的樹結構
好了,有了評判樹的結構好壞的標准,我們就可以先求最佳的樹結構,這個定出來后,最佳的葉子結點的值實際上在上面已經求出來了。
問題是:樹的結構近乎無限多,一個一個去測算它們的好壞程度,然后再取最好的顯然是不現實的。所以,我們仍然需要采取一點策略,這就是逐步學習出最佳的樹結構。這與我們將K棵樹的模型分解成一棵一棵樹來學習是一個道理,只不過從一棵一棵樹變成了一層一層節點而已。如果此時你還是有點蒙,沒關系,下面我們就來看一下具體的學習過程。
我們以上文提到過的判斷一個人是否喜歡計算機游戲為例子。最簡單的樹結構就是一個節點的樹。我們可以算出這棵單節點的樹的好壞程度obj*。假設我們現在想按照年齡將這棵單節點樹進行分叉,我們需要知道:
1、按照年齡分是否有效,也就是是否減少了obj的值
2、如果可分,那么以哪個年齡值來分。
為了回答上面兩個問題,我們可以將這一家五口人按照年齡做個排序。如下圖所示:

按照這個圖從左至右掃描,我們就可以找出所有的切分點。對每一個確定的切分點,我們衡量切分好壞的標准如下:

這個Gain實際上就是單節點的obj*減去切分后的兩個節點的樹obj*,Gain如果是正的,並且值越大,表示切分后obj*越小於單節點的obj*,就越值得切分。同時,我們還可以觀察到,Gain的左半部分如果小於右側的γ,則Gain就是負的,表明切分后obj反而變大了。γ在這里實際上是一個臨界值,它的值越大,表示我們對切分后obj下降幅度要求越嚴。這個值也是可以在xgboost中設定的。
掃描結束后,我們就可以確定是否切分,如果切分,對切分出來的兩個節點,遞歸地調用這個切分過程,我們就能獲得一個相對較好的樹結構。
注意:xgboost的切分操作和普通的決策樹切分過程是不一樣的。普通的決策樹在切分的時候並不考慮樹的復雜度,而依賴后續的剪枝操作來控制。xgboost在切分的時候就已經考慮了樹的復雜度,就是那個γ參數。所以,它不需要進行單獨的剪枝操作。
8、大功告成
最優的樹結構找到后,確定最優的葉子節點就很容易了。我們成功地找出了第t棵樹!撒花!!!
第二篇
1、xgboost是什么
全稱:eXtreme Gradient Boosting
作者:陳天奇(華盛頓大學博士)
基礎:GBDT
所屬:boosting迭代型、樹類算法。
適用范圍:分類、回歸
優點:速度快、效果好、能處理大規模數據、支持多種語言、支 持自定義損失函數等等。
缺點:發布時間短(2014),工業領域應用較少,待檢驗
2、基礎知識,GBDT
xgboost是在GBDT的基礎上對boosting算法進行的改進,內部決策樹使用的是回歸樹,簡單回顧GBDT如下:
回歸樹的分裂結點對於平方損失函數,擬合的就是殘差;對於一般損失函數(梯度下降),擬合的就是殘差的近似值,分裂結點划分時枚舉所有特征的值,選取划分點。
最后預測的結果是每棵樹的預測結果相加。
3、xgboost算法原理知識
3.1 定義樹的復雜度
把樹拆分成結構部分q和葉子權重部分w。
樹的復雜度函數和樣例:
定義樹的結構和復雜度的原因很簡單,這樣就可以衡量模型的復雜度了啊,從而可以有效控制過擬合。
3.2 xgboost中的boosting tree模型
和傳統的boosting tree模型一樣,xgboost的提升模型也是采用的殘差(或梯度負方向),不同的是分裂結點選取的時候不一定是最小平方損失。
3.3 對目標函數的改寫
最終的目標函數只依賴於每個數據點的在誤差函數上的一階導數和二階導數。這么寫的原因很明顯,由於之前的目標函數求最優解的過程中只對平方損失函數時候方便求,對於其他的損失函數變得很復雜,通過二階泰勒展開式的變換,這樣求解其他損失函數變得可行了。很贊!
當定義了分裂候選集合的時候,可以進一步改目標函數。分裂結點的候選響集是很關鍵的一步,這是xgboost速度快的保證,怎么選出來這個集合,后面會介紹。
求解:
3.4 樹結構的打分函數
Obj代表了當指定一個樹的結構的時候,在目標上面最多減少多少。(structure score)
對於每一次嘗試去對已有的葉子加入一個分割
這樣就可以在建樹的過程中動態的選擇是否要添加一個結點。
假設要枚舉所有x < a 這樣的條件,對於某個特定的分割a,要計算a左邊和右邊的導數和。對於所有的a,我們只要做一遍從左到右的掃描就可以枚舉出所有分割的梯度和GL、GR。然后用上面的公式計算每個分割方案的分數就可以了。
3.5 尋找分裂結點的候選集
1、暴力枚舉
2、近似方法 ,近似方法通過特征的分布,按照百分比確定一組候選分裂點,通過遍歷所有的候選分裂點來找到最佳分裂點。
兩種策略:全局策略和局部策略。在全局策略中,對每一個特征確定一個全局的候選分裂點集合,就不再改變;而在局部策略中,每一次分裂 都要重選一次分裂點。前者需要較大的分裂集合,后者可以小一點。對比補充候選集策略與分裂點數目對模型的影響。 全局策略需要更細的分裂點才能和局部策略差不多
3、Weighted Quantile Sketch
陳天奇提出並從概率角度證明了一種帶權重的分布式的Quantile Sketch。
4、xgboost的改進點總結
1、目標函數通過二階泰勒展開式做近似
2、定義了樹的復雜度,並應用到目標函數中
3、分裂結點處通過結構打分和分割損失動態生長
4、分裂結點的候選集合通過一種分布式Quantile Sketch得到
5、可以處理稀疏、缺失數據
6、可以通過特征的列采樣防止過擬合
5、參數
xgboost 有很多可調參數,具有極大的自定義靈活性。比如說:
(1)objective [ default=reg:linear ] 定義學習任務及相應的學習目標,可選的目標函數如下:
“reg:linear” –線性回歸。
“reg:logistic” –邏輯回歸。
“binary:logistic” –二分類的邏輯回歸問題,輸出為概率。
“multi:softmax” –處理多分類問題,同時需要設置參數num_class(類別個數)
(2)’eval_metric’ The choices are listed below,評估指標:
“rmse”: root mean square error
“logloss”: negative log-likelihood
(3)max_depth [default=6] 數的最大深度。缺省值為6 ,取值范圍為:[1,∞]
下面得代碼並不可運行,只是為了有助於理解xgboost得使用
1 #xgboost模型調參、訓練 2 #導入相關庫,讀取數據 3 ''' 4 import numpy as np 5 import pandas as pd 6 import xgboost as xgb 7 from sklearn.cross_validation import tain_test_split 8 9 #記錄程序運行時間 10 import time 11 start_time=time.time() 12 13 #讀入數據 14 train=pd.read_csv("Digit_Recognizer/train.csv") 15 tests=pd.read_csv("Digit_Recognizer/test.csv") 16 ''' 17 18 ''' 19 2、划分數據集 20 用sklearn.cross_validation 進行訓練數據集划分,這里訓練集和交叉驗證集比例為7:3,可以根據自己需要設置 21 train_xy,val=train_test_split(train,test_size=0.3,random_state=1) 22 23 y=train_xy.label 24 x=train_xy.drop(['label'],axis=1) 25 val_y=val.label 26 val_x=val.drop(['label'],axis=1) 27 28 xgb矩陣賦值 29 xgb_val=xgb.DMatrix(val_x,label=val_y) 30 xgb_train=xgb.DMatrix(x,label=y) 31 xgb_test=xgb.DMatrix(tests) 32 ''' 33 34 ''' 35 3、xgboost模型 36 params={ 37 'booster':'gbtree', 38 'objective':'multi:softmax',#多分類的問題 39 'num-class':10,#類別數,與multisoftmax 並用 40 'gamma':0.1,#用於控制是否后剪枝的參數,越大越保守,一般0.1、0.2這樣子 41 'max_depth':12,#構建樹的深度,越大越容易過擬合 42 'lambda':2,#控制模型復雜度的權重值的L2正則化項參數,參數越大,模型越不容易過擬合 43 'subsample':0.7,#隨機采樣訓練樣本 44 'colsample_bytree':0.7,#生成樹時進行的列采樣 45 'min_child_weight':3, 46 這個參數默認是1,是每個葉子里面h的和至少是多少,對正負樣本不均衡時的0-1分類而言 47 假設h在0.01附近,min_child_weight為1意味着葉子節點中最少需要包含100個樣本 48 這個參數非常影響結果,控制葉子節點中二階導的和的最小值,該參數值越小,越容易overfitting。 49 'slient':0,#設置成1則沒有運行信息輸出,最好設置成0 50 'eta':0.007,#如同學習率 51 'seed':1000, 52 'nthread':7,#cpu線程數 53 #'eval_meyric':'auc' 54 } 55 plst=list(params.items()) 56 num_rounds=5000 #迭代次數 57 watchlist=[(xgb_train,'train'),(xgb_val,'val')] 58 59 訓練模型並保存 60 #early_stopping_rounnds 當設置的迭代次數較大時, 61 early_stopping_rounds可在一定的迭代次數內准確率沒有提升就停止訓練 62 model=xgb.train(plst,xgb_train,num_rounds,watchlist,early_stopping_rounds=100) 63 model.save_model('./model/xgb.model')#用於存儲訓練出的模型 64 print('best best_ntree_limit',model.best_ntree_limit) 65 ''' 66 67 ''' 68 4、預測並保存 69 preds=model.predict(xgb_test,ntree_limit=model.best_ntree_limit) 70 np.savetxt('xgb_submission.csv',np.c_[range(1,len(tests)+1),preds],delimiter=',', 71 header='ImageId,label',comments='',fmt='%d') 72 73 輸出運行時長 74 cost_time=time.time()-start_time 75 print('xgboost success!','\n','cost time:',costtime,"(s).....") 76 '''