随机森林(Random Forest) 是一种基于决策树的集成学习算法,由多个决策树组成的「森林」构成。它通过Bagging(自助法采样)和特征随机选择来提高模型的泛化能力,减少过拟合的可能性。该算法通常在分类问题和回归问题上都能取得良好效果。
Bagging(自助法采样):
在训练过程中,从数据集中有放回地抽取若干样本构建不同的决策树。每棵树只对一部分数据进行训练,使得模型更加稳健。
特征随机选择:
在每棵树的构建过程中,不是使用全部特征,而是随机选择一部分特征用于分裂节点,这进一步增强了模型的多样性。
多数投票和平均:
我们将用Python实现一个随机森林算法解决两个典型问题:分类和回归。代码将采用面向对象的编程思想(OOP),通过类封装模型逻辑。
使用Iris数据集(鸢尾花数据集),其中包含150条记录,每条记录有4个特征,目标是根据花萼和花瓣的尺寸预测其品种(Setosa, Versicolor, Virginica)。
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):
"""初始化随机森林分类器"""
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数据集并拆分为训练集和测试集"""
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):
"""训练模型"""
self.model.fit(X_train, y_train)
def evaluate(self, X_test, y_test):
"""评估模型性能"""
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"分类模型的准确率: {accuracy:.2f}")
IrisRandomForest
类 封装了模型的初始化、数据加载、模型训练和评估流程。RandomForestClassifier
来构建模型。train_test_split
拆分为训练集和测试集,测试集占30%。分类模型的准确率通常在95%以上,证明随机森林对鸢尾花数据的分类性能非常优秀。
我们使用波士顿房价数据集,其中每条记录包含影响房价的多个特征。目标是根据这些特征预测房价。
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):
"""初始化随机森林回归模型"""
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):
"""加载房价数据并拆分为训练集和测试集"""
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):
"""训练模型"""
self.model.fit(X_train, y_train)
def evaluate(self, X_test, y_test):
"""评估模型性能"""
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}")
HousingPricePredictor
类 封装了回归模型的逻辑。fetch_california_housing()
加载房价数据集。均方误差的值通常在0.4-0.6之间,表示模型在回归任务中的预测能力良好。
优点:
缺点:
n_estimators
、max_depth
等参数。feature_importances_
属性识别重要特征。通过本文的分类与回归案例,我们详细展示了如何使用Python实现随机森林算法,并使用面向对象的思想组织代码。随机森林在处理高维数据和复杂问题时具有优异的表现,是一种可靠且常用的机器学习模型。希望这篇文章能帮助你深入理解随机森林算法的工作原理及应用场景。