Python案例如何用Scikit-learn做随机森林

wen python案例 2

本文目录导读:

Python案例如何用Scikit-learn做随机森林

  1. 基础分类案例 - Iris数据集
  2. 完整实战案例 - 红酒质量分类
  3. 回归案例 - 房价预测
  4. 随机森林关键参数解释
  5. 实用技巧
  6. 使用建议:

我来给你展示一个完整的随机森林分类案例,使用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()

使用建议:

  1. 参数调优顺序:先调整n_estimators,然后调整max_depth和min_samples_leaf
  2. 特征选择:使用feature_importances_筛选重要特征
  3. 平衡数据:如果类别不平衡,使用class_weight='balanced'
  4. 过拟合处理:减小max_depth,增加min_samples_leaf
  5. 性能优化:使用n_jobs=-1利用多核,n_estimators不要过大(100-500通常足够)

这个案例涵盖了随机森林的主要应用场景和优化方法,实际使用时可以根据具体需求调整参数。

抱歉,评论功能暂时关闭!