
來(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)
criterion
回歸樹衡量分枝質(zhì)量的指標(biāo),支持的標(biāo)準(zhǔn)有三種
其中是樣本數(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ù)。
在之前缺失值處理文章中提到運(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ǔ)
使?隨機(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=(12, 6))
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()
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫(kù)表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫(kù))處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫(kù)表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問(wèn)題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問(wèn)題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問(wèn)題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過(guò)程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場(chǎng)景中,聚類分析作為 “無(wú)監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡(jiǎn)單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10CDA 數(shù)據(jù)分析師:商業(yè)數(shù)據(jù)分析實(shí)踐的落地者與價(jià)值創(chuàng)造者 商業(yè)數(shù)據(jù)分析的價(jià)值,最終要在 “實(shí)踐” 中體現(xiàn) —— 脫離業(yè)務(wù)場(chǎng)景的分 ...
2025-09-10機(jī)器學(xué)習(xí)解決實(shí)際問(wèn)題的核心關(guān)鍵:從業(yè)務(wù)到落地的全流程解析 在人工智能技術(shù)落地的浪潮中,機(jī)器學(xué)習(xí)作為核心工具,已廣泛應(yīng)用于 ...
2025-09-09SPSS 編碼狀態(tài)區(qū)域中 Unicode 的功能與價(jià)值解析 在 SPSS(Statistical Product and Service Solutions,統(tǒng)計(jì)產(chǎn)品與服務(wù)解決方案 ...
2025-09-09