本文目录导读:

我来给你展示一个完整的随机森林分类案例,使用Scikit-learn库。
基础分类案例 - Iris数据集
# 导入必要的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 加载数据
iris = load_iris()
X = iris.data # 特征
y = iris.target # 标签
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
# 创建随机森林模型
rf_model = RandomForestClassifier(
n_estimators=100, # 树的数量
max_depth=5, # 树的最大深度
random_state=42,
n_jobs=-1 # 使用所有CPU核心
)
# 训练模型
rf_model.fit(X_train, y_train)
# 预测
y_pred = rf_model.predict(X_test)
# 评估模型
print("准确率:", accuracy_score(y_test, y_pred))
print("\n分类报告:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
# 特征重要性
feature_importance = pd.DataFrame({
'feature': iris.feature_names,
'importance': rf_model.feature_importances_
})
print("\n特征重要性:")
print(feature_importance.sort_values('importance', ascending=False))
完整实战案例 - 红酒质量分类
# 导入需要的库
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import warnings
warnings.filterwarnings('ignore')
# 1. 创建示例数据(实际项目中可以替换为真实数据)
np.random.seed(42)
n_samples = 1000
# 生成模拟红酒数据
data = pd.DataFrame({
'alcohol': np.random.normal(12, 2, n_samples),
'malic_acid': np.random.normal(2.5, 0.8, n_samples),
'ash': np.random.normal(2.5, 0.5, n_samples),
'alcalinity': np.random.normal(19, 5, n_samples),
'magnesium': np.random.normal(100, 20, n_samples),
'total_phenols': np.random.normal(2.5, 0.6, n_samples),
'flavanoids': np.random.normal(3, 0.8, n_samples),
'nonflavanoid_phenols': np.random.normal(0.3, 0.1, n_samples),
'proanthocyanins': np.random.normal(1.5, 0.5, n_samples),
'color_intensity': np.random.normal(5, 2, n_samples),
'hue': np.random.normal(1, 0.3, n_samples),
'od280': np.random.normal(3, 1, n_samples),
'proline': np.random.normal(800, 200, n_samples)
})
# 生成目标变量(红酒质量等级:0-好,1-中,2-差)
conditions = [
(data['alcohol'] > 12) & (data['total_phenols'] > 2.5),
(data['alcohol'] > 11) & (data['alcohol'] <= 12),
(data['alcohol'] <= 11)
]
choices = [0, 1, 2]
data['quality'] = np.select(conditions, choices, default=1)
# 2. 数据预处理
print("数据形状:", data.shape)
print("\n数据前5行:")
print(data.head())
print("\n目标变量分布:")
print(data['quality'].value_counts())
# 3. 分离特征和标签
X = data.drop('quality', axis=1)
y = data['quality']
# 4. 划分数据
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
print(f"\n训练集大小: {X_train.shape}")
print(f"测试集大小: {X_test.shape}")
# 5. 特征标准化(随机森林不需要,但这里展示完整流程)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 6. 基础随机森林模型
print("\n=== 基础随机森林模型 ===")
rf_basic = RandomForestClassifier(random_state=42)
rf_basic.fit(X_train_scaled, y_train)
# 预测
y_pred_basic = rf_basic.predict(X_test_scaled)
print(f"基础模型准确率: {accuracy_score(y_test, y_pred_basic):.4f}")
# 7. 超参数优化
print("\n=== 超参数优化 ===")
param_grid = {
'n_estimators': [50, 100, 200], # 树的数量
'max_depth': [5, 10, 15, None], # 树的最大深度
'min_samples_split': [2, 5, 10], # 内部节点再划分所需最小样本数
'min_samples_leaf': [1, 2, 4], # 叶子节点最少样本数
'max_features': ['sqrt', 'log2', None] # 寻找最佳分割时考虑的特征数量
}
# 创建网格搜索对象
rf_grid = RandomForestClassifier(random_state=42)
grid_search = GridSearchCV(
estimator=rf_grid,
param_grid=param_grid,
cv=5, # 5折交叉验证
scoring='accuracy',
n_jobs=-1,
verbose=1
)
grid_search.fit(X_train_scaled, y_train)
print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳交叉验证得分: {grid_search.best_score_:.4f}")
# 8. 使用最佳参数训练模型
print("\n=== 优化后的模型 ===")
rf_optimized = grid_search.best_estimator_
# 预测
y_pred_optimized = rf_optimized.predict(X_test_scaled)
# 评估
print(f"优化后模型准确率: {accuracy_score(y_test, y_pred_optimized):.4f}")
print("\n分类报告:")
print(classification_report(y_test, y_pred_optimized,
target_names=['好', '中', '差']))
# 9. 混淆矩阵
print("\n混淆矩阵:")
cm = confusion_matrix(y_test, y_pred_optimized)
print(cm)
# 10. 特征重要性分析
feature_importance = pd.DataFrame({
'feature': X.columns,
'importance': rf_optimized.feature_importances_
})
feature_importance = feature_importance.sort_values('importance', ascending=False)
print("\n特征重要性排名:")
print(feature_importance)
# 11. 可视化
plt.figure(figsize=(12, 5))
# 子图1:特征重要性
plt.subplot(1, 2, 1)
top_features = feature_importance.head(8)
plt.barh(top_features['feature'], top_features['importance'])
plt.xlabel('重要性')'Top 8 特征重要性')
plt.gca().invert_yaxis()
# 子图2:混淆矩阵热力图
plt.subplot(1, 2, 2)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
xticklabels=['好', '中', '差'],
yticklabels=['好', '中', '差'])'混淆矩阵')
plt.ylabel('真实标签')
plt.xlabel('预测标签')
plt.tight_layout()
plt.show()
# 12. 交叉验证评估
print("\n=== 交叉验证评估 ===")
cv_scores = cross_val_score(rf_optimized, X_train_scaled, y_train, cv=5)
print(f"5折交叉验证得分: {cv_scores}")
print(f"平均得分: {cv_scores.mean():.4f} (+/- {cv_scores.std() * 2:.4f})")
回归案例 - 房价预测
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import make_regression
# 生成回归数据
X_reg, y_reg = make_regression(n_samples=500, n_features=10, noise=0.1, random_state=42)
# 划分数据
X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(
X_reg, y_reg, test_size=0.2, random_state=42
)
# 创建随机森林回归模型
rf_regressor = RandomForestRegressor(
n_estimators=100,
max_depth=10,
random_state=42
)
# 训练模型
rf_regressor.fit(X_train_reg, y_train_reg)
# 预测
y_pred_reg = rf_regressor.predict(X_test_reg)
# 评估(使用R²和MSE)
from sklearn.metrics import r2_score, mean_squared_error
print(f"R² 分数: {r2_score(y_test_reg, y_pred_reg):.4f}")
print(f"均方误差 (MSE): {mean_squared_error(y_test_reg, y_pred_reg):.4f}")
随机森林关键参数解释
# 常用参数详解
rf_config = RandomForestClassifier(
# 最重要的参数
n_estimators=100, # 随机森林中决策树的数量(默认100)
max_depth=None, # 树的最大深度,默认None(不限制)
# 防止过拟合的参数
min_samples_split=2, # 内部节点再划分所需最小样本数
min_samples_leaf=1, # 叶子节点最少样本数
max_features='sqrt', # 寻找最佳分割时考虑的特征数量
# 其他参数
bootstrap=True, # 是否采用自助法采样
oob_score=True, # 是否使用袋外样本来评估模型
random_state=42, # 随机种子,确保结果可重复
n_jobs=-1, # 使用的CPU核心数(-1表示全部)
verbose=0 # 控制训练过程中的输出信息
)
实用技巧
# 1. 保存和加载模型
import joblib
# 保存模型
joblib.dump(rf_optimized, 'random_forest_model.pkl')
# 加载模型
loaded_model = joblib.load('random_forest_model.pkl')
# 2. 预测新数据
new_sample = X_test.iloc[0:1] # 取第一行作为新数据
new_sample_scaled = scaler.transform(new_sample)
prediction = loaded_model.predict(new_sample_scaled)
probability = loaded_model.predict_proba(new_sample_scaled)
print(f"预测类别: {prediction}")
print(f"各类别概率: {probability}")
# 3. 查看决策树结构(取第一棵树)
from sklearn.tree import plot_tree
plt.figure(figsize=(20, 10))
plot_tree(rf_optimized.estimators_[0], feature_names=X.columns,
class_names=['好', '中', '差'], filled=True, rounded=True)
plt.show()
使用建议:
- 参数调优顺序:先调整n_estimators,然后调整max_depth和min_samples_leaf
- 特征选择:使用feature_importances_筛选重要特征
- 平衡数据:如果类别不平衡,使用class_weight='balanced'
- 过拟合处理:减小max_depth,增加min_samples_leaf
- 性能优化:使用n_jobs=-1利用多核,n_estimators不要过大(100-500通常足够)
这个案例涵盖了随机森林的主要应用场景和优化方法,实际使用时可以根据具体需求调整参数。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播