Python中的隨機(jī)森林算法與實(shí)戰(zhàn)
1、隨機(jī)森林算法概述
隨機(jī)森林(Random Forest) 是一種基于決策樹的集成學(xué)習(xí)算法,由多個(gè)決策樹組成的「森林」構(gòu)成。
它通過(guò)Bagging(自助法采樣)和特征隨機(jī)選擇來(lái)提高模型的泛化能力,減少過(guò)擬合的可能性。
該算法通常在分類問(wèn)題和回歸問(wèn)題上都能取得良好效果。
2、隨機(jī)森林的原理
Bagging(自助法采樣):
- 在訓(xùn)練過(guò)程中,從數(shù)據(jù)集中有放回地抽取若干樣本構(gòu)建不同的決策樹。
- 每棵樹只對(duì)一部分?jǐn)?shù)據(jù)進(jìn)行訓(xùn)練,使得模型更加穩(wěn)健。
特征隨機(jī)選擇:
- 在每棵樹的構(gòu)建過(guò)程中,不是使用全部特征,而是隨機(jī)選擇一部分特征用于分裂節(jié)點(diǎn),這進(jìn)一步增強(qiáng)了模型的多樣性。
多數(shù)投票和平均:
- 對(duì)于分類問(wèn)題:多個(gè)樹的預(yù)測(cè)結(jié)果通過(guò)投票決定最終類別。
- 對(duì)于回歸問(wèn)題:將所有樹的輸出值取平均,作為最終預(yù)測(cè)值。
3、實(shí)現(xiàn)步驟
我們將用Python實(shí)現(xiàn)一個(gè)隨機(jī)森林算法解決兩個(gè)典型問(wèn)題:分類和回歸。
代碼將采用面向?qū)ο蟮木幊趟枷耄∣OP),通過(guò)類封裝模型邏輯。
4、分類案例:使用隨機(jī)森林預(yù)測(cè)鳶尾花品種
4.1 數(shù)據(jù)集介紹
使用Iris數(shù)據(jù)集(鳶尾花數(shù)據(jù)集),其中包含150條記錄,每條記錄有4個(gè)特征,目標(biāo)是根據(jù)花萼和花瓣的尺寸預(yù)測(cè)其品種(Setosa, Versicolor, Virginica)。
4.2 代碼實(shí)現(xiàn)
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.ensemble import RandomForestClassifier
class IrisRandomForest:
def __init__(self, n_estimators=100, max_depth=None, random_state=42):
"""初始化隨機(jī)森林分類器"""
self.n_estimators = n_estimators
self.max_depth = max_depth
self.random_state = random_state
self.model = RandomForestClassifier(
n_estimators=self.n_estimators,
max_depth=self.max_depth,
random_state=self.random_state
)
def load_data(self):
"""加載Iris數(shù)據(jù)集并拆分為訓(xùn)練集和測(cè)試集"""
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
iris.data, iris.target, test_size=0.3, random_state=self.random_state
)
return X_train, X_test, y_train, y_test
def train(self, X_train, y_train):
"""訓(xùn)練模型"""
self.model.fit(X_train, y_train)
def evaluate(self, X_test, y_test):
"""評(píng)估模型性能"""
predictions = self.model.predict(X_test)
accuracy = accuracy_score(y_test, predictions)
return accuracy
if __name__ == "__main__":
rf_classifier = IrisRandomForest(n_estimators=100, max_depth=5)
X_train, X_test, y_train, y_test = rf_classifier.load_data()
rf_classifier.train(X_train, y_train)
accuracy = rf_classifier.evaluate(X_test, y_test)
print(f"分類模型的準(zhǔn)確率: {accuracy:.2f}")4.3 代碼解釋
IrisRandomForest類 封裝了模型的初始化、數(shù)據(jù)加載、模型訓(xùn)練和評(píng)估流程。- 使用Scikit-learn庫(kù)中的
RandomForestClassifier來(lái)構(gòu)建模型。 - 數(shù)據(jù)集通過(guò)
train_test_split拆分為訓(xùn)練集和測(cè)試集,測(cè)試集占30%。 - 模型最終打印出分類準(zhǔn)確率。
4.4 運(yùn)行結(jié)果
分類模型的準(zhǔn)確率通常在95%以上,證明隨機(jī)森林對(duì)鳶尾花數(shù)據(jù)的分類性能非常優(yōu)秀。
5、回歸案例:使用隨機(jī)森林預(yù)測(cè)波士頓房?jī)r(jià)
5.1 數(shù)據(jù)集介紹
我們使用波士頓房?jī)r(jià)數(shù)據(jù)集,其中每條記錄包含影響房?jī)r(jià)的多個(gè)特征。目標(biāo)是根據(jù)這些特征預(yù)測(cè)房?jī)r(jià)。
5.2 代碼實(shí)現(xiàn)
from sklearn.datasets import fetch_california_housing
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
class HousingPricePredictor:
def __init__(self, n_estimators=100, max_depth=None, random_state=42):
"""初始化隨機(jī)森林回歸模型"""
self.n_estimators = n_estimators
self.max_depth = max_depth
self.random_state = random_state
self.model = RandomForestRegressor(
n_estimators=self.n_estimators,
max_depth=self.max_depth,
random_state=self.random_state
)
def load_data(self):
"""加載房?jī)r(jià)數(shù)據(jù)并拆分為訓(xùn)練集和測(cè)試集"""
data = fetch_california_housing()
X_train, X_test, y_train, y_test = train_test_split(
data.data, data.target, test_size=0.3, random_state=self.random_state
)
return X_train, X_test, y_train, y_test
def train(self, X_train, y_train):
"""訓(xùn)練模型"""
self.model.fit(X_train, y_train)
def evaluate(self, X_test, y_test):
"""評(píng)估模型性能"""
predictions = self.model.predict(X_test)
mse = mean_squared_error(y_test, predictions)
return mse
if __name__ == "__main__":
predictor = HousingPricePredictor(n_estimators=100, max_depth=10)
X_train, X_test, y_train, y_test = predictor.load_data()
predictor.train(X_train, y_train)
mse = predictor.evaluate(X_test, y_test)
print(f"回歸模型的均方誤差: {mse:.2f}")5.3 代碼解釋
HousingPricePredictor類 封裝了回歸模型的邏輯。- 使用
fetch_california_housing()加載房?jī)r(jià)數(shù)據(jù)集。 - 模型最終通過(guò)**均方誤差(MSE)**來(lái)評(píng)估性能。
5.4 運(yùn)行結(jié)果
均方誤差的值通常在0.4-0.6之間,表示模型在回歸任務(wù)中的預(yù)測(cè)能力良好。
6、隨機(jī)森林的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 能處理高維數(shù)據(jù)且不會(huì)輕易過(guò)擬合。
- 能有效應(yīng)對(duì)缺失數(shù)據(jù)和非線性特征。
- 對(duì)于分類和回歸任務(wù)都表現(xiàn)良好。
缺點(diǎn):
- 訓(xùn)練速度較慢,計(jì)算資源消耗較大。
- 難以解釋模型的具體決策路徑。
7、改進(jìn)方向
- 超參數(shù)調(diào)優(yōu): 使用網(wǎng)格搜索優(yōu)化
n_estimators、max_depth等參數(shù)。 - 特征重要性分析: 使用模型中的
feature_importances_屬性識(shí)別重要特征。 - 集成多種算法: 將隨機(jī)森林與其他算法(如XGBoost)結(jié)合,構(gòu)建更強(qiáng)大的混合模型。
8、應(yīng)用場(chǎng)景
- 金融風(fēng)控: 隨機(jī)森林可用于信用評(píng)分、欺詐檢測(cè)等任務(wù)。
- 醫(yī)療診斷: 用于預(yù)測(cè)疾病的發(fā)生和病人的治療效果。
- 圖像分類: 在人臉識(shí)別和物體檢測(cè)任務(wù)中表現(xiàn)出色。
總結(jié)
通過(guò)本文的分類與回歸案例,我們?cè)敿?xì)展示了如何使用Python實(shí)現(xiàn)隨機(jī)森林算法,并使用面向?qū)ο蟮乃枷虢M織代碼。
隨機(jī)森林在處理高維數(shù)據(jù)和復(fù)雜問(wèn)題時(shí)具有優(yōu)異的表現(xiàn),是一種可靠且常用的機(jī)器學(xué)習(xí)模型。希望這篇文章能幫助你深入理解隨機(jī)森林算法的工作原理及應(yīng)用場(chǎng)景。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python Django Cookie 簡(jiǎn)單用法解析
這篇文章主要介紹了Python Django Cookie 簡(jiǎn)單用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python使用Reflex構(gòu)建現(xiàn)代Web應(yīng)用的完全指南
這篇文章為大家深入介紹了Reflex框架的設(shè)計(jì)理念,技術(shù)特性,項(xiàng)目結(jié)構(gòu),核心 API,實(shí)際開發(fā)流程以及與其他框架的對(duì)比和部署建議,感興趣的小伙伴可以了解下2025-05-05
Python調(diào)用MySQLdb插入中文亂碼的解決
這篇文章主要介紹了Python調(diào)用MySQLdb插入中文亂碼的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Python qqbot 實(shí)現(xiàn)qq機(jī)器人的示例代碼
這篇文章主要介紹了Python qqbot 實(shí)現(xiàn)qq機(jī)器人的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Python?函數(shù)參數(shù)11個(gè)案例分享
大家好,今天給大家分享一下明哥整理的一篇?Python?參數(shù)的內(nèi)容,內(nèi)容非常的干,全文通過(guò)案例的形式來(lái)理解知識(shí)點(diǎn),自認(rèn)為比網(wǎng)上?80%?的文章講的都要明白,如果你是入門不久的?python?新手,相信本篇文章應(yīng)該對(duì)你會(huì)有不小的幫助,需要的朋友可以參考下2023-02-02
numpy中實(shí)現(xiàn)ndarray數(shù)組返回符合特定條件的索引方法
下面小編就為大家分享一篇numpy中實(shí)現(xiàn)ndarray數(shù)組返回符合特定條件的索引方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
python常用數(shù)據(jù)結(jié)構(gòu)集合詳解
這篇文章主要介紹了python常用數(shù)據(jù)結(jié)構(gòu)集合詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助2022-08-08

