随机森林是通过多棵决策树投票完成分类的集成算法,在处理高维、非线性特征的复杂分类任务时表现稳定,不需要过多特征预处理就能得到较好的效果。下面我们将从零开始完成一个完整的随机森林分类任务训练流程。

环境准备与数据加载
首先我们需要准备好依赖的Python库,主要使用sklearn进行模型搭建,pandas处理数据,numpy做数值计算,matplotlib用于结果可视化。如果还没有安装这些库,可以通过pip命令安装。
# 导入所需依赖库 import pandas as pd import numpy as np from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.preprocessing import StandardScaler, LabelEncoder from sklearn.metrics import classification_report, confusion_matrix, accuracy_score import matplotlib.pyplot as plt # 加载示例数据集,这里使用sklearn内置的红酒分类数据集作为演示 from sklearn.datasets import load_wine wine_data = load_wine() X = wine_data.data # 特征矩阵 y = wine_data.target # 标签向量 feature_names = wine_data.feature_names # 特征名称
数据预处理与特征工程
复杂分类任务的数据往往存在特征尺度不一致、存在类别型特征等问题,需要先完成预处理。这里我们的示例数据是数值型且尺度相对统一,主要做训练集和测试集的划分即可。
# 划分训练集和测试集,测试集占比30%
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)
# 对特征做标准化处理,避免不同特征尺度影响模型效果
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
基础随机森林模型训练
先搭建一个默认参数的随机森林模型,快速验证流程是否通顺,得到基准性能。
# 初始化随机森林分类器,使用默认参数
rf_base = RandomForestClassifier(random_state=42)
# 训练模型
rf_base.fit(X_train_scaled, y_train)
# 在测试集上做预测
y_pred_base = rf_base.predict(X_test_scaled)
# 输出基础模型的准确率
base_acc = accuracy_score(y_test, y_pred_base)
print(f"基础随机森林模型准确率: {base_acc:.4f}")
模型参数调优
默认参数的模型往往不是最优的,我们可以通过网格搜索调整随机森林的核心参数,提升模型性能。常用的调优参数包括树的数量、树的最大深度、最小样本分裂数等。
# 定义待调优的参数网格
param_grid = {
'n_estimators': [50, 100, 200], # 随机森林中树的数量
'max_depth': [None, 5, 10, 15], # 每棵树的最大深度
'min_samples_split': [2, 5, 10], # 节点分裂所需最小样本数
'min_samples_leaf': [1, 2, 4] # 叶子节点最小样本数
}
# 初始化网格搜索对象,使用5折交叉验证
grid_search = GridSearchCV(
estimator=RandomForestClassifier(random_state=42),
param_grid=param_grid,
cv=5,
scoring='accuracy',
n_jobs=-1
)
# 在训练集上执行网格搜索
grid_search.fit(X_train_scaled, y_train)
# 输出最优参数和最优交叉验证分数
print(f"最优参数: {grid_search.best_params_}")
print(f"最优交叉验证准确率: {grid_search.best_score_:.4f}")
# 获取最优模型
rf_best = grid_search.best_estimator_
模型性能评估
使用最优模型在测试集上做最终评估,输出分类报告、混淆矩阵,分析模型在各个类别上的表现。
# 用最优模型做测试集预测
y_pred_best = rf_best.predict(X_test_scaled)
# 输出分类报告
print("最优模型分类报告:")
print(classification_report(y_test, y_pred_best, target_names=wine_data.target_names))
# 输出混淆矩阵
conf_mat = confusion_matrix(y_test, y_pred_best)
print("混淆矩阵:")
print(conf_mat)
# 计算最终测试集准确率
best_acc = accuracy_score(y_test, y_pred_best)
print(f"最优模型测试集准确率: {best_acc:.4f}")
特征重要性分析
随机森林可以输出每个特征对分类任务的贡献度,帮助我们理解哪些特征对结果影响最大。
# 获取特征重要性得分
feature_importance = rf_best.feature_importances_
# 将特征重要性和特征名称对应,排序后输出
importance_df = pd.DataFrame({
'feature': feature_names,
'importance': feature_importance
}).sort_values(by='importance', ascending=False)
print("特征重要性排序:")
print(importance_df)
# 可视化特征重要性
plt.figure(figsize=(10, 6))
plt.barh(importance_df['feature'], importance_df['importance'])
plt.xlabel('重要性得分')
plt.title('随机森林特征重要性分布')
plt.show()
模型保存与加载
训练好的模型可以保存到本地,后续可以直接加载使用,不需要重新训练。
import joblib
# 保存最优模型到本地文件
joblib.dump(rf_best, 'random_forest_classifier.pkl')
# 加载保存的模型
loaded_model = joblib.load('random_forest_classifier.pkl')
# 验证加载的模型预测结果和原模型一致
loaded_pred = loaded_model.predict(X_test_scaled)
print(f"加载模型预测结果和原模型是否一致: {np.array_equal(y_pred_best, loaded_pred)}")
以上就是使用Python随机森林解决复杂分类任务的完整训练流程,实际任务中可以根据数据特点调整预处理步骤和调优参数,得到更适配业务的模型。