決策樹學習——回歸樹


  回歸樹也是一種決策樹,不過它處理的數據標簽不是屬於分類的,也就是說它的標簽是一個連續隨機的值,比如說對一個城市的房價的預測,每個月的房價都是隨機波動的值,不像分類任務,要將所有數據根據標簽進行分類。

重要參數、屬性、接口

criterion:回歸樹衡量分枝質量的指標,支持的標准有三種:

1)輸入"mse"使用均方誤差mean squared error(MSE),父節點和葉子節點之間的均方誤差的差額將被用來作為 特征選擇的標准,這種方法通過使用葉子節點的均值來最小化L2損失

2)輸入“friedman_mse”使用費爾德曼均方誤差,這種指標使用弗里德曼針對潛在分枝中的問題改進后的均方誤差
3)輸入"mae"使用絕對平均誤差MAE(mean absolute error),這種指標使用葉節點的中值來最小化L1損失

屬性中最重要的依然是feature_importances_,接口依然是apply, fit, predict, score最核心。

  其中N是樣本數量,i是每一個數據樣本,fi是模型回歸出的數值,yi是樣本點i實際的數值標簽。所以MSE的本質, 其實是樣本真實數據與回歸結果的差異。在回歸樹中,MSE不只是我們的分枝質量衡量指標,也是我們最常用的衡量回歸樹回歸質量的指標,當我們在使用交叉驗證,或者其他方式獲取回歸樹的結果時,我們往往選擇均方誤差作為我們的評估(在分類樹中這個指標是score代表的預測准確率)。在回歸中,我們追求的是,MSE越小越好。 然而,回歸樹的接口score默認返回的是R平方,並不是MSE。R平方被定義如下:

 

 

   其中u是殘差平方和(MSE * N),v是總平方和,N是樣本數量,i是每一個數據樣本,fi是模型回歸出的數值,yi 是樣本點i實際的數值標簽。y帽是真實數值標簽的平均數。R平方可以為正為負(如果模型的殘差平方和遠遠大於模型的總平方和,模型非常糟糕,R平方就會為負,所以R平方越接近1越好),而均方誤差永遠為正。 值得一提的是,雖然均方誤差永遠為正,但是sklearn當中使用均方誤差作為評判標准時,卻是計算”負均方誤 差“(neg_mean_squared_error)。這是因為sklearn在計算模型評估指標的時候,會考慮指標本身的性質,均 方誤差本身是一種誤差,所以被sklearn划分為模型的一種損失(loss),因此在sklearn當中,都以負數表示。真正的均方誤差MSE的數值,其實就是neg_mean_squared_error去掉負號的數字。

 

 交叉驗證:

  交叉驗證是用來觀察模型的穩定性的一種方法,我們將數據划分為n份,依次使用其中一份作為測試集,其他n-1份 作為訓練集,多次計算模型的精確性來評估模型的平均准確程度。訓練集和測試集的划分會干擾模型的結果,因此用交叉驗證n次的結果求出的平均值,是對模型效果的一個更好的度量。

from sklearn.datasets import load_boston 
from sklearn.model_selection import cross_val_score  #導入交叉驗證模型
from sklearn.tree import DecisionTreeRegressor

boston = load_boston() 
regressor = DecisionTreeRegressor(random_state=0)
cross_val_score(regressor, boston.data, boston.target, cv=10        
                ,scoring = "neg_mean_squared_error"    #采用負均方根誤差作為評分標准
               )

 

 

10次交叉驗證結果的MSE。

 利用回歸樹擬合正弦波形:

利用python人為生成一組訓練數據X,y。X代表一組正弦函數的橫坐標離散點,y是對應X的函數值,通過人為加入噪聲模擬實際采集的數據,將這組數據放入回歸樹訓練,可以得到擬合的曲線:

import numpy as np 
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt

rng = np.random.RandomState(1)     #隨機數生成種子
X = np.sort(5 * rng.rand(80,1), axis=0) 
   #生成0-5的隨機數並進行排序,(80,1)只是為了數據二維,滿足fit接口的參數要求(數#據必須是二維的)
y = np.sin(X).ravel() 
 #raval用來給y降維,sklearn處理的是單標簽問題,也就是標簽必須是一維的 
y[::5] += 3 * (0.5 - rng.rand(16)) #給y人為的增加噪聲,模擬采集的非理想數據

regr_1 = DecisionTreeRegressor(max_depth=2)  #兩種深度的回歸樹,比較預測結果
regr_2 = DecisionTreeRegressor(max_depth=5) 
regr_1.fit(X, y) 
#fit里面X必須是二維數據,y必須是一維標簽,這就是前面生成X,y時為什么要升維降維操作
regr_2.fit(X, y)

X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis] 
#產生測試數據0-5之間,步長為0,01,[:, np.newaxis]用於升維,測試數據也和X一樣#要變為二維
y_1 = regr_1.predict(X_test) 
y_2 = regr_2.predict(X_test)

plt.figure()
plt.scatter(X, y, s=20, edgecolor="black",c="darkorange", label="data") 
 # s散點的大小,edgecolor邊緣線的顏色,c點填充顏色
plt.plot(X_test, y_1, color="cornflowerblue",label="max_depth=2", linewidth=2)
plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=5", linewidth=2)
plt.xlabel("data") 
plt.ylabel("target") 
plt.title("Decision Tree Regression") 
plt.legend() 
plt.show() 

 

 散點是訓練的數據(模擬采集的散點),可以看到兩種深度的擬合的曲線,顯然深度為5的綠色曲線將噪聲更多的考慮到其中,實際情況中過擬合也就由此誕生,訓練時考慮的噪聲細節比較多,導致擬合的曲線在用於測試集時反而效果不好。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM