熱線電話:13121318867

登錄
首頁精彩閱讀集成算法,隨機森林回歸模型
集成算法,隨機森林回歸模型
2021-07-20
收藏

來源:數據STUDIO

作者:云朵君

所有的參數,屬性與接口,全部和隨機森林分類器一致。僅有的不同就是回歸樹與分類樹的不同,不純度的指標, 參數Criterion不一致。

RandomForestRegressor(n_estimators='warn', 
                      criterion='mse', 
                      max_depth=None, 
                      min_samples_split=2, 
                      min_samples_leaf=1, 
                      min_weight_fraction_leaf=0.0, 
                      max_features='auto', 
                      max_leaf_nodes=None, 
                      min_impurity_decrease=0.0, 
                      min_impurity_split=None, 
                      bootstrap=True, 
                      oob_score=False, 
                      n_jobs=None, 
                      random_state=None, 
                      verbose=0, 
                      warm_start=False)

一、重要參數,屬性與接口

criterion

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

  1. 輸入"mse"使用均方誤差mean squared error(MSE),父節點和葉子節點之間的均方誤差的差額將被用來作為特征選擇的標準,這種方法通過使用葉子節點的均值來最小化L2損失。
  2. 輸入"friedman_mse"使用費爾德曼均方誤差,這種指標使用弗里德曼針對潛在分枝中的問題改進后的均方誤差。
  3. 輸入"mae"使用絕對平均誤差MAE(mean absolute error),這種指標使用葉節點的中值來最小化L1損失。

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

然而,回歸樹的接口score返回的是R平方,并不是MSE。此處可參考線性回歸模型評估指標。

最重要的屬性和接口,都與隨機森林的分類器相一致,還是apply, fit, predict和score最為核心。值得一提的是,隨機森林回歸并沒有predict_proba這個接口,因為對于回歸來說,并不存在一個樣本要被分到某個類別的概率問題,因此沒有predict_proba這個接口。

二、例子

from sklearn.datasets import load_boston from sklearn.model_selection import cross_val_score from sklearn.ensemble import RandomForestRegressor
boston = load_boston()
regressor = RandomForestRegressor(n_estimators=100,random_state=0)
cross_val_score(regressor, boston.data, boston.target, cv=10                ,scoring = "neg_mean_squared_error")
sorted(sklearn.metrics.SCORERS.keys())

返回十次交叉驗證的結果,注意在這里,如果不填寫scoring = "neg_mean_squared_error",交叉驗證默認的模型衡量指標是R平方,因此交叉驗證的結果可能有正也可能有負。而如果寫上scoring,則衡量標準是負MSE,交叉驗證的結果只可能為負。

實例:?隨機森林回歸填補缺失值

在之前缺失值處理文章中提到運用隨機森林回歸填補缺失值,我們來看看具體如何操作。

導包

import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_boston from sklearn.impute import SimpleImputer from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import cross_val_score

數據準備

以波?頓數據集為例,導?完整的數據集并探索

dataset = load_boston()
dataset.data.shape #總共506*13=6578個數據 X, y = dataset.data, dataset.target
n_samples = X.shape[0]
n_features = X.shape[1]

生產缺失值

rng = np.random.RandomState(0) missing_rate = 0.5 n_missing_samples = int(np.floor(n_samples * n_features * missing_rate)) #np.floor向下取整,返回.0格式的浮點數 

所有數據要隨機遍布在數據集的各?各列當中,??個缺失的數據會需要?個?索引和?個列索引如果能夠創造?個數組,包含3289個分布在0~506中間的?索引,和3289個分布在0~13之間的列索引,那我們就可以利?索引來為數據中的任意3289個位置賦空值。

我們現在采樣3289個數據,遠遠超過樣本量506,所以使?隨機抽取的函數randint。但如果需要的數據量?于我們的樣本量506,那我們可以采?np.random.choice來抽樣,choice會隨機抽取不重復的隨機數,因此可以幫助我們讓數據更加分散,確保數據不會集中在?些?中。

missing_features_index = rng.randint(0,n_features,n_missing_samples)
missing_samples_index = rng.randint(0,n_samples,n_missing_samples) # missing_samples=rng.choice(dataset.data.shape[0],n_missing_samples,replace=False) X_missing = X.copy()
y_missing = y.copy()
X_missing[missing_samples, missing_features] = np.nan
X_missing = pd.DataFrame(X_missing) # 轉換成DataFrame是為了后續?便各種操作, numpy對矩陣的運算速度快,但是在索引等功能上卻不如pandas來得好? 

然后我們?0,均值和隨機森林來填寫這些缺失值,然后查看回歸的結果如何

#使?均值進?填補 from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')
X_missing_mean = imp_mean.fit_transform(X_missing) #使?0進?填補 imp_0 = SimpleImputer(missing_values=np.nan, strategy="constant",fill_value=0)
X_missing_0 = imp_0.fit_transform(X_missing)

隨機森林填補

<a href='/map/jichengsuanfa/' style='color:#000;font-size:inherit;'>集成算法</a>,<a href='/map/suijisenlin/' style='color:#000;font-size:inherit;'>隨機森林</a>回歸模型

使?隨機森林回歸填補缺失值任何回歸都是從特征矩陣中學習,然后求解連續型標簽y的過程,之所以能夠實現這個過程,是因為回歸算法認為,特征矩陣和標簽之前存在著某種聯系。實際上,標簽和特征是可以相互轉換的,?如說,在?個"?地區,環境,附近學校數量"預測"房價"的問題中,我們既可以?"地區","環境","附近學校數量"的數據來預測"房價",也可以反過來,?"環境","附近學校數量"和"房價"來預測"地區"。?回歸填補缺失值,正是利?了這種思想。

對于?個有n個特征的數據來說,其中特征T有缺失值,我們就把特征T當作標簽,其他的n-1個特征和原本的標簽組成新的特征矩陣。那對于T來說,它沒有缺失的部分,就是我們的Y_test,這部分數據既有標簽也有特征,?它缺失的部分,只有特征沒有標簽,就是我們需要預測的部分。


特征T不缺失的值對應的其他n-1個特征 + 本來的標簽:X_train
特征T不缺失的值:Y_train
特征T缺失的值對應的其他n-1個特征 + 本來的標簽:X_test
特征T缺失的值:未知,我們需要預測的Y_test


這種做法,對于某?個特征?量缺失,其他特征卻很完整的情況,?常適?。

那如果數據中除了特征T之外,其他特征也有缺失值怎么辦?答案是遍歷所有的特征,從缺失最少的開始進?填補(因為填補缺失最少的特征所需要的準確信息最少)。填補?個特征時,先將其他特征缺失值?0代替,每完成?次回歸預測,就將預測值放到原本的特征矩陣中,再繼續填補下?個特征。每?次填補完畢,有缺失值特征會減少?個,所以每次循環后,需要?0來填補的特征就越來越少。當進?到最后?個特征時(這個特征應該是所有特征缺失值最多的),已經沒有任何的其他特征需要?0來進?填補了,?我們已經使?回歸為其他特征填補了?量有效信息,可以?來填補缺失最多的特征。遍歷所有的特征后,數據就完整,不再有缺失值了。

X_missing_reg = X_missing.copy()
sortindex = np.argsort(X_missing_reg.isnull().sum(axis=0)).values
for i in sortindex:
    #構建我們的新特征矩陣和新標簽     df = X_missing_reg
    fillc = df.iloc[:,i]
    df = pd.concat([df.iloc[:,df.columns != i],pd.DataFrame(y_full)],axis=1)
    #在新特征矩陣中,對含有缺失值的列,進?0的填補     df_0 =SimpleImputer(missing_values=np.nan,
    strategy='constant',fill_value=0).fit_transform(df)
    #找出我們的訓練集和測試集     Ytrain = fillc[fillc.notnull()]
    Ytest = fillc[fillc.isnull()]
    Xtrain = df_0[Ytrain.index,:]
    Xtest = df_0[Ytest.index,:]
    #?隨機森林回歸來填補缺失值     rfc = RandomForestRegressor(n_estimators=100)
    rfc = rfc.fit(Xtrain, Ytrain)
    Ypredict = rfc.predict(Xtest)
    #將填補好的特征返回到我們的原始的特征矩陣中     X_missing_reg.loc[X_missing_reg.iloc[:,i].isnull(),i] = Ypredict

建模

#對所有數據進?建模,取得MSE結果 X = [X_full,X_missing_mean,X_missing_0,X_missing_reg] mse = [] std = [] for x in X:
    estimator = RandomForestRegressor(random_state=0, n_estimators=100)
    scores =
    cross_val_score(estimator,x,y_full,scoring='neg_mean_squared_error',
    cv=5).mean()
    mse.append(scores * -1)

可視化

x_labels = ['Full data',
        'Zero Imputation',
      'Mean Imputation',
      'Regressor Imputation']
colors = ['r''g''b''orange']
plt.figure(figsize=(126))
ax = plt.subplot(111) for i in np.arange(len(mse)):
  ax.barh(i, mse[i],color=colors[i], alpha=0.6, align='center')
    
ax.set_title('Imputation Techniques with Boston Data')
ax.set_xlim(left=np.min(mse) * 0.9,right=np.max(mse) * 1.1)
ax.set_yticks(np.arange(len(mse)))
ax.set_xlabel('MSE')
ax.set_yticklabels(x_labels)
plt.show()

三、隨機森林調參

<a href='/map/jichengsuanfa/' style='color:#000;font-size:inherit;'>集成算法</a>,<a href='/map/suijisenlin/' style='color:#000;font-size:inherit;'>隨機森林</a>回歸模型

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢