大師兄的數(shù)據(jù)分析學(xué)習(xí)筆記(二十四):回歸樹(shù)與提升樹(shù)

大師兄的數(shù)據(jù)分析學(xué)習(xí)筆記(二十三):人工神經(jīng)網(wǎng)絡(luò)
大師兄的數(shù)據(jù)分析學(xué)習(xí)筆記(二十五):聚類(lèi)(一)

一、回歸樹(shù)

  • 回歸樹(shù)決策樹(shù)的一種算法,但回歸的值是連續(xù)值
  • 分類(lèi)樹(shù)不同,回歸樹(shù)的每個(gè)節(jié)點(diǎn)(包括葉子節(jié)點(diǎn)中間節(jié)點(diǎn)),都會(huì)得到預(yù)測(cè)值。
  • 一般這個(gè)預(yù)測(cè)值就是這些連續(xù)標(biāo)注的平均值。
  • 對(duì)特征進(jìn)行分類(lèi),切分屬性的依據(jù)不再是基尼系數(shù),而是最小方差。
  • 也就是說(shuō)在根據(jù)某一個(gè)屬性切分后,必須要滿(mǎn)足兩部分的方差的和是最小的。
  • 之后就可以套用其它特征進(jìn)行同樣的過(guò)程,直到滿(mǎn)足回歸樹(shù)的停止條件。
  • 停止條件可以是剪枝的限制、葉子最大樣本數(shù)量等等。
  • 如果要進(jìn)行預(yù)測(cè),順著回歸樹(shù)的特征到葉子節(jié)點(diǎn),取葉子節(jié)點(diǎn)的平均值作為預(yù)測(cè)值。

二、提升樹(shù)

  • 提升樹(shù)的構(gòu)建基于回歸樹(shù)提升樹(shù)中以梯度提升決策樹(shù)(GBDT)的預(yù)測(cè)效果最好。
  • 梯度提升決策樹(shù)是一種集成方法:
  • 其中第一棵樹(shù)是一個(gè)弱集成器,擬合效果誤差較大。
  • 下一個(gè)棵樹(shù)的標(biāo)簽,是上一棵預(yù)測(cè)后,與原標(biāo)簽的差分值。
  • 重復(fù)第二步直到結(jié)束。
  • 詳細(xì)算法如下:
Setting Loss Function {\partial}L(y_i,f(x_i))/{\partial}f()x_i)
Regression \frac{1}{2}[y_i-f(x_i)]^2 y_i-f(x_i)
Regression y_i-f(x_i) sign[y_i-f(x_i)]
Regression Huber y_i-f(x_i) for |y_i-f(x_i)|\leq\delta_m
\delta_msign[y_i-f(x_i)] for |y_i-f(x_i)|>\delta_m
where \delta_m==\alpha{th}-quantile\{|y_i-f(x_i)|\}
Classification Deviance kth component:I(y_i==G_k)-p_k(x_i)

其中:

  • y_i是實(shí)際值。
  • f(x)_i代表預(yù)設(shè)值,希望預(yù)設(shè)值更小,所以與y_i相減。

三、代碼實(shí)現(xiàn)

>>>import os
>>>import pandas as pd
>>>import numpy as np
>>>from sklearn.model_selection import train_test_split
>>>from sklearn.metrics import  accuracy_score,recall_score,f1_score
>>>from sklearn.ensemble import GradientBoostingClassifier

>>>models = []
>>>models.append(("GBDT",GradientBoostingClassifier(max_depth=6,n_estimators=100)))

>>>df = pd.read_csv(os.path.join(".", "data", "WA_Fn-UseC_-HR-Employee-Attrition.csv"))
>>>X_tt,X_validation,Y_tt,Y_validation = train_test_split(df.JobLevel,df.JobSatisfaction,test_size=0.2)
>>>X_train,X_test,Y_train,Y_test = train_test_split(X_tt,Y_tt,test_size=0.25)

>>>for clf_name,clf in models:
>>>    clf.fit(np.array(X_train).reshape(-1,1),np.array(Y_train).reshape(-1,1))
>>>    xy_lst = [(X_train,Y_train),(X_validation,Y_validation),(X_test,Y_test)]
>>>    for i in range(len(xy_lst)):
>>>        X_part = xy_lst[i][0]
>>>        Y_part = xy_lst[i][1]
>>>        Y_pred = clf.predict(np.array(X_part).reshape(-1,1))
>>>        print(i)
>>>        print(clf_name,"-ACC",accuracy_score(Y_part,Y_pred))
>>>        print(clf_name,"-REC",recall_score(Y_part,Y_pred,average='macro'))
>>>        print(clf_name,"-F1",f1_score(Y_part,Y_pred,average='macro'))
>>>        print("="*40)
0
GBDT -ACC 0.31746031746031744
GBDT -REC 0.25609813587629976
GBDT -F1 0.1933613852394503
========================================
1
GBDT -ACC 0.29931972789115646
GBDT -REC 0.22676837725381413
GBDT -F1 0.173353927942814
========================================
2
GBDT -ACC 0.2925170068027211
GBDT -REC 0.2583216292134831
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容