一篇写的很好的XGBoost的博客(于简书转载)
xgboost的原理沒你想像的那么難
xgboost 已然火爆機(jī)器學(xué)習(xí)圈,相信不少朋友都使用過。要想徹底掌握xgboost,就必須搞懂其內(nèi)部的模型原理。這樣才能將各個參數(shù)對應(yīng)到模型內(nèi)部,進(jìn)而理解參數(shù)的含義,根據(jù)需要進(jìn)行調(diào)參。本文的目的就是讓大家盡可能輕松地理解其內(nèi)部原理。主要參考文獻(xiàn)是陳天奇的這篇文章introduction to xgboost。在我看來,這篇文章是介紹xgboost最好的,沒有之一。英語好的同學(xué)建議直接看英文,若有不是很理解的地方,再來參考本文。
1、你需要提前掌握的幾個知識點(diǎn)
1、監(jiān)督學(xué)習(xí)
監(jiān)督學(xué)習(xí)就是訓(xùn)練數(shù)據(jù)有標(biāo)簽的學(xué)習(xí)。比如說,我有10萬條數(shù)據(jù),每個數(shù)據(jù)有100個特征,還有一個標(biāo)簽。標(biāo)簽的內(nèi)容取決于學(xué)習(xí)的問題,如果數(shù)據(jù)是病人進(jìn)行癌癥診斷做的各項(xiàng)檢查的結(jié)果,標(biāo)簽就是病人是否得癌癥。是為1,不是為0.
監(jiān)督學(xué)習(xí)就是要從這10萬條數(shù)據(jù)中學(xué)習(xí)到根據(jù)檢查結(jié)果診斷病人是否得癌癥的知識。由于學(xué)習(xí)的范圍限定在這10萬條數(shù)據(jù)中,也就是說,學(xué)習(xí)的知識必須是從這10萬條數(shù)據(jù)中提煉出來。形象地理解,就是在這10萬條帶標(biāo)簽數(shù)據(jù)的“監(jiān)督”下進(jìn)行學(xué)習(xí)。因此稱為監(jiān)督學(xué)習(xí)。
2、監(jiān)督學(xué)習(xí)的成果
監(jiān)督學(xué)習(xí)學(xué)習(xí)到的知識如何表示,又是如何被我們?nèi)祟愂褂媚?#xff1f;簡單講,學(xué)習(xí)到的知識用一個模型來表示,我們?nèi)祟惥陀眠@個模型來使用學(xué)習(xí)到的知識。
那么,模型是什么東西?
模型就是一個數(shù)學(xué)表達(dá)式。最簡單的一個模型就是線性模型,它長這個樣子:y^i=∑jθjxij。用我們上面的例子講,xi就是我們10萬條數(shù)據(jù)中的第i條,xij就是第i條數(shù)據(jù)中的第j個檢查結(jié)果。y^i就是模型對這條數(shù)據(jù)的預(yù)測結(jié)果,這個值越大,表明病人得癌癥的概率也大。通常,我們還需將y^i處理成0到1的值,以更清晰地表明這是一個概率預(yù)測,處理的方法一般是用sigmoid函數(shù),不熟悉的朋友可參考其他資料。θj就是第j個檢查結(jié)果對病人是否得癌癥的“貢獻(xiàn)度”,它是我們模型的參數(shù),也就是我們從10條數(shù)據(jù)中學(xué)習(xí)到的知識。
可見,所謂監(jiān)督學(xué)習(xí),就是兩步,一是定出模型確定參數(shù),二是根據(jù)訓(xùn)練數(shù)據(jù)找出最佳的參數(shù)值,所謂最佳,從應(yīng)用角度看,就是最大程度地吸收了10萬條訓(xùn)練數(shù)據(jù)中的知識,但從我們尋找參數(shù)的過程來看,卻有另一番解釋,下文會詳細(xì)解釋,找到最佳參數(shù)后,我們就得出一個參數(shù)都是已知的模型,此時,知識就在其中,我們可以自由使用。
3、如何找出最佳參數(shù)
以上面的線性模型為例,病人有100個檢查結(jié)果,那么就有100個參數(shù)θj(j從1到100)。每個參數(shù)可取值都是實(shí)數(shù),100個參數(shù)的組合顯然有無窮多個,我們怎么評判一組參數(shù)是不是最佳的呢?
此時,我們需要另外一個函數(shù)來幫助我們來確定參數(shù)是否是最佳的,這就是目標(biāo)函數(shù)(object function)。
目標(biāo)函數(shù)如何確定呢?用我們上面的例子來講,我們要判斷病人是否得癌癥,假設(shè)我們對上面的線性模型的值y^i進(jìn)行了處理,將它規(guī)約到了0和1之間。我們的10萬條訓(xùn)練數(shù)據(jù)中,得癌癥的病人標(biāo)簽為1,沒得的標(biāo)簽為0.那么顯然,最佳的參數(shù)一定就是能夠?qū)⒌冒┌Y的病人全預(yù)測為1,沒得癌癥的病人全部預(yù)測為0的參數(shù)。這幾乎就是完美的參數(shù)!
因此,我們的目標(biāo)函數(shù)可以設(shè)為MSE函數(shù):obj = ∑i(sigmoid(∑jθjxij) - yi)^2
上面的函數(shù)的意思就是對第i條數(shù)據(jù),將模型預(yù)測的值規(guī)約到0和1,然后與該條數(shù)據(jù)的真是標(biāo)簽值(0和1)做差,再求平方。這個平方值越大,表明預(yù)測的越不準(zhǔn),就是模型的預(yù)測誤差,最后,我們將模型對10萬條數(shù)據(jù)的預(yù)測誤差求和。就得出了一組具體的參數(shù)的預(yù)測好壞的度量值。
果真這樣就完美了嗎?
不是的。上面的目標(biāo)函數(shù)僅僅評測了參數(shù)對訓(xùn)練數(shù)據(jù)來說的好壞,并沒有評測我們使用模型做預(yù)測時,這組參數(shù)表現(xiàn)好壞。也就是說,對訓(xùn)練數(shù)據(jù)來說是好的參數(shù),未必在預(yù)測時就是好的。為什么?
一是10萬條數(shù)據(jù)中有錯誤存在
二是10萬條數(shù)據(jù)未必涵蓋了所有種類的樣本,舉個極端的例子,假如10萬條數(shù)據(jù)全是60歲以上老人的檢查結(jié)果,我們用學(xué)習(xí)到的模型取預(yù)測一個10歲的小孩,很可能是不準(zhǔn)的。
那么,怎么評測一組參數(shù)是否對預(yù)測是好的呢?
答案是測了才知道!
這不是廢話嗎。
事實(shí)就是這樣。真實(shí)的預(yù)測是最權(quán)威的評判。但我們還是可以有所作為的,那就是正則化。
所謂正則化就是對參數(shù)施加一定的控制,防止參數(shù)走向極端。以上面的例子來說,假如10萬條數(shù)據(jù)中,得癌癥的病人都是60歲以上老人,沒得癌癥的病人都是30歲以下年輕人,檢查結(jié)果中有一項(xiàng)是骨質(zhì)密度,通常,老人骨質(zhì)密度低,年輕人骨質(zhì)密度高。那么我們學(xué)習(xí)到的模型很可能是這樣的,對骨質(zhì)密度這項(xiàng)對應(yīng)的參數(shù)θj設(shè)的非常大,其他的參數(shù)都非常小,簡單講,模型傾向于就用這一項(xiàng)檢查結(jié)果去判斷病人是否得癌癥,因?yàn)檫@樣會讓目標(biāo)函數(shù)最小。
明眼人一看便知,這樣的參數(shù)做預(yù)測肯定是不好的。
正則化可以幫助我們規(guī)避這樣的問題。
常用的正則化就是L2正則,也就是所有參數(shù)的平方和。我們希望這個和盡可能小的同時,模型對訓(xùn)練數(shù)據(jù)有盡可能好的預(yù)測。
最后,我們將L2正則項(xiàng)加到最初的目標(biāo)函數(shù)上,就得出了最終的目標(biāo)函數(shù):
obj = ∑_i(sigmoid(∑_jθjxij) - yi)^2 + ∑j(θj^2)
能使這個函數(shù)值最小的那組參數(shù)就是我們要找的最佳參數(shù)。這個obj包含的兩項(xiàng)分別稱為損失函數(shù)和正則項(xiàng)。
這里的正則項(xiàng),本質(zhì)上是用來控制模型的復(fù)雜度。
Notes:
上面,我們?yōu)榱吮M可能簡單地說明問題,有意忽略了一些重要的方面。比如,我們的例子是分類,但使用的損失函數(shù)卻是MSE,通常是不這樣用的。
對于回歸問題,我們常用的損失函數(shù)是MSE,即:
對于分類問題,我們常用的損失函數(shù)是對數(shù)損失函數(shù):
乍一看,這個損失函數(shù)怪怪的,我們不免要問,為什么這個函數(shù)就是能評判一組參數(shù)對訓(xùn)練數(shù)據(jù)的好壞呢?
我們用上面的例子來說明,假如有一條樣本,它的標(biāo)簽是1,也就是yi = 1,那么關(guān)于這條樣本的損失函數(shù)中就只剩下了左邊那一部分,由于yi = 1,最終的形式就是這樣的:
對數(shù)1.PNG頭上帶一個小尖帽的yi就是我們模型的預(yù)測值,顯然這個值越大,則上面的函數(shù)越傾向于0,yi趨向于無窮大時,損失值為0。這符合我們的要求。
同理,對于yi=0的樣本也可以做出類似的分析。
至于這個損失函數(shù)是怎么推導(dǎo)出來的,有兩個辦法,一個是用LR,一個是用最大熵。具體的推導(dǎo)過程請參閱其他資料。
2、xgboost
既然xgboost就是一個監(jiān)督模型,那么我們的第一個問題就是:xgboost對應(yīng)的模型是什么?
答案就是一堆CART樹。
此時,可能我們又有疑問了,CART樹是什么?這個問題請查閱其他資料,我的博客中也有相關(guān)文章涉及過。然后,一堆樹如何做預(yù)測呢?答案非常簡單,就是將每棵樹的預(yù)測值加到一起作為最終的預(yù)測值,可謂簡單粗暴。
下圖就是CART樹和一堆CART樹的示例,用來判斷一個人是否會喜歡計(jì)算機(jī)游戲:
predict1.PNG predict2.PNG第二圖的底部說明了如何用一堆CART樹做預(yù)測,就是簡單將各個樹的預(yù)測分?jǐn)?shù)相加。
xgboost為什么使用CART樹而不是用普通的決策樹呢?
簡單講,對于分類問題,由于CART樹的葉子節(jié)點(diǎn)對應(yīng)的值是一個實(shí)際的分?jǐn)?shù),而非一個確定的類別,這將有利于實(shí)現(xiàn)高效的優(yōu)化算法。xgboost出名的原因一是準(zhǔn),二是快,之所以快,其中就有選用CART樹的一份功勞。
知道了xgboost的模型,我們需要用數(shù)學(xué)來準(zhǔn)確地表示這個模型,如下所示:
predict3.PNG這里的K就是樹的棵數(shù),F表示所有可能的CART樹,f表示一棵具體的CART樹。這個模型由K棵CART樹組成。模型表示出來后,我們自然而然就想問,這個模型的參數(shù)是什么?因?yàn)槲覀冎?#xff0c;“知識”蘊(yùn)含在參數(shù)之中。第二,用來優(yōu)化這些參數(shù)的目標(biāo)函數(shù)又是什么?
我們先來看第二個問題,模型的目標(biāo)函數(shù),如下所示:
predict4.PNG這個目標(biāo)函數(shù)同樣包含兩部分,第一部分就是損失函數(shù),第二部分就是正則項(xiàng),這里的正則化項(xiàng)由K棵樹的正則化項(xiàng)相加而來,你可能會好奇,一棵樹的正則化項(xiàng)是什么?可暫時保持住你的好奇心,后面會有答案。現(xiàn)在看來,它們都還比較抽象,不要著急,后面會逐一將它們具體化。
3、訓(xùn)練xgboost
上面,我們獲取了xgboost模型和它的目標(biāo)函數(shù),那么訓(xùn)練的任務(wù)就是通過最小化目標(biāo)函數(shù)來找到最佳的參數(shù)組。
問題是參數(shù)在哪里?
我們很自然地想到,xgboost模型由CART樹組成,參數(shù)自然存在于每棵CART樹之中。那么,就單一的 CART樹而言,它的參數(shù)是什么呢?
根據(jù)上面對CART樹的介紹,我們知道,確定一棵CART樹需要確定兩部分,第一部分就是樹的結(jié)構(gòu),這個結(jié)構(gòu)負(fù)責(zé)將一個樣本映射到一個確定的葉子節(jié)點(diǎn)上,其本質(zhì)上就是一個函數(shù)。第二部分就是各個葉子節(jié)點(diǎn)上的分?jǐn)?shù)。
似乎遇到麻煩了,你要說葉子節(jié)點(diǎn)的分?jǐn)?shù)作為參數(shù),還是沒問題的,但樹的結(jié)構(gòu)如何作為參數(shù)呢?而且我們還不是一棵樹,而是K棵樹!
讓我們想像一下,如果K棵樹的結(jié)構(gòu)都已經(jīng)確定,那么整個模型剩下的就是所有K棵樹的葉子節(jié)點(diǎn)的值,模型的正則化項(xiàng)也可以設(shè)為各個葉子節(jié)點(diǎn)的值的平方和。此時,整個目標(biāo)函數(shù)其實(shí)就是一個K棵樹的所有葉子節(jié)點(diǎn)的值的函數(shù),我們就可以使用梯度下降或者隨機(jī)梯度下降來優(yōu)化目標(biāo)函數(shù)。現(xiàn)在這個辦法不靈了,必須另外尋找辦法。
4、加法訓(xùn)練
所謂加法訓(xùn)練,本質(zhì)上是一個元算法,適用于所有的加法模型,它是一種啟發(fā)式算法。關(guān)于這個算法,我的另一篇講GBDT的文章中有詳細(xì)的介紹,這里不再重復(fù),不熟悉的朋友,可以看一下。運(yùn)用加法訓(xùn)練,我們的目標(biāo)不再是直接優(yōu)化整個目標(biāo)函數(shù),這已經(jīng)被我們證明是行不通的。而是分步驟優(yōu)化目標(biāo)函數(shù),首先優(yōu)化第一棵樹,完了之后再優(yōu)化第二棵樹,直至優(yōu)化完K棵樹。整個過程如下圖所示:
predict6.PNG在第t步時,我們添加了一棵最優(yōu)的CART樹ft,這棵最優(yōu)的CART樹ft是怎么得來的呢?非常簡單,就是在現(xiàn)有的t-1棵樹的基礎(chǔ)上,使得目標(biāo)函數(shù)最小的那棵CART樹,如下圖所示:
10.PNG假如我們使用的損失函數(shù)時MSE,那么上述表達(dá)式會變成這個樣子:
11.PNG這個式子非常漂亮,因?yàn)樗衒t(xi)的一次式和二次式,而且一次式項(xiàng)的系數(shù)是殘差。你可能好奇,為什么有一次式和二次式就漂亮,因?yàn)樗鼤ξ覀兒罄m(xù)的優(yōu)化提供很多方便,繼續(xù)前進(jìn)你就明白了。
注意:ft(xi)是什么?它其實(shí)就是ft的某個葉子節(jié)點(diǎn)的值。之前我們提到過,葉子節(jié)點(diǎn)的值是可以作為模型的參數(shù)的。
但是對于其他的損失函數(shù),我們未必能得出如此漂亮的式子,所以,對于一般的損失函數(shù),我們需要將其作泰勒二階展開,如下所示:
12.PNG其中:
13.PNG這里有必要再明確一下,gi和hi的含義。gi怎么理解呢?現(xiàn)有t-1棵樹是不是?這t-1棵樹組成的模型對第i個訓(xùn)練樣本有一個預(yù)測值y^i是不是?這個y^i與第i個樣本的真實(shí)標(biāo)簽yi肯定有差距是不是?這個差距可以用l(yi,y^i)這個損失函數(shù)來衡量是不是?現(xiàn)在gi和hi的含義你已經(jīng)清楚了是不是?
來,答一個小問題,在優(yōu)化第t棵樹時,有多少個gi和hi要計(jì)算?嗯,沒錯就是各有N個,N是訓(xùn)練樣本的數(shù)量。如果有10萬樣本,在優(yōu)化第t棵樹時,就需要計(jì)算出個10萬個gi和hi。感覺好像很麻煩是不是?但是你再想一想,這10萬個gi之間是不是沒有啥關(guān)系?是不是可以并行計(jì)算呢?聰明的你想必再一次感受到了,為什么xgboost會辣么快!
好,現(xiàn)在我們來審視下這個式子,哪些是常量,哪些是變量。式子最后有一個constant項(xiàng),聰明如你,肯定猜到了,它就是前t-1棵樹的正則化項(xiàng)。l(yi, yi^t-1)也是常數(shù)項(xiàng)。剩下的三個變量項(xiàng)分別是第t棵CART樹的一次式,二次式,和整棵樹的正則化項(xiàng)。再次提醒,這里所謂的樹的一次式,二次式,其實(shí)都是某個葉子節(jié)點(diǎn)的值的一次式,二次式。
我們的目標(biāo)是讓這個目標(biāo)函數(shù)最小化,常數(shù)項(xiàng)顯然沒有什么用,我們把它們?nèi)サ?#xff0c;就變成了下面這樣:
14.PNG好,現(xiàn)在我們可以回答之前的一個問題了,為什么一次式和二次式顯得那么漂亮。因?yàn)檫@些一次式和二次式的系數(shù)是gi和hi,而gi和hi可以并行地求出來。而且,gi和hi是不依賴于損失函數(shù)的形式的,只要這個損失函數(shù)二次可微就可以了。這有什么好處呢?好處就是xgboost可以支持自定義損失函數(shù),只需滿足二次可微即可。強(qiáng)大了我的哥是不是?
5、模型正則化項(xiàng)
上面的式子已然很漂亮,但是,后面的Ω(ft)仍然是云遮霧罩,不清不楚。現(xiàn)在我們就來定義如何衡量一棵樹的正則化項(xiàng)。這個事兒并沒有一個客觀的標(biāo)準(zhǔn),可以見仁見智。為此,我們先對CART樹作另一番定義,如下所示:
需要解釋下這個定義,首先,一棵樹有T個葉子節(jié)點(diǎn),這T個葉子節(jié)點(diǎn)的值組成了一個T維向量w,q(x)是一個映射,用來將樣本映射成1到T的某個值,也就是把它分到某個葉子節(jié)點(diǎn),q(x)其實(shí)就代表了CART樹的結(jié)構(gòu)。w_q(x)自然就是這棵樹對樣本x的預(yù)測值了。
有了這個定義,xgboost就使用了如下的正則化項(xiàng):
17.PNG注意:這里出現(xiàn)了γ和λ,這是xgboost自己定義的,在使用xgboost時,你可以設(shè)定它們的值,顯然,γ越大,表示越希望獲得結(jié)構(gòu)簡單的樹,因?yàn)榇藭r對較多葉子節(jié)點(diǎn)的樹的懲罰越大。λ越大也是越希望獲得結(jié)構(gòu)簡單的樹。
為什么xgboost要選擇這樣的正則化項(xiàng)?很簡單,好使!效果好才是真的好。
6、見證奇跡的時刻
至此,我們關(guān)于第t棵樹的優(yōu)化目標(biāo)已然很清晰,下面我們對它做如下變形,請睜大雙眼,集中精力:
18.PNG這里需要停一停,認(rèn)真體會下。Ij代表什么?它代表一個集合,集合中每個值代表一個訓(xùn)練樣本的序號,整個集合就是被第t棵CART樹分到了第j個葉子節(jié)點(diǎn)上的訓(xùn)練樣本。理解了這一點(diǎn),再看這步轉(zhuǎn)換,其實(shí)就是內(nèi)外求和順序的改變。如果感覺還有困難,歡迎評論留言。
進(jìn)一步,我們可以做如下簡化:
19.PNG其中的Gj和Hj應(yīng)當(dāng)是不言自明了。
對于第t棵CART樹的某一個確定的結(jié)構(gòu)(可用q(x)表示),所有的Gj和Hj都是確定的。而且上式中各個葉子節(jié)點(diǎn)的值wj之間是互相獨(dú)立的。上式其實(shí)就是一個簡單的二次式,我們很容易求出各個葉子節(jié)點(diǎn)的最佳值以及此時目標(biāo)函數(shù)的值。如下所示:
20.PNGobj*代表了什么呢?
它表示了這棵樹的結(jié)構(gòu)有多好,值越小,代表這樣結(jié)構(gòu)越好!也就是說,它是衡量第t棵CART樹的結(jié)構(gòu)好壞的標(biāo)準(zhǔn)。注意~注意~注意~,這個值僅僅是用來衡量結(jié)構(gòu)的好壞的,與葉子節(jié)點(diǎn)的值可是無關(guān)的。為什么?請?jiān)僮屑?xì)看一下obj*的推導(dǎo)過程。obj*只和Gj和Hj和T有關(guān),而它們又只和樹的結(jié)構(gòu)(q(x))有關(guān),與葉子節(jié)點(diǎn)的值可是半毛關(guān)系沒有。如下圖所示:
7、找出最優(yōu)的樹結(jié)構(gòu)
好了,有了評判樹的結(jié)構(gòu)好壞的標(biāo)準(zhǔn),我們就可以先求最佳的樹結(jié)構(gòu),這個定出來后,最佳的葉子結(jié)點(diǎn)的值實(shí)際上在上面已經(jīng)求出來了。
問題是:樹的結(jié)構(gòu)近乎無限多,一個一個去測算它們的好壞程度,然后再取最好的顯然是不現(xiàn)實(shí)的。所以,我們?nèi)匀恍枰扇∫稽c(diǎn)策略,這就是逐步學(xué)習(xí)出最佳的樹結(jié)構(gòu)。這與我們將K棵樹的模型分解成一棵一棵樹來學(xué)習(xí)是一個道理,只不過從一棵一棵樹變成了一層一層節(jié)點(diǎn)而已。如果此時你還是有點(diǎn)蒙,沒關(guān)系,下面我們就來看一下具體的學(xué)習(xí)過程。
我們以上文提到過的判斷一個人是否喜歡計(jì)算機(jī)游戲?yàn)槔印W詈唵蔚臉浣Y(jié)構(gòu)就是一個節(jié)點(diǎn)的樹。我們可以算出這棵單節(jié)點(diǎn)的樹的好壞程度obj*。假設(shè)我們現(xiàn)在想按照年齡將這棵單節(jié)點(diǎn)樹進(jìn)行分叉,我們需要知道:
1、按照年齡分是否有效,也就是是否減少了obj的值
2、如果可分,那么以哪個年齡值來分。
為了回答上面兩個問題,我們可以將這一家五口人按照年齡做個排序。如下圖所示:
29.PNG按照這個圖從左至右掃描,我們就可以找出所有的切分點(diǎn)。對每一個確定的切分點(diǎn),我們衡量切分好壞的標(biāo)準(zhǔn)如下:
27.PNG這個Gain實(shí)際上就是單節(jié)點(diǎn)的obj*減去切分后的兩個節(jié)點(diǎn)的樹obj*,Gain如果是正的,并且值越大,表示切分后obj*越小于單節(jié)點(diǎn)的obj*,就越值得切分。同時,我們還可以觀察到,Gain的左半部分如果小于右側(cè)的γ,則Gain就是負(fù)的,表明切分后obj反而變大了。γ在這里實(shí)際上是一個臨界值,它的值越大,表示我們對切分后obj下降幅度要求越嚴(yán)。這個值也是可以在xgboost中設(shè)定的。
掃描結(jié)束后,我們就可以確定是否切分,如果切分,對切分出來的兩個節(jié)點(diǎn),遞歸地調(diào)用這個切分過程,我們就能獲得一個相對較好的樹結(jié)構(gòu)。
注意:xgboost的切分操作和普通的決策樹切分過程是不一樣的。普通的決策樹在切分的時候并不考慮樹的復(fù)雜度,而依賴后續(xù)的剪枝操作來控制。xgboost在切分的時候就已經(jīng)考慮了樹的復(fù)雜度,就是那個γ參數(shù)。所以,它不需要進(jìn)行單獨(dú)的剪枝操作。
8、大功告成
最優(yōu)的樹結(jié)構(gòu)找到后,確定最優(yōu)的葉子節(jié)點(diǎn)就很容易了。我們成功地找出了第t棵樹!撒花!!!
</div><!-- --><div class="show-foot"><a class="notebook" href="/nb/7305482"><i class="iconfont ic-search-notebook"></i><span>機(jī)器學(xué)習(xí)</span></div><div class="modal-wrap" data-report-note=""><a id="report-modal"></a></div></div> </div>
總結(jié)
以上是生活随笔為你收集整理的一篇写的很好的XGBoost的博客(于简书转载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一句话简单总结李航统计学习法各算法
- 下一篇: scikit-learn的主要模块和基本