GBRT-Regression-Demo(超參數(shù)的比較)

import matplotlib.pyplot as plt
import numpy as np
from sklearn import ensemble,datasets,model_selection
def load_data_regression():
    diabetes = datasets.load_diabetes()
    return model_selection.train_test_split(diabetes.data,diabetes.target,test_size=0.3,random_state = 0)  
def test_GradientBoostingRegression(*data):
    X_train,X_test,Y_train,Y_test = data
    regr = ensemble.GradientBoostingRegressor()
    regr.fit(X_train,Y_train)
    print("Training score:%f"%regr.score(X_train,Y_train))
    print("Testing score:%f"%regr.score(X_test,Y_test))
X_train,X_test,Y_train,Y_test = load_data_regression()
test_GradientBoostingRegression(X_train,X_test,Y_train,Y_test)
Training score:0.876188
Testing score:0.275905

考察個體回歸樹的數(shù)量對GBRT的影響

def test_GradientBoostingRegression_estimators_num(*data):
    X_train,X_test,Y_train,Y_test = data
    nums = np.arange(1,100,step=2)
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    train_scores = []
    test_scores = []
    for i,num in enumerate(nums):
        clf = ensemble.GradientBoostingRegressor(n_estimators=num)
        clf.fit(X_train,Y_train)
        train_scores.append(clf.score(X_train,Y_train))
        test_scores.append(clf.score(X_test,Y_test))
    ax.plot(nums,train_scores,label="training score")
    ax.plot(nums,test_scores,label="testing score")
    ax.set_xlabel("estimators num")
    ax.set_ylabel("score")
    ax.legend(loc="lower right")
    ax.set_title("GradientBoostRegression")
plt.show()
X_train,X_test,Y_train,Y_test = load_data_regression()
test_GradientBoostingRegression_estimators_num(X_train,X_test,Y_train,Y_test)
output_6_0.png
運行結(jié)果分析:
  1. 隨著個體回歸樹數(shù)量的增長前塔,GBRT的性能對與訓(xùn)練集一直在提高嚣艇。
  2. 但是對于測試集測試得分先快速上升后基本緩慢下降。

考察個體回歸樹的最大深度對于集成回歸器預(yù)測性能的影響

def test_GradientBoostingRegression_max_depth(*data):
    X_train,X_test,Y_train,Y_test = data
    maxdepths = np.arange(1,20+1)
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    train_scores = []
    test_scores = []
    for i,maxdepth in enumerate(maxdepths):
        clf = ensemble.GradientBoostingRegressor(max_depth=maxdepth,max_leaf_nodes=None)
        clf.fit(X_train,Y_train)
        train_scores.append(clf.score(X_train,Y_train))
        test_scores.append(clf.score(X_test,Y_test))
    ax.plot(maxdepths,train_scores,label="Training score")
    ax.plot(maxdepths,test_scores,label="Testing score")
    ax.set_xlabel("maxdepth num")
    ax.set_ylabel("score")
    ax.legend(loc="lower right")
    ax.set_ylim(-1,1.05)
    ax.set_title("GradientBoostingRegression")
    plt.show()
X_train,X_test,Y_train,Y_test = load_data_regression()
test_GradientBoostingRegression_max_depth(X_train,X_test,Y_train,Y_test)
output_10_0.png
運行結(jié)果分析:
  • 隨著個體回歸樹的最大深度增長华弓,對訓(xùn)練集的擬合越來越好食零,但是對測試集的擬合越來越差,產(chǎn)生了過擬合現(xiàn)象该抒。

考察學(xué)習(xí)率對于GBRT的預(yù)測性能的影響

def test_GradientBoostingRegression_learning_rate(*data):
    X_train,X_test,Y_train,Y_test = data
    learing_rates = np.linspace(0.01,1.0)
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    train_scores = []
    test_scores = []
    for i,learing_rate in enumerate(learing_rates):
        clf = ensemble.GradientBoostingRegressor(learning_rate=learing_rate)
        clf.fit(X_train,Y_train)
        train_scores.append(clf.score(X_train,Y_train))
        test_scores.append(clf.score(X_test,Y_test))
    ax.plot(learing_rates,train_scores,label="Training score")
    ax.plot(learing_rates,test_scores,label="Testing score")
    ax.set_xlabel("learing_rate")
    ax.set_ylabel("score")
    ax.legend(loc="best")
    ax.set_ylim(-1,1.05)
    ax.set_title("GradientBoostingRegression_learning_rate")
plt.show()
X_train,X_test,Y_train,Y_test = load_data_regression()
test_GradientBoostingRegression_learning_rate(X_train,X_test,Y_train,Y_test)
output_14_0.png
運行結(jié)果分析:
  • GBRT對預(yù)測集的預(yù)測得分隨著學(xué)習(xí)率的增長而一直降低

考察subsample的影響

def test_GradientBoostingRegression_subsample(*data):
    X_train,X_test,Y_train,Y_test = data
    subsamples = np.linspace(0.01,1.0)
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    train_scores = []
    test_scores = []
    for i,subsample in enumerate(subsamples):
        clf = ensemble.GradientBoostingRegressor(subsample=subsample,n_estimators=100)
        clf.fit(X_train,Y_train)
        train_scores.append(clf.score(X_train,Y_train))
        test_scores.append(clf.score(X_test,Y_test))
    ax.plot(subsamples,train_scores,label="Training score")
    ax.plot(subsamples,test_scores,label="Testing score")
    ax.set_xlabel("subsample")
    ax.set_ylabel("score")
    ax.legend(loc="best")
    ax.set_ylim(-1,1.05)
    ax.set_title("GradientBoostingRegression_subsample")
plt.show()
X_train,X_test,Y_train,Y_test = load_data_regression()
test_GradientBoostingRegression_subsample(X_train,X_test,Y_train,Y_test)
output_18_0.png
運行結(jié)果分析:
  • 本問題中,subsample對GBRT預(yù)測的影響不大顶燕,主要對GBRT的訓(xùn)練擬合能力起作用凑保。

考察max_features參數(shù)的影響

def test_GradientBoostingRegression_max_features(*data):
    X_train,X_test,Y_train,Y_test = data
    max_features = np.linspace(0.01,1.0)
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    train_scores = []
    test_scores = []
    for i,features in enumerate(max_features):
        clf = ensemble.GradientBoostingRegressor(max_features=features,n_estimators=100)
        clf.fit(X_train,Y_train)
        train_scores.append(clf.score(X_train,Y_train))
        test_scores.append(clf.score(X_test,Y_test))
    ax.plot(max_features,train_scores,label="Training score")
    ax.plot(max_features,test_scores,label="Testing score")
    ax.set_xlabel("max_features")
    ax.set_ylabel("score")
    ax.legend(loc="best")
    ax.set_ylim(0,1.05)
    ax.set_title("GradientBoostingRegression_max_features")
plt.show()
X_train,X_test,Y_train,Y_test = load_data_regression()
test_GradientBoostingRegression_max_features(X_train,X_test,Y_train,Y_test)
output_22_0.png
運行結(jié)果分析:
  • GBRT對于特征集合的選取不是很敏感

考察損失函數(shù)的影響

def test_GradientBoostingRegression_loss(*data):
    X_train,X_test,Y_train,Y_test = data
    fig = plt.figure(figsize=(15,15))
    nums = np.arange(1,200,step=2)
    ###ls:平方損失函數(shù)
    ###lad:絕對值損失函數(shù)
    ###huber:上述兩者的加權(quán)結(jié)合
    losses = ["ls","lad","huber"]
    ax = fig.add_subplot(2,1,1)
    alphas = np.linspace(0.01,1.0,endpoint=False,num=5)
    for alpha in alphas:
        test_scores = []
        train_scores = []
        for num in nums:
            regr = ensemble.GradientBoostingRegressor(n_estimators=num,loss="huber",alpha=alpha)
            regr.fit(X_train,Y_train)
            train_scores.append(regr.score(X_train,Y_train))
            test_scores.append(regr.score(X_test,Y_test))
        ax.plot(nums,train_scores,label="Training score:alpha=%f"%alpha)
        ax.plot(nums,test_scores,label="Testing score:alpha=%f"%alpha)
    ax.set_xlabel("estimator num")
    ax.set_ylabel("score")
    ax.legend(loc="best",framealpha=0.4)
    ax.set_ylim(0,1.05)
    ax.set_title("loss=huber")
    plt.suptitle("GradientBoostRegressor")
    ######繪制ls和lad#######    
    ax = fig.add_subplot(2,1,2)
    for loss in ["ls","lad"]:
        test_scores = []
        train_scores = []
        for num in nums:
            regr = ensemble.GradientBoostingRegressor(n_estimators=num,loss=loss)
            regr.fit(X_train,Y_train)
            train_scores.append(regr.score(X_train,Y_train))
            test_scores.append(regr.score(X_test,Y_test))
        ax.plot(nums,train_scores,label="Training score:loss=%s"%loss)
        ax.plot(nums,test_scores,label="Testing score:loss=%s"%loss)
        ax.set_xlabel("estimator num")
        ax.set_ylabel("score")
        ax.legend(loc="best",framealpha=0.4)
        ax.set_ylim(0,1.05)
        ax.set_title("loss=ls,lad")
        plt.suptitle("GradientBoostRegressor")
    plt.show()
output.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市涌攻,隨后出現(xiàn)的幾起案子欧引,更是在濱河造成了極大的恐慌,老刑警劉巖恳谎,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芝此,死亡現(xiàn)場離奇詭異,居然都是意外死亡因痛,警方通過查閱死者的電腦和手機(jī)婚苹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸵膏,“玉大人膊升,你說我怎么就攤上這事√菲螅” “怎么了廓译?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長债查。 經(jīng)常有香客問我非区,道長,這世上最難降的妖魔是什么盹廷? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任征绸,我火速辦了婚禮,結(jié)果婚禮上俄占,老公的妹妹穿的比我還像新娘歹垫。我一直安慰自己,他們只是感情好颠放,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布排惨。 她就那樣靜靜地躺著,像睡著了一般碰凶。 火紅的嫁衣襯著肌膚如雪暮芭。 梳的紋絲不亂的頭發(fā)上鹿驼,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機(jī)與錄音辕宏,去河邊找鬼畜晰。 笑死,一個胖子當(dāng)著我的面吹牛瑞筐,可吹牛的內(nèi)容都是我干的凄鼻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼聚假,長吁一口氣:“原來是場噩夢啊……” “哼块蚌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起膘格,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤峭范,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瘪贱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纱控,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年菜秦,在試婚紗的時候發(fā)現(xiàn)自己被綠了甜害。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡球昨,死狀恐怖唾那,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情褪尝,我是刑警寧澤闹获,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站河哑,受9級特大地震影響避诽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜璃谨,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一沙庐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧佳吞,春花似錦拱雏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至衷模,卻和暖如春鹊汛,著一層夾襖步出監(jiān)牢的瞬間蒲赂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工刁憋, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留滥嘴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓至耻,卻偏偏與公主長得像若皱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子尘颓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

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