DataWhale AI 夏令营 笔记1-baseline

第一次的baseline的任务是随机森林的建模
随机森林(Random Forest)的实现过程包括以下几个步骤:

数据集的准备:
将整个数据集分成训练集和测试集。

样本选择(Bootstrap Sampling):
从原始数据集中有放回地随机抽取多个样本子集,形成多个训练集。每个训练集的大小与原始数据集相同,但由于是有放回抽样,一些样本可能会重复出现,而一些样本可能不会出现。
构建决策树:

对于每个抽取的训练集,训练一棵决策树。
在构建每棵树时,并不是使用所有特征进行分裂,而是在每次分裂节点时随机选择一部分特征来寻找最佳分裂点。这个过程增加了模型的多样性并减少了过拟合。

决策树的训练过程:
节点分裂:从随机选择的特征中选择最佳的分裂特征和分裂点,使得每个节点尽可能纯净。这个过程通过递归地分裂节点来完成,直到达到停止条件(如最大深度、最小样本数等)。
叶节点:当节点不再继续分裂时(达到停止条件),将该节点作为叶节点。叶节点的预测值通常是该节点中所有样本的均值(回归任务)或类别的多数投票(分类任务)。

聚合预测:
当所有树都训练完成后,使用这些树进行预测。
对于回归任务,所有树的预测值取平均值作为最终预测结果。
对于分类任务,所有树的预测结果进行投票,得票最多的类别作为最终预测结果

我们可以通过调整参数使得其得到更好的结果

n_estimators(树的数量):

作用:更多的树通常会提高模型的性能,但也会增加计算时间。
调整方法:从一个较小的值开始(如10),逐步增加(如100、200等),观察模型性能的变化。一般来说,增加树的数量会提高模型的稳定性和准确性,但也会带来计算成本的增加。

但是实践的效果看起来增加到200的效果并不好,甚至起了副作用
max_depth(树的最大深度):

作用:限制树的深度可以防止过拟合。较深的树可以捕捉更复杂的关系,但也更容易过拟合。
调整方法:可以从一个较小的值开始(如5),逐步增加,观察模型的表现。通常需要通过交叉验证来选择一个合适的深度。

这个实践的收益很高,到35左右就有将近0.32了,但是注意过拟合

min_samples_split(内部节点再划分所需的最小样本数):

作用:这个参数限制了继续分裂一个节点所需的最小样本数,防止树过于复杂。
调整方法:一般来说,保持默认值(2)是一个不错的选择。如果数据噪声较大,可以考虑增大这个值来限制树的复杂度。
min_samples_leaf(叶子节点所需的最小样本数):

作用:这个参数限制了一个叶节点所需的最小样本数,可以防止树的某些分支过于细化。
调整方法:可以尝试增加这个值(如从1到5),观察模型性能的变化。对于数据噪声较大的情况,增大这个值可以防止过拟合。
n_jobs(并行数):

作用:控制计算过程中使用的CPU核心数量。
调整方法:n_jobs=-1 会使用所有可用的CPU核心,这通常是最好的选择,因为可以最大化计算速度。
1.网格搜索
就是直接穷举,需要大量的算力

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {
    'n_estimators': [10, 50, 100, 200],  # 树的数量
    'max_depth': [None, 10, 20, 30],  # 树的最大深度
    'min_samples_split': [2, 5, 10],  # 内部节点再划分所需的最小样本数
    'min_samples_leaf': [1, 2, 4]  # 叶子节点所需的最小样本数
}

# 实例化模型
model = RandomForestRegressor(n_jobs=-1)

# 使用网格搜索进行参数调优
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=3, n_jobs=-1, verbose=2)
grid_search.fit(train_x, train_y)

# 输出最优参数
print(f'Best parameters found: {grid_search.best_params_}')

2.随机搜索
随机搜索是通过在参数空间中随机采样一定数量的组合来寻找最优参数,通常在计算资源有限的情况下使用。相比网格搜索,随机搜索可以在较大的参数空间中找到接近最优的参数组合

from sklearn.model_selection import RandomizedSearchCV
import numpy as np

# 定义参数分布
param_dist = {
    'n_estimators': [int(x) for x in np.linspace(start=10, stop=200, num=10)],  # 树的数量
    'max_depth': [None] + [int(x) for x in np.linspace(10, 110, num=11)],  # 树的最大深度
    'min_samples_split': [2, 5, 10],  # 内部节点再划分所需的最小样本数
    'min_samples_leaf': [1, 2, 4],  # 叶子节点所需的最小样本数
    'bootstrap': [True, False]  # 是否使用自助采样法
}

# 实例化模型
model = RandomForestRegressor(n_jobs=-1)

# 使用随机搜索进行参数调优
random_search = RandomizedSearchCV(estimator=model, param_distributions=param_dist, n_iter=100, cv=3, n_jobs=-1, verbose=2, random_state=42)
random_search.fit(train_x, train_y)

# 输出最优参数
print(f'Best parameters found: {random_search.best_params_}')

以上两种亲身实践并不好使,因为CPU跑起来太慢了,跑一天都不一定跑得完

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值