诶嘿968 2024-11-11 19:14 采纳率: 0%
浏览 60

机器习随机森林调参为什么每次不一样

机器学习随机森林实现共享单车预测,超参数怎么寻找最优,我写了循环,把r2可视化,但是画出来的折线每次运行都不一样


```python

import csv
import numpy as np
import sklearn.utils as su
import sklearn.ensemble as se
import sklearn.metrics as sm
import matplotlib.pyplot as plt

# 设置打印区域全部显示
np.set_printoptions(threshold = np.inf)
# 设置中文显示,负号显示
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False

# 基于天的数据训练与预测
# 读取文件中的样本数据
x, y = [], []
with open("bike_day.csv", "r") as f:
    reader = csv.reader(f)
    for row in reader:
        x.append(row[2:13])
        y.append(row[-3:])

for i in range(0,len(x)):
    x[i][0] = x[i][0].replace('-','')

# 变量名称
feature_names = np.array(x[0])
# 去掉标题
x = np.array(x[1:], dtype=float)
y = np.array(y[1:], dtype=float)

# 样本随机化(消除样本数据的影响)
x, y = su.shuffle(x, y[:,-3], random_state=7)
data = []
a = [50,100,150,200,250,300,350,400,450,500,1000]
for i in a:
    train_size = int(len(x)*0.8)
    train_x = x[:train_size]  # 训练集输入部分
    test_x = x[train_size:]  # 测试集输入部分
    train_y = y[:train_size]  # 训练集输出部分
    test_y = y[train_size:]  # 测试集输出部分

    # 定义模型(决策树最大深度,防止过拟合)
    model = se.RandomForestRegressor(max_depth=10, n_estimators=i, min_samples_split=2)
    model.fit(train_x,train_y)
    pred_y = model.predict(test_x)  # 使用测试集预测
    # 特征重要性
    fi = model.feature_importances_
    # 计算并打印测试指标R2
    r2 = sm.r2_score(test_y, pred_y)
    print('r2:', r2)
    data.append(r2)
plt.figure()
plt.title('决策树数量对r2的影响')
plt.ylabel('r2')
plt.xticks(range(len(a)), a)
plt.plot(data,'b-',)
plt.tight_layout()
plt.show()

```

  • 写回答

2条回答 默认 最新

  • 无疆76 2024-11-11 19:15
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    关于您提到的每次运行随机森林模型得到的超参数最优结果不一样的问题,这主要是因为随机森林模型的训练是随机的,具有以下几个原因:

    1. 数据随机性:每次运行代码时,数据集的划分(训练集和测试集)是随机的,这会导致模型在每次运行时的表现有所不同。虽然您设置了固定的随机状态(random_state=7),但对于每次循环中的数据划分仍然可能有变化。
    2. 模型随机性:随机森林中的每棵树都是独立地从一个随机子集中选取的样本和特征进行训练的。这意味着每次运行时,尽管数据集相同,但由于树的构建过程存在随机性,最终的模型可能会有所不同。

    为了找到最优的超参数,您可以采用以下几种方法:

    1. 网格搜索(Grid Search):使用sklearn.model_selection.GridSearchCV对特定的超参数组合进行交叉验证,以确定最佳的超参数组合。这可以帮助您找到在给定的数据集上表现最好的参数组合。
    2. 随机搜索(Randomized Search):使用基于采样的方法来搜索超参数空间,例如sklearn.model_selection.RandomizedSearchCV。这种方法更加灵活,可以在超参数空间中探索更多的区域。
    3. 重复实验:对于每次实验,您可以多次运行模型并取平均值或使用其他统计方法来评估超参数的影响。这样可以减少随机性的影响,得到更稳定的评估结果。
    4. 可视化结果:您已经进行了可视化操作来展示不同决策树数量对R²的影响。这是一个很好的开始,但为了确保结果的稳定性,您可能需要增加更多的实验次数并在多次实验的结果上进行平均。此外,您也可以考虑使用误差棒或其他统计量来表示不同实验的变异程度。

    关于您的代码,建议您使用GridSearchCVRandomizedSearchCV来更有效地找到最优的超参数组合。这将帮助您更准确地评估不同超参数的影响,并找到在特定数据集上表现最好的模型参数。

    评论

报告相同问题?

问题事件

  • 修改了问题 11月11日
  • 创建了问题 11月11日