【scikit-learn基础】--『监督学习』之 随机森林回归
隨機森林回歸(Random Forest Regression)是一種在機器學習領域廣泛應用的算法,由美國科學家 Leo Breiman 在2001年提出。
它是一種集成學習方法,通過整合多個決策樹的預測結果來提高預測精度和穩定性。
隨機森林回歸適用于各種需要預測連續數值輸出的問題,
如金融領域的股票價格預測、客戶信用評分,醫療領域的疾病診斷和藥物發現等。
1. 算法概述
隨機森林回歸算法通過引入隨機性來構建多個決策樹,再通過對這些樹的預測結果進行平均或投票來得出最終的預測結果。
這里的隨機性主要體現在兩個方面:一是訓練樣本的隨機選取,二是在訓練過程中特征的隨機選取。
隨機森林的算法過程并不復雜,主要的步驟如下:
- 從原始訓練集中隨機選擇一部分樣本,構成一個新的子樣本集。這樣可以使得每棵決策樹都在不同的樣本集上進行訓練,增加模型的多樣性。
- 對于每個決策樹的每個節點,在選擇最佳劃分特征時,只考慮隨機選擇的一部分特征。這樣可以防止某些特征對整個模型的影響過大,提高模型的魯棒性。
- 在每個子樣本集上使用某種決策樹算法構建一棵決策樹。決策樹的生長過程中,通常采用遞歸地選擇最佳劃分特征,將數據集劃分為不純度最小的子集。
- 通過上述步驟生成的大量決策樹最終組合成隨機森林。
上面第一,第二步驟中的隨機性就是隨機森林這個名稱的由來。
2. 創建樣本數據
這次的回歸樣本數據,我們用 scikit-learn 自帶的樣本生成器來生成回歸樣本。
關于樣本生成器的內容,可以參考:TODO
from sklearn.datasets import make_regression
# 回歸樣本生成器
X, y = make_regression(n_features=4, n_informative=2)
每個樣本有4個特征。
3. 模型訓練
訓練之前,為了減少算法誤差,先對數據進行標準化處理。
from sklearn import preprocessing as pp
# 數據標準化
X = pp.scale(X)
y = pp.scale(y)
接下來分割訓練集和測試集。
from sklearn.model_selection import train_test_split
# 分割訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)
然后用scikit-learn中的RandomForestRegressor模型來訓練:
from sklearn.ensemble import RandomForestRegressor
# 定義隨機森林回歸模型
reg = RandomForestRegressor(max_depth=2)
# 訓練模型
reg.fit(X_train, y_train)
# 在測試集上進行預測
y_pred = reg.predict(X_test)
RandomForestRegressor的主要參數包括:
- n_estimators:森林中決策樹的數量。默認值為100,表示這是森林中樹木的數量,即基評估器的數量。但是,任何模型都有決策邊界,當n_estimators達到一定的程度之后,隨機森林的精確性往往不再上升或開始波動。同時,n_estimators越大,需要的計算量和內存也越大,訓練的時間也會越來越長。
- max_depth:樹的最大深度。默認是None,與剪枝相關。設置為None時,樹的節點會一直分裂,直到每個葉子都是“純”的,或者葉子中包含于min_samples_split個樣本。可以從3開始嘗試增加,觀察是否應該繼續加大深度。
- min_samples_split:在葉節點處需要的最小樣本數。默認值是2,指定每個內部節點(非葉子節點)包含的最少的樣本數。
- min_samples_leaf:每個葉子結點包含的最少的樣本數。參數的取值除了整數之外,還可以是浮點數。如果參數的值設置過小會導致過擬合,反之就會欠擬合。
- min_weight_fraction_leaf:葉子節點所需要的最小權值。
- max_features:用于限制分枝時考慮的特征個數。超過限制個數的特征都會被舍棄。此參數可以設為整數、浮點數、字符或None,默認為'auto'。
- max_leaf_nodes:最大葉子節點數,整數,默認為None。這個參數通過限制樹的最大葉子數量來防止過擬合,如果設置了一個正整數,則會在建立的最大葉節點內的樹中選擇最優的決策樹。
- min_impurity_decrease:如果分裂指標的減少量大于該值,則進行分裂。
- min_impurity_split:決策樹生長的最小純凈度。默認是0。
最后驗證模型的訓練效果:
from sklearn import metrics
# 在測試集上進行預測
y_pred = reg.predict(X_test)
mse, r2, m_error = 0.0, 0.0, 0.0
y_pred = reg.predict(X_test)
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
m_error = metrics.median_absolute_error(y_test, y_pred)
print("均方誤差:{}".format(mse))
print("復相關系數:{}".format(r2))
print("中位數絕對誤差:{}".format(m_error))
# 運行結果
均方誤差:0.0918182629293023
復相關系數:0.9137032593574914
中位數絕對誤差:0.17199566634564867
從預測的誤差來看,訓練的效果非常好。
有同樣的數據試了下上一篇介紹的決策樹回歸算法,發現還是隨機森林回歸的效果要好一些。
決策數回歸的模型效果:
from sklearn.tree import DecisionTreeRegressor
from sklearn import metrics
# 定義決策樹回歸模型
reg = DecisionTreeRegressor(max_depth=2)
# 訓練模型
reg.fit(X_train, y_train)
# 在測試集上進行預測
y_pred = reg.predict(X_test)
mse, r2, m_error = 0.0, 0.0, 0.0
y_pred = reg.predict(X_test)
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
m_error = metrics.median_absolute_error(y_test, y_pred)
print("均方誤差:{}".format(mse))
print("復相關系數:{}".format(r2))
print("中位數絕對誤差:{}".format(m_error))
# 運行結果
均方誤差:0.1681399575883647
復相關系數:0.8419711956126009
中位數絕對誤差:0.36483491370039456
從運行結果來看,決策樹回歸的誤差比隨機森林回歸要大不少。
4. 總結
隨機森林回歸算法的優勢主要在于可以有效地處理大量的輸入變量,并且可以處理非線性關系和交互作用,
同時 ,由于它是集成學習方法,所以可以有效地減少過擬合和欠擬合的問題,提高預測的準確性。
此外,在訓練過程中,它可以自動進行特征選擇和降維,幫助找到最重要的特征,
還可以處理缺失值和異常值,不需要進行特殊的數據預處理。
然而,隨機森林回歸算法也有一些劣勢,
首先,它的訓練過程相對較慢,尤其是在數據集較大或特征維度較高的情況下;
其次,在某些情況下,它可能過于依賴輸入數據的隨機性,導致預測結果的不穩定。
此外,隨機森林算法在處理那些需要精確控制的問題時可能效果不佳。
總結
以上是生活随笔為你收集整理的【scikit-learn基础】--『监督学习』之 随机森林回归的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Virmach VPS服务器续费的教程
- 下一篇: 在linux系统下apache的默认安装