欢迎光临
我们一直在努力

深度学习篇---Scikit-Learn 随机森林输入输出参数详解

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),整个过程清晰且功能强大。

    赞(0)
    未经允许不得转载:171主机测评 » 深度学习篇---Scikit-Learn 随机森林输入输出参数详解
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址