99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

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

來(lái)源:數(shù)據(jù)STUDIO

作者:云朵君

所有的參數(shù),屬性與接口,全部和隨機(jī)森林分類器一致。僅有的不同就是回歸樹與分類樹的不同,不純度的指標(biāo), 參數(shù)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)

一、重要參數(shù),屬性與接口

criterion

回歸樹衡量分枝質(zhì)量的指標(biāo),支持的標(biāo)準(zhǔn)有三種

  1. 輸入"mse"使用均方誤差mean squared error(MSE),父節(jié)點(diǎn)和葉子節(jié)點(diǎn)之間的均方誤差的差額將被用來(lái)作為特征選擇的標(biāo)準(zhǔn),這種方法通過(guò)使用葉子節(jié)點(diǎn)的均值來(lái)最小化L2損失。
  2. 輸入"friedman_mse"使用費(fèi)爾德曼均方誤差,這種指標(biāo)使用弗里德曼針對(duì)潛在分枝中的問(wèn)題改進(jìn)后的均方誤差。
  3. 輸入"mae"使用絕對(duì)平均誤差MAE(mean absolute error),這種指標(biāo)使用葉節(jié)點(diǎn)的中值來(lái)最小化L1損失。

其中是樣本數(shù)量,i是每一個(gè)數(shù)據(jù)樣本,是模型回歸出的數(shù)值,是樣本點(diǎn)i實(shí)際的數(shù)值標(biāo)簽。所以MSE的本質(zhì)是樣本真實(shí)數(shù)據(jù)與回歸結(jié)果的差異。在回歸樹中,MSE不只是我們的分枝質(zhì)量衡量指標(biāo),也是我們最常用的衡量回歸樹回歸質(zhì)量的指標(biāo),當(dāng)我們?cè)谑褂媒徊骝?yàn)證,或者其他方式獲取回歸樹的結(jié)果時(shí),我們往往選擇均方誤差作為我們的評(píng)估(在分類樹中這個(gè)指標(biāo)是score代表的預(yù)測(cè)準(zhǔn)確率)。在回歸中,我們追求的是,MSE越小越好。

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

最重要的屬性和接口,都與隨機(jī)森林的分類器相一致,還是apply, fit, predict和score最為核心。值得一提的是,隨機(jī)森林回歸并沒(méi)有predict_proba這個(gè)接口,因?yàn)閷?duì)于回歸來(lái)說(shuō),并不存在一個(gè)樣本要被分到某個(gè)類別的概率問(wèn)題,因此沒(méi)有predict_proba這個(gè)接口。

二、例子

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())

返回十次交叉驗(yàn)證的結(jié)果,注意在這里,如果不填寫scoring = "neg_mean_squared_error",交叉驗(yàn)證默認(rèn)的模型衡量指標(biāo)是R平方,因此交叉驗(yàn)證的結(jié)果可能有正也可能有負(fù)。而如果寫上scoring,則衡量標(biāo)準(zhǔn)是負(fù)MSE,交叉驗(yàn)證的結(jié)果只可能為負(fù)。

實(shí)例:?隨機(jī)森林回歸填補(bǔ)缺失值

在之前缺失值處理文章中提到運(yùn)用隨機(jī)森林回歸填補(bǔ)缺失值,我們來(lái)看看具體如何操作。

導(dǎo)包

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

數(shù)據(jù)準(zhǔn)備

以波?頓數(shù)據(jù)集為例,導(dǎo)?完整的數(shù)據(jù)集并探索

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

生產(chǎn)缺失值

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

所有數(shù)據(jù)要隨機(jī)遍布在數(shù)據(jù)集的各?各列當(dāng)中,??個(gè)缺失的數(shù)據(jù)會(huì)需要?個(gè)?索引和?個(gè)列索引如果能夠創(chuàng)造?個(gè)數(shù)組,包含3289個(gè)分布在0~506中間的?索引,和3289個(gè)分布在0~13之間的列索引,那我們就可以利?索引來(lái)為數(shù)據(jù)中的任意3289個(gè)位置賦空值。

我們現(xiàn)在采樣3289個(gè)數(shù)據(jù),遠(yuǎn)遠(yuǎn)超過(guò)樣本量506,所以使?隨機(jī)抽取的函數(shù)randint。但如果需要的數(shù)據(jù)量?于我們的樣本量506,那我們可以采?np.random.choice來(lái)抽樣,choice會(huì)隨機(jī)抽取不重復(fù)的隨機(jī)數(shù),因此可以幫助我們讓數(shù)據(jù)更加分散,確保數(shù)據(jù)不會(huì)集中在?些?中。

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) # 轉(zhuǎn)換成DataFrame是為了后續(xù)?便各種操作, numpy對(duì)矩陣的運(yùn)算速度快,但是在索引等功能上卻不如pandas來(lái)得好? 

然后我們?0,均值和隨機(jī)森林來(lái)填寫這些缺失值,然后查看回歸的結(jié)果如何

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

隨機(jī)森林填補(bǔ)

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

使?隨機(jī)森林回歸填補(bǔ)缺失值任何回歸都是從特征矩陣中學(xué)習(xí),然后求解連續(xù)型標(biāo)簽y的過(guò)程,之所以能夠?qū)崿F(xiàn)這個(gè)過(guò)程,是因?yàn)榛貧w算法認(rèn)為,特征矩陣和標(biāo)簽之前存在著某種聯(lián)系。實(shí)際上,標(biāo)簽和特征是可以相互轉(zhuǎn)換的,?如說(shuō),在?個(gè)"?地區(qū),環(huán)境,附近學(xué)校數(shù)量"預(yù)測(cè)"房?jī)r(jià)"的問(wèn)題中,我們既可以?"地區(qū)","環(huán)境","附近學(xué)校數(shù)量"的數(shù)據(jù)來(lái)預(yù)測(cè)"房?jī)r(jià)",也可以反過(guò)來(lái),?"環(huán)境","附近學(xué)校數(shù)量"和"房?jī)r(jià)"來(lái)預(yù)測(cè)"地區(qū)"。?回歸填補(bǔ)缺失值,正是利?了這種思想。

對(duì)于?個(gè)有n個(gè)特征的數(shù)據(jù)來(lái)說(shuō),其中特征T有缺失值,我們就把特征T當(dāng)作標(biāo)簽,其他的n-1個(gè)特征和原本的標(biāo)簽組成新的特征矩陣。那對(duì)于T來(lái)說(shuō),它沒(méi)有缺失的部分,就是我們的Y_test,這部分?jǐn)?shù)據(jù)既有標(biāo)簽也有特征,?它缺失的部分,只有特征沒(méi)有標(biāo)簽,就是我們需要預(yù)測(cè)的部分。


特征T不缺失的值對(duì)應(yīng)的其他n-1個(gè)特征 + 本來(lái)的標(biāo)簽:X_train
特征T不缺失的值:Y_train
特征T缺失的值對(duì)應(yīng)的其他n-1個(gè)特征 + 本來(lái)的標(biāo)簽:X_test
特征T缺失的值:未知,我們需要預(yù)測(cè)的Y_test


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

那如果數(shù)據(jù)中除了特征T之外,其他特征也有缺失值怎么辦?答案是遍歷所有的特征,從缺失最少的開始進(jìn)?填補(bǔ)(因?yàn)樘钛a(bǔ)缺失最少的特征所需要的準(zhǔn)確信息最少)。填補(bǔ)?個(gè)特征時(shí),先將其他特征缺失值?0代替,每完成?次回歸預(yù)測(cè),就將預(yù)測(cè)值放到原本的特征矩陣中,再繼續(xù)填補(bǔ)下?個(gè)特征。每?次填補(bǔ)完畢,有缺失值特征會(huì)減少?個(gè),所以每次循環(huán)后,需要?0來(lái)填補(bǔ)的特征就越來(lái)越少。當(dāng)進(jìn)?到最后?個(gè)特征時(shí)(這個(gè)特征應(yīng)該是所有特征缺失值最多的),已經(jīng)沒(méi)有任何的其他特征需要?0來(lái)進(jìn)?填補(bǔ)了,?我們已經(jīng)使?回歸為其他特征填補(bǔ)了?量有效信息,可以?來(lái)填補(bǔ)缺失最多的特征。遍歷所有的特征后,數(shù)據(jù)就完整,不再有缺失值了。

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

建模

#對(duì)所有數(shù)據(jù)進(jìn)?建模,取得MSE結(jié)果 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()

三、隨機(jī)森林調(diào)參

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

數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }