1. 输入参数(分类器)
1.1 核心参数
from sklearn.ensemble import RandomForestClassifier # 创建随机森林分类器 rf = RandomForestClassifier( # 必选参数 n_estimators=100, # 树的数量,默认100 # 树的结构控制 max_depth=None, # 树的最大深度,None表示不限 min_samples_split=2, # 节点分裂所需最小样本数 min_samples_leaf=1, # 叶节点所需最小样本数 max_features='sqrt', # 寻找最佳分割时考虑的特征数 # 随机性和采样 bootstrap=True, # 是否使用自助采样 oob_score=False, # 是否使用袋外样本评估 random_state=42, # 随机种子,确保可重复性 # 并行计算 n_jobs=-1, # 并行作业数,-1使用所有CPU核心 verbose=0, # 训练过程详细程度,0不输出 # 其他 warm_start=False, # 是否热启动,增量训练 class_weight=None, # 类别权重,处理不平衡数据 ccp_alpha=0.0, # 复杂度参数,用于剪枝 max_samples=None # 从X抽取的样本数 )1.2 关键参数详解表格
| 参数 | 类型/选项 | 默认值 | 说明 |
|---|---|---|---|
n_estimators | int | 100 | 森林中树的数量,越大性能越好但计算成本增加 |
max_depth | int或None | None | 树的最大深度,None表示节点一直扩展直到所有叶节点纯净 |
min_samples_split | int或float | 2 | 分裂内部节点所需的最小样本数 |
min_samples_leaf | int或float | 1 | 叶节点所需的最小样本数 |
max_features | int/float/'sqrt'/'log2'/'auto' | 'sqrt' | 寻找最佳分割时考虑的特征数 |
bootstrap | bool | True | 是否使用有放回抽样(bootstrap) |
oob_score | bool | False | 是否使用袋外样本估计泛化精度 |
random_state | int/RandomState | None | 控制随机性和可重复性 |
n_jobs | int | None | 并行运行的作业数,-1使用所有处理器 |
verbose | int | 0 | 控制详细程度,0不输出,1偶尔输出,2详细输出 |
2. 输出结果(模型属性)
2.1 训练后可访问的重要属性
# 训练后可以访问的属性 rf.fit(X_train, y_train) # 1. 基础属性 print(f"树的数量: {rf.n_estimators}") # 100 print(f"特征数: {rf.n_features_in_}") # 输入特征数 print(f"类别: {rf.classes_}") # 类别标签数组 # 2. 性能评估 if rf.oob_score: print(f"袋外分数: {rf.oob_score_:.4f}") # 袋外样本准确率 # 3. 特征重要性 print(f"特征重要性: {rf.feature_importances_}") # 数组,长度=特征数 print(f"重要性总和: {rf.feature_importances_.sum():.2f}") # 4. 树的信息 print(f"决策树列表: {rf.estimators_}") # 所有树的列表 print(f"第一棵树: {rf.estimators_[0]}") # 第一棵决策树2.2 模型属性表格
| 属性 | 类型 | 说明 |
|---|---|---|
estimators_ | list | 森林中所有决策树的集合 |
classes_ | array | 分类器知道的类别标签 |
n_classes_ | int | 类别数量 |
n_features_in_ | int | 输入特征的数量 |
feature_importances_ | array | 特征重要性数组 |
oob_score_ | float | 使用袋外估计的训练分数 |
oob_decision_function_ | array | 袋外样本的决策函数 |
3. 主要方法(输入输出)
3.1 训练方法
# fit方法:训练模型 # 输入: # X: 形状 (n_samples, n_features) 的训练数据 # y: 形状 (n_samples,) 的目标值 # sample_weight: 可选,样本权重数组 rf.fit(X_train, y_train)3.2 预测方法
# 1. predict: 预测类别 # 输入: X (n_samples, n_features) # 输出: 预测类别数组 (n_samples,) y_pred = rf.predict(X_test) # 2. predict_proba: 预测概率 # 输入: X (n_samples, n_features) # 输出: 概率数组 (n_samples, n_classes) proba = rf.predict_proba(X_test) # 例如: [[0.1, 0.9], [0.7, 0.3]] 表示两个样本属于各类的概率 # 3. predict_log_proba: 预测对数概率 log_proba = rf.predict_log_proba(X_test) # 4. decision_function: 决策函数值(对于某些分类器) scores = rf.decision_function(X_test)4. 回归器参数(RandomForestRegressor)
from sklearn.ensemble import RandomForestRegressor rf_reg = RandomForestRegressor( # 大部分参数与分类器相同 n_estimators=100, max_depth=None, min_samples_split=2, min_samples_leaf=1, # 回归特有 max_features=1.0, # 回归默认使用所有特征 max_leaf_nodes=None, # 最大叶节点数 # 其他相同 bootstrap=True, oob_score=False, random_state=None, n_jobs=None, verbose=0, warm_start=False )5. 参数选择快速指南
5.1 常用配置模板
# 快速启动(默认配置) rf_default = RandomForestClassifier() # 平衡配置(推荐) rf_balanced = RandomForestClassifier( n_estimators=200, max_depth=15, min_samples_split=5, min_samples_leaf=2, max_features='sqrt', bootstrap=True, oob_score=True, # 免费验证! random_state=42, n_jobs=-1 ) # 高性能配置(更多计算资源) rf_high_performance = RandomForestClassifier( n_estimators=500, max_depth=None, # 不限深度 min_samples_split=2, min_samples_leaf=1, max_features='log2', bootstrap=True, oob_score=True, random_state=42, n_jobs=-1, verbose=1 )5.2 参数影响总结
| 参数 | 增加时的影响 | 何时使用 |
|---|---|---|
n_estimators↑ | 精度↑,方差↓,计算时间↑ | 资源充足时增加(100-500) |
max_depth↑ | 模型复杂度↑,可能过拟合↑ | 数据量大时增加 |
min_samples_split↑ | 防止过拟合,模型更简单 | 数据噪声大时增加 |
min_samples_leaf↑ | 防止过拟合,平滑预测 | 类别不平衡时增加 |
max_features↓ | 多样性↑,计算时间↓ | 特征很多时减少 |
6. 完整使用示例
import numpy as np from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 1. 创建数据 X, y = make_classification(n_samples=1000, n_features=20, random_state=42) # 2. 分割数据 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 3. 创建并训练模型 rf = RandomForestClassifier( n_estimators=100, max_depth=10, min_samples_split=5, min_samples_leaf=2, max_features='sqrt', bootstrap=True, oob_score=True, # 启用袋外评估 random_state=42, n_jobs=-1, verbose=1 ) rf.fit(X_train, y_train) # 4. 查看输出 print("训练完成!") print(f"袋外分数: {rf.oob_score_:.4f}") print(f"特征重要性: {rf.feature_importances_[:5]}...") # 前5个 print(f"类别: {rf.classes_}") print(f"树的数量: {len(rf.estimators_)}") # 5. 预测 y_pred = rf.predict(X_test) y_proba = rf.predict_proba(X_test) print(f"\n测试准确率: {accuracy_score(y_test, y_pred):.4f}") print(f"预测概率形状: {y_proba.shape}") print(f"第一个样本的预测概率: {y_proba[0]}")7. 实用技巧
# 技巧1:快速查看参数 print(rf.get_params()) # 技巧2:设置参数 rf.set_params(n_estimators=200, max_depth=15) # 技巧3:增量训练(热启动) rf_warm = RandomForestClassifier(n_estimators=50, warm_start=True) rf_warm.fit(X_train[:500], y_train[:500]) # 第一阶段 rf_warm.set_params(n_estimators=100) # 增加树 rf_warm.fit(X_train, y_train) # 继续训练 # 技巧4:处理不平衡数据 rf_balanced = RandomForestClassifier( class_weight='balanced', # 自动调整权重 # 或指定权重 # class_weight={0: 1, 1: 10} )记住关键点:输入是数据矩阵X和标签y,输出是预测结果和丰富的模型信息。随机森林的强大之处在于它既能提供准确的预测,又能提供可解释的洞察(如特征重要性)。
框图核心要点解读
任务选择:首先根据你的问题是分类还是回归,选择对应的类。
核心参数(输入):
n_estimators:森林中树的数量,最重要的参数之一。max_depth:控制单棵树的复杂度,防止过拟合的关键。max_features:控制随机性的核心参数,分类和回归的默认值不同。min_samples_split和min_samples_leaf:控制树生长的停止条件。random_state:固定此值可使每次运行结果一致。n_jobs:利用多核CPU加速训练。
训练方法:调用
.fit()函数,传入训练特征X_train和标签y_train。模型信息(输出属性):
estimators_:你可以查看或访问森林中的每一棵树。feature_importances_:极其重要,用于特征选择和数据解释。oob_score_:一个近乎免费的验证分数,非常实用。
预测方法(输出结果):
.predict():获得最终的预测结果(类别或数值)。.predict_proba()(仅分类):获得预测概率,比单纯标签包含更多信息,可用于计算更复杂的指标(如AUC-ROC)。
一句话总结:设定参数 → 训练(.fit) → 获取信息 → 预测(.predict/.predict_proba),整个过程清晰且功能强大。