python机器学习——随机森林

随机森林

随机森林(Random Forest)是一种集成学习方法,它通过构建多个决策树并结合它们的预测结果来进行分类或回归。

算法原理:

  1. 决策树(Decision Tree): 随机森林由多个决策树组成。决策树是一种基于树状结构的模型,用于从一个特征空间映射到目标值的过程。在决策树中,每个内部节点表示一个特征或属性,每个分支代表一个可能的特征输出,而每个叶节点代表一个类别或者数值。
  2. Bagging(Bootstrap Aggregating): 随机森林利用自助采样(bootstrap sampling)的方法,从训练集中有放回地抽取若干个样本,用于训练每棵决策树。这样可以保证每棵决策树的训练集略有不同,增加了模型的多样性。
  3. 随机特征选择: 在构建决策树的过程中,每次选择分裂节点时只考虑特征集的一个随机子集。这个过程减少了各个决策树之间的相关性,提高了模型的多样性。
  4. 投票或平均: 在分类问题中,随机森林通过投票的方式确定最终的分类结果;在回归问题中,随机森林通过平均各个决策树的预测值来得到最终的预测结果。

编程中可能用到的名词:

  • n_estimators: 随机森林中决策树的数量。
  • max_features: 每棵树在分裂节点时需要考虑的特征数量。
  • min_samples_split: 内部节点再划分所需的最小样本数。
  • criterion: 用于衡量分裂质量的准则,可以是**“mse”(均方误差)或"mae"(平均绝对误差)**等。

评估方法:

  • 对于分类问题,可以使用准确率(accuracy)、精确率(precision)、召回率(recall)等指标进行评估。
  • 对于回归问题,可以使用均方误差(Mean Squared Error,MSE)、均方根误差(Root Mean Squared Error,RMSE)等指标进行评估。

优缺点:

优点:
  • 随机森林能够处理高维数据,并且不需要对数据进行特征缩放。
  • 处理缺失值和异常值时表现较好。
  • 对于大量数据集,随机森林能够有效地减小过拟合的风险。
  • 能够评估特征的重要性
缺点:
  • 对噪声较大的数据敏感。
  • 不适合处理非常稀有的事件。
  • 在某些情况下,随机森林可能会因为过多的树而导致计算开销较大。

可以使用的场景:

  • 随机森林适用于各种类型的数据,包括分类和回归问题。
  • 适用于大规模数据集和高维数据。
  • 在特征具有不同重要性的情况下表现良好。
  • 通常用于金融、医疗、生物信息学等领域的预测建模。

RandomForestRegressor函数

参数:

  1. n_estimators: 随机森林中决策树的数量。
  2. criterion: 用于衡量分裂质量的准则,可以是"mse"(均方误差)或"mae"(平均绝对误差)。
  3. max_depth: 决策树的最大深度。
  4. min_samples_split: 内部节点再划分所需的最小样本数。
  5. min_samples_leaf: 叶节点最少样本数。
  6. max_features: 寻找最佳分割点时要考虑的特征数量。
  7. n_jobs: 并行处理任务的数量。
  8. random_state: 控制随机性的种子。

确定参数的方法

  1. n_estimators:
    • 通常情况下,增加决策树的数量能够提升模型的性能,但会增加计算成本。开始时可以选择一个合适的初始值(比如 100),然后通过交叉验证等方法来调整。
  2. criterion:
    • 对于分类问题,默认可以选择"gini"或者"entropy"作为衡量分裂质量的准则。在不确定时,可以尝试使用交叉验证来选择最优的准则。
  3. max_depth:
    • 决策树的最大深度可以控制模型的复杂度。开始时可以设置一个较大的值,然后通过验证曲线或者交叉验证来选择合适的深度,以避免过拟合或者欠拟合。
  4. random_state:
    • 这个参数控制随机性,设置了特定的值之后可以保证模型的可重复性。一般来说,可以选择一个固定的种子值,比如 42,以便结果可以被重现。
  5. min_samples_split:
    • 控制一个节点需要分裂所需要的最小样本数,可以通过交叉验证来选择合适的数值。
  6. min_samples_leaf:
    • 叶节点所需的最小样本数,同样可以通过交叉验证来进行选择。
  7. max_features:
    • 控制每棵树在分裂节点时考虑的最大特征数量,可以通过尝试不同的值来进行调整。
  8. n_jobs:
    • 用于指定训练时并行运行的作业数,通常可以设为 -1 表示使用所有可用的 CPU。但是在资源受限的情况下,可以适当调整这个值。

交叉验证

交叉验证是一种评估模型性能和进行参数调优的统计学方法。它通过将数据集划分为训练集和测试集,反复使用数据的不同部分进行训练和测试,以获得可靠的模型性能评估。

常见的交叉验证方法包括 K 折交叉验证(K-fold cross-validation)和留一交叉验证(leave-one-out cross-validation):

  1. K 折交叉验证
    • 将原始数据集分成 K 个子集,其中一个子集被保留作为测试集,其余 K-1 个子集用来训练模型。这个过程重复 K 次,每个子集都有机会成为测试集。最后,计算 K 次评估的平均值作为最终的性能指标。
  2. 留一交叉验证
    • 留一交叉验证是 K 折交叉验证的一个特例,其中 K 等于样本数。对于每一轮,只留下一个样本作为测试集,其余的样本作为训练集。然后计算每次迭代的性能指标,并求平均值。

交叉验证可以帮助我们更充分地利用数据集,降低训练结果对数据划分的依赖性,同时能够更准确地评估模型在未见数据上的泛化能力。在模型选择和调参时,交叉验证也能够帮助我们选择最优的超参数组合,以避免模型在特定数据集上的过拟合或欠拟合。

交叉验证的方法
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV, KFold
from sklearn.datasets import load_diabetes
import numpy as np

# 加载糖尿病数据集

diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target

# 定义参数网格
param_grid = {
    'n_estimators': [100, 200, 300],
    'max_features': [1.0],
    'max_depth' : [10, 20, 30],
    'n_jobs':[-1],
    'criterion' : ['absolute_error', 'squared_error', 'poisson', 'friedman_mse']  # 将 criterion 参数的取值修改为合法选项
}

# 初始化随机森林回归器

rf = RandomForestRegressor()

# 初始化交叉验证方法

kfold = KFold(n_splits=5, shuffle=True, random_state=42)

# 执行网格搜索

grid_search = GridSearchCV(rf, param_grid, cv=kfold, scoring='neg_mean_squared_error')
grid_search.fit(X, y)

# 输出最佳参数和评分

print("最佳参数:", grid_search.best_params_)
print("最佳模型得分:", grid_search.best_score_)

这里采用的是K折交叉验证

这个代码会从我们选择的param_grid中选择最优的参数并且返回,但是这个代码的运行速度极慢,建议一个一个参数的进行测试,不要所有参数一起测试

例子

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.datasets import load_diabetes
import numpy as np

# 加载糖尿病数据集

diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target

# 将数据集划分为训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 定义参数网格

param_grid = {
    'n_estimators': [100, 200, 300],
    'max_features': ['auto', 'sqrt', 'log2'],
    'max_depth' : [10, 20, 30],
    'min_samples_split': [2, 5, 10],
    'min_samples_leaf': [1, 2, 4]
}

# 初始化随机森林回归器

rf = RandomForestRegressor(random_state=42)

# 执行网格搜索

grid_search = GridSearchCV(rf, param_grid, cv=5, scoring='neg_mean_squared_error', n_jobs=-1)
grid_search.fit(X_train, y_train)

# 输出最佳参数

print("最佳参数:", grid_search.best_params_)

# 在测试集上评估模型

best_rf = grid_search.best_estimator_
y_pred = best_rf.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print("在测试集上的均方误差:", mse)
  1. 首先,我们导入需要的库,包括RandomForestRegressorGridSearchCVtrain_test_split等;
  2. 加载糖尿病数据集,并将数据集划分为训练集和测试集;
  3. 定义了一个参数网格param_grid,包括了随机森林模型的各种参数及其可能的取值;
  4. 初始化了一个随机森林回归器rf
  5. 使用GridSearchCV进行网格搜索和交叉验证,寻找最佳的参数组合;
  6. 输出了最佳的参数组合,并用这些参数在测试集上评估模型的性能,计算并输出了均方误差(MSE)作为评估指标。

需要注意的是,这个代码的运行时间较长

预测

假设我们有一组新的特征数据X_new需要进行预测,可以像下面这样使用训练好的模型进行预测:

# 假设有一组新的特征数据 X_new 需要进行预测
X_new = np.array([[0.03906215, 0.05068012, 0.06169621, 0.02187235, -0.0442235,
                   -0.03482076, -0.04340085, -0.00259226, 0.01990842, -0.01764613]])

# 使用训练好的模型进行预测
predicted_y = best_rf.predict(X_new)
print("预测的结果:", predicted_y)

在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值