梯度提升回歸樹是另一種決策樹集成方法髓梅,通過合并多個(gè)決策樹來構(gòu)建一個(gè)更為強(qiáng)大的模型褒脯。雖然名字中含有“回歸”追他,但這個(gè)模型既可以用于回歸也可以用于分類坟募。
與隨機(jī)森林方法不同,梯度提升采用連續(xù)的方式構(gòu)造樹邑狸,每棵樹都試圖糾正前一棵樹的錯(cuò)誤懈糯。默認(rèn)情況下,梯度提升回歸樹中沒有隨機(jī)化单雾,而是用到了強(qiáng)預(yù)剪枝赚哗。梯度提升樹通常使用深度很小(1到 5 之間)的樹她紫,這樣模型占用的內(nèi)存更少,預(yù)測(cè)速度也更快屿储。
梯度提升背后的主要思想是合并許多簡(jiǎn)單的模型犁苏,比如深度較小的樹。每棵樹只能對(duì)部分?jǐn)?shù)據(jù)做出好的預(yù)測(cè)扩所,因此,添加的樹越來越多朴乖,可以不斷迭代提高性能祖屏。
梯度提升樹通常對(duì)參數(shù)設(shè)置更為敏感,正確的設(shè)置參數(shù)买羞,可以將精度提高很多袁勺。除了預(yù)剪枝與集成中樹的數(shù)量之外,梯度提升的另一個(gè)重要參數(shù)是 learning_rate(學(xué)習(xí)率)畜普,它用于控制每棵樹糾正前一棵樹的錯(cuò)誤的強(qiáng)度期丰。較高的學(xué)習(xí)率意味著每棵樹都可以做出較強(qiáng)的修正,這樣模型更為復(fù)雜吃挑。通過增大 n_estimators 來向集成中添加更多樹钝荡,也可以增加模型復(fù)雜度,因?yàn)槟P陀懈鄼C(jī)會(huì)糾正訓(xùn)練集上的錯(cuò)誤舶衬。
例子
利用GradientBoostingClassifier埠通,數(shù)據(jù)用sklearn.datasets中的load_breast_cancer。
第一次逛犹,用默認(rèn)值: 100 棵樹端辱, 最大深度是 3,學(xué)習(xí)率為 0.1虽画。
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, random_state=0)
gbrt = GradientBoostingClassifier(random_state=0)
gbrt.fit(X_train, y_train)
print("Accuracy on training set: {:.3f}".format(gbrt.score(X_train, y_train)))
print("Accuracy on test set: {:.3f}".format(gbrt.score(X_test, y_test)))
結(jié)果:
Accuracy on training set: 1.000
Accuracy on test set: 0.958
訓(xùn)練集精度達(dá)到 100%舞蔽,很可能存在過擬合。為了降低過擬合码撰,我們可以限制最 大深度來加強(qiáng)預(yù)剪枝渗柿,也可以降低學(xué)習(xí)率:
第二次,將最大深度改為1灸拍。
gbrt = GradientBoostingClassifier(random_state=0, max_depth=1)
結(jié)果:
Accuracy on training set: 0.991
Accuracy on test set: 0.972
第三次做祝,降低學(xué)習(xí)率。
gbrt = GradientBoostingClassifier(random_state=0, learning_rate=0.01)
結(jié)果:
Accuracy on training set: 0.988
Accuracy on test set: 0.965
由于梯度提升和隨機(jī)森林兩種方法在類似的數(shù)據(jù)上表現(xiàn)得都很好鸡岗,因此一種常用的方法就是先嘗試隨機(jī)森林混槐,它的魯棒性很好。如果隨機(jī)森林效果很好轩性,但預(yù)測(cè)時(shí)間太長(zhǎng)声登,或者機(jī) 器學(xué)習(xí)模型精度小數(shù)點(diǎn)后第二位的提高也很重要,那么切換成梯度提升通常會(huì)有用。
如果你想要將梯度提升應(yīng)用在大規(guī)模問題上悯嗓,可以研究一下 xgboost 包及其 Python 接口件舵,這個(gè)庫(kù)在許多數(shù)據(jù)集上的速度都比 scikit-learn 對(duì)梯度提升的實(shí)現(xiàn)要快 。
優(yōu)點(diǎn)脯厨、缺點(diǎn)和參數(shù)
梯度提升決策樹是監(jiān)督學(xué)習(xí)中最強(qiáng)大也最常用的模型之一铅祸。
其主要缺點(diǎn)是需要仔細(xì)調(diào)參,而且訓(xùn)練時(shí)間可能會(huì)比較長(zhǎng)合武。與其他基于樹的模型類似临梗,這一算法不需要對(duì)數(shù)據(jù)進(jìn)行縮放就可以表現(xiàn)得很好,而且也適用于二元特征與連續(xù)特征同時(shí)存在的數(shù)據(jù)集稼跳。與其他基于樹的模型相同盟庞,它也通常不適用于高維稀疏數(shù)據(jù)。
梯度提升樹模型的主要參數(shù)包括樹的數(shù)量 n_estimators 和學(xué)習(xí)率 learning_rate汤善,后者用于控制每棵樹對(duì)前一棵樹的錯(cuò)誤的糾正強(qiáng)度什猖。這兩個(gè)參數(shù)高度相關(guān),因?yàn)?learning_ rate 越低红淡,就需要更多的樹來構(gòu)建具有相似復(fù)雜度的模型不狮。
隨機(jī)森林的 n_estimators 值總是越大越好,但梯度提升不同在旱,增大 n_estimators 會(huì)導(dǎo)致模型更加復(fù)雜荤傲,進(jìn)而可能導(dǎo)致過擬合。通常的做法是根據(jù)時(shí)間和內(nèi)存的預(yù)算選擇合適的 n_estimators颈渊,然后對(duì)不同的 learning_rate 進(jìn)行遍歷遂黍。
另一個(gè)重要參數(shù)是 max_depth(或 max_leaf_nodes),用于降低每棵樹的復(fù)雜度俊嗽。梯度提升模型的 max_depth 通常都設(shè)置得很小雾家,一般不超過 5。