摘要
? ??隨機(jī)森林回歸是一種集成學(xué)習(xí)算法,通過(guò)組合多個(gè)決策樹(shù)來(lái)實(shí)現(xiàn)回歸任務(wù),構(gòu)建多個(gè)決策樹(shù),并將它們組合成一個(gè)強(qiáng)大的回歸模型。本文將會(huì)從隨機(jī)森林回歸算法的算法原理、Python實(shí)現(xiàn)及實(shí)際應(yīng)用進(jìn)行詳細(xì)說(shuō)明。
1 緒論
? ? 在現(xiàn)在的數(shù)據(jù)分析及數(shù)學(xué)建模等競(jìng)賽中,機(jī)器學(xué)習(xí)算法的使用是很常見(jiàn)的,除了算法實(shí)現(xiàn)還需要對(duì)賽題或自己所獲得的數(shù)據(jù)集進(jìn)行數(shù)據(jù)預(yù)處理工作,本文默認(rèn)讀者的數(shù)據(jù)均已完成數(shù)據(jù)預(yù)處理部分。
2 材料準(zhǔn)備
? ? Python編譯器:PyCharm社區(qū)版或個(gè)人版等
? ? 數(shù)據(jù)集:本文所使用的數(shù)據(jù)集樣例如圖2.1所示,如有需要,請(qǐng)私發(fā)筆者電子郵箱,獲取元數(shù)據(jù)。
圖2.1 數(shù)據(jù)集樣例??
3 算法原理
????????隨機(jī)森林回歸是一種集成學(xué)習(xí)算法,它通過(guò)組合多個(gè)決策樹(shù)來(lái)實(shí)現(xiàn)回歸任務(wù),通過(guò)構(gòu)建多個(gè)決策樹(shù),并將它們組合成一個(gè)強(qiáng)大的回歸模型,具體步驟如下:
????????Step 1:隨機(jī)選擇一個(gè)樣本子集作為該決策樹(shù)的訓(xùn)練集。
????????Step 2:隨機(jī)選擇一部分特征(總特征數(shù)的平方根)作為該決策樹(shù)的特征集。
????????Step 3:基于訓(xùn)練集和特征集構(gòu)建決策樹(shù),直到達(dá)到預(yù)定的葉子節(jié)點(diǎn)數(shù)或無(wú)法分割為止。
????????Step 4:重復(fù)以上步驟,建立多顆決策樹(shù)。
????????Step 5:對(duì)于一個(gè)新的樣本,將它輸入到每棵決策樹(shù)中,得到多個(gè)預(yù)測(cè)結(jié)果。
????????Step 6:對(duì)多個(gè)預(yù)測(cè)結(jié)果進(jìn)行平均,得到最終的預(yù)測(cè)結(jié)果。
????????其算法公式基于決策樹(shù)回歸模型,每個(gè)決策樹(shù)的預(yù)測(cè)函數(shù)可以表示為如公式(1)所示:
????????式中:k表示第k棵決策樹(shù),?表示輸入樣本,
表示第
棵決策樹(shù)的葉子節(jié)點(diǎn)數(shù),
表示第
棵決策樹(shù)第
個(gè)葉子節(jié)點(diǎn)的預(yù)測(cè)值,
表示第棵決策樹(shù)第
葉子節(jié)點(diǎn)的樣本集合。
????????多棵決策樹(shù)的預(yù)測(cè)函數(shù)可以表示為:
??
????????式中:K表示決策樹(shù)的數(shù)量。
?????????在模型評(píng)估上,隨機(jī)森林回歸的常用指標(biāo)包括均方誤差(MSE)和R-squared(R2),一般來(lái)說(shuō),MSE的值越小,說(shuō)明模型對(duì)數(shù)據(jù)的擬合程度越好,R2的值越接近于1,說(shuō)明模型對(duì)數(shù)據(jù)的擬合程度越好,反之亦然。其計(jì)算公式如下:
????????式中,表示樣本數(shù)量,?
表示第?
個(gè)樣本的真實(shí)值,?
表示第?
個(gè)樣本的預(yù)測(cè)值。
????????式中:?表示所有樣本真實(shí)值的平均值。
????????其算法原理示意圖如圖3.1所示:
圖3.1 隨機(jī)森林回歸原理示意圖
?4 算法Python實(shí)現(xiàn)
? 4.1 數(shù)據(jù)加載
? ? ? ? 此處利用pandas庫(kù)進(jìn)行讀取數(shù)據(jù),第一列特征為目標(biāo)變量,其余的列特征作為自變量。
import pandas as pd
# 讀取數(shù)據(jù)
data = pd.read_excel('DataRFL.xlsx')
# 分割自變量和目標(biāo)變量
X = data.iloc[:, 1:]
y = data.iloc[:, 0]
4.2 將數(shù)據(jù)集切分為訓(xùn)練集和測(cè)試集
? ? ? ? 使用train_test_split函數(shù)對(duì)數(shù)據(jù)集進(jìn)行切分,30%作為測(cè)試集,70%作為訓(xùn)練集。
from sklearn.model_selection import train_test_split
# 劃分訓(xùn)練集和測(cè)試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
4.3 利用訓(xùn)練集進(jìn)行模型訓(xùn)練
? ? ? ? 利用70%的樣本數(shù)據(jù)進(jìn)行模型訓(xùn)練,即X_train和y_train,Python有隨機(jī)森林回歸的庫(kù),直接調(diào)用即可,簡(jiǎn)單實(shí)現(xiàn)自己的需求。
from sklearn.ensemble import RandomForestRegressor
# 訓(xùn)練模型
rf = RandomForestRegressor(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
4.4 結(jié)果預(yù)測(cè)
? ? ? ? 本文使用30%測(cè)試集進(jìn)行擬合,后文的擬合效果評(píng)估需要這一步,如果全部數(shù)據(jù)均是訓(xùn)練集,模型的擬合效果是說(shuō)明不了的。
# 預(yù)測(cè)結(jié)果
y_pred = rf.predict(X_test)
4.5 模型評(píng)估
? ? ? ? 機(jī)器學(xué)習(xí)回歸不像是機(jī)器學(xué)習(xí)分類(lèi),機(jī)器學(xué)習(xí)分類(lèi)算法的評(píng)估是通過(guò)準(zhǔn)確率、精確率、召回率和F1-Score去評(píng)估,而回歸算法的評(píng)估因子是通過(guò)均方差MSE和R方值進(jìn)行說(shuō)明的,這兩者的評(píng)估原理和數(shù)值的說(shuō)明如前文所述。
from sklearn.metrics import mean_squared_error, r2_score
# 計(jì)算MSE和R-squared
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
# 輸出模型評(píng)估結(jié)果和目標(biāo)方程
print('MSE:', mse)
print('R-squared:', r2)
4.6 目標(biāo)方程的輸出
? ? ? ? 回歸算法的模型是一條回歸公式,其各特征的系數(shù)由特征重要性所決定。
# 輸出目標(biāo)方程
print("目標(biāo)方程:")
for i, feature in enumerate(X.columns):
print("{} * {} +".format(rf.feature_importances_[i], feature), end=' ')
4.7 繪制特征重要性條形圖
? ? ? ? 有一些題目需要確認(rèn)影響該模型的關(guān)鍵因素或影響某物品的決定因素等,可以通過(guò)各特征在算法的重要性進(jìn)行說(shuō)明。
import matplotlib.pyplot as plt
# 繪制特征重要性條形圖
feature_importance = rf.feature_importances_
feature_names = X.columns.tolist()
sorted_idx = feature_importance.argsort()
#避免中文亂碼
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
plt.barh(range(len(feature_importance)), feature_importance[sorted_idx])
plt.yticks(range(len(feature_importance)), [feature_names[i] for i in sorted_idx],fontsize=5)
plt.xlabel('特征重要性')
plt.ylabel('特征名稱')
plt.title('隨機(jī)森林回歸特征重要性')
plt.savefig('隨機(jī)森林回歸特征重要性',dpi=300)
4.8 結(jié)果輸出
? ? ? ? 控制臺(tái)結(jié)果輸出如圖4.1所示,特征重要性條形圖輸出如圖4.2所示。
?圖4.1 結(jié)果輸出
圖4.3 特征重要性條形圖
?4.9 結(jié)果說(shuō)明
? ? ? ? 在本文的擬合中,MSE為0.87,確實(shí)很小,說(shuō)明模型對(duì)訓(xùn)練集數(shù)據(jù)的擬合效果非常好,但并不一定代表模型的泛化能力強(qiáng),即能夠?qū)π碌奈匆?jiàn)過(guò)的數(shù)據(jù)進(jìn)行準(zhǔn)確預(yù)測(cè)。
????????R2的值是負(fù)值,說(shuō)明模型對(duì)目標(biāo)變量的解釋能力比隨機(jī)猜測(cè)還要差。R-squared的取值范圍是0到1之間,越接近1表示模型對(duì)目標(biāo)變量的解釋能力越強(qiáng),越接近0表示模型對(duì)目標(biāo)變量的解釋能力越弱,而如果是負(fù)數(shù),則說(shuō)明模型的表現(xiàn)不如隨機(jī)猜測(cè)。
? ? ? ? 所以本文所建立的模型是不適用的,應(yīng)該考慮別的算法,或者思考自己的數(shù)據(jù)預(yù)處理是否有問(wèn)題。
4.10 完整代碼實(shí)現(xiàn)
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
# 讀取數(shù)據(jù)
data = pd.read_excel('附件0.2.xlsx')
# 分割自變量和目標(biāo)變量
X = data.iloc[:, 1:]
y = data.iloc[:, 0]
# 劃分訓(xùn)練集和測(cè)試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
# 訓(xùn)練模型
rf = RandomForestRegressor(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
# 預(yù)測(cè)結(jié)果
y_pred = rf.predict(X_test)
# 計(jì)算MSE和R-squared
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
# 輸出模型評(píng)估結(jié)果和目標(biāo)方程
print('MSE:', mse)
print('R-squared:', r2)
# 輸出目標(biāo)方程
print("目標(biāo)方程:")
for i, feature in enumerate(X.columns):
print("{} * {} +".format(rf.feature_importances_[i], feature), end=' ')
# 繪制特征重要性條形圖
feature_importance = rf.feature_importances_
feature_names = X.columns.tolist()
sorted_idx = feature_importance.argsort()
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
plt.barh(range(len(feature_importance)), feature_importance[sorted_idx])
plt.yticks(range(len(feature_importance)), [feature_names[i] for i in sorted_idx],fontsize=5)
plt.xlabel('特征重要性')
plt.ylabel('特征名稱')
plt.title('隨機(jī)森林回歸特征重要性')
plt.savefig('隨機(jī)森林回歸特征重要性',dpi=300)
5 算法應(yīng)用
? ? ? ? 隨機(jī)森林回歸算法可以應(yīng)用于銷(xiāo)售量的預(yù)測(cè)、房?jī)r(jià)的預(yù)測(cè)和股票價(jià)格的預(yù)測(cè)(股市有風(fēng)險(xiǎn),入行需謹(jǐn)慎)等領(lǐng)域,具體可以閱讀相關(guān)領(lǐng)域的文獻(xiàn)。
6 結(jié)論
? ? ? ? 本文對(duì)隨機(jī)森林回歸算法對(duì)原理說(shuō)明、算法的Python實(shí)現(xiàn)及算法應(yīng)用進(jìn)行了簡(jiǎn)要的說(shuō)明,文中給出了一個(gè)擬合效果不佳的模型進(jìn)行示例,待日后有合適的訓(xùn)練數(shù)據(jù)再補(bǔ)充說(shuō)明。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-526345.html
7 備注
? ? ? ? 本文為原創(chuàng)文章,禁止轉(zhuǎn)載,違者必究。如需原始數(shù)據(jù),請(qǐng)點(diǎn)贊+收藏,然后私聊筆者或在評(píng)論區(qū)留下你的郵箱,即可獲取原始數(shù)據(jù)一份。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-526345.html
到了這里,關(guān)于隨機(jī)森林回歸算法的Python實(shí)現(xiàn)與應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!