Forty_8 2024-11-11 12:07 采纳率: 85%
浏览 10
已结题

利用随机森林预测共享单车投放量添加日期进行预测,修改三个超参数改变R2并绘制R2的图像

问题现象:在利用随机森林预测共享单车投放量时,因其特征为日期、季节、年、月、小时、是否是假期、星期几、是否为工作日、天气、温度、体感温度、湿度、风速,我想添加日期进行预测,并通过修改三个超参数改变R2并绘制R2的图像,来讨论最优参数,应该如何修改我的代码?
bike_day.csv数据类型如下:

img


import sklearn.metrics as sm # 性能评价模块
import sklearn.utils as su # 通用功能模块(随机数模块)
import sklearn.ensemble as se  # 导入随机森林模型
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


# 加载基于天的数据
day_data = pd.read_csv('bike_day.csv')

# 将日期转换为日期时间格式
# day_data['dteday'] = day_data['dteday'].replace('/','.')
# print(day_data['dteday'])

# 提取特征和标签
features = day_data.columns[2:13]
target_name = day_data.columns[-3]

data = day_data[features].values
target = day_data[target_name].values

x,y = su.shuffle(data, target,random_state=7)

# 训练集:训练模型
# 测试集:评估模型好坏
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=1000, # 决策树数量
    min_samples_split=2) # 样本最小数量,最小样本分割节点,小于这个值就不再划分,防止过拟合

model.fit(train_x,train_y) # 训练
pred_y = model.predict(test_x)
 # 计算并打印r2的值,准确率
print('r2:',sm.r2_score(test_y,pred_y))

# 特征重要性
fi = model.feature_importances_ # 仅决策树有
print('特征重要性fi',fi)

x1 = np.arange(fi.size) # 有多少特征值就产生多少个值
sorted_idx = fi.argsort()[::-1] # 特征重要性依据下标排序
fi = fi[sorted_idx] # 特征重要性按照sorted_idx来排列

# 特征重要性可视化
plt.figure()

plt.title('Day-feature_importances')
plt.ylabel('feature_importances')

plt.bar(x1,fi,0.4,color='b',label="feature_importances")
plt.xticks(x1,[features[i] for i in sorted_idx],rotation=90)

plt.legend()
plt.tight_layout()
plt.show()

  • 写回答

1条回答 默认 最新

  • JavaPub-rodert 领域专家: 后端开发技术领域 2024-11-13 11:11
    关注

    本答案参考 多次询问 ChatGPT-3.5 后选择的最佳回答,若是满意,还请采纳,谢谢

    要根据日期进行预测,并通过修改三个超参数来改变R²值,你可以按照以下步骤修改代码:

    1. 添加日期特征:首先,确保将日期列(如 dteday)从原始数据中提取并转化为可以用于模型的特征。通常,你可以提取日期中的年、月、日、周几等信息作为额外特征。

    2. 调整三个超参数:通过修改 RandomForestRegressor 的超参数(如 max_depthn_estimatorsmin_samples_split 等)并观察 R² 值的变化。

    3. 绘制 R² 的变化图:为了研究不同超参数组合对 R² 的影响,可以通过网格搜索或手动调整超参数的不同值,绘制 R² 随超参数变化的图像。

    修改后的代码示例如下:

    import sklearn.metrics as sm
    import sklearn.utils as su
    import sklearn.ensemble as se
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 加载数据
    day_data = pd.read_csv('bike_day.csv')
    
    # 将日期转换为日期时间格式,并提取日期的相关特征
    day_data['dteday'] = pd.to_datetime(day_data['dteday'])
    day_data['year'] = day_data['dteday'].dt.year
    day_data['month'] = day_data['dteday'].dt.month
    day_data['day'] = day_data['dteday'].dt.day
    day_data['weekday'] = day_data['dteday'].dt.weekday  # 星期几
    
    # 提取特征和标签
    features = day_data.columns[2:14]  # 新的特征列包括日期相关特征
    target_name = day_data.columns[-3]
    
    data = day_data[features].values
    target = day_data[target_name].values
    
    x, y = su.shuffle(data, target, random_state=7)
    
    # 训练集:训练模型
    # 测试集:评估模型好坏
    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:]  # 测试集输出部分
    
    # 定义并调节三个超参数:max_depth, n_estimators, min_samples_split
    max_depth_range = [5, 10, 20, None]
    n_estimators_range = [100, 500, 1000]
    min_samples_split_range = [2, 5, 10]
    
    # 用于记录不同超参数组合的R²值
    r2_scores = []
    
    # 遍历超参数组合
    for max_depth in max_depth_range:
        for n_estimators in n_estimators_range:
            for min_samples_split in min_samples_split_range:
                model = se.RandomForestRegressor(
                    max_depth=max_depth,
                    n_estimators=n_estimators,
                    min_samples_split=min_samples_split
                )
                model.fit(train_x, train_y)  # 训练模型
                pred_y = model.predict(test_x)  # 预测
                r2 = sm.r2_score(test_y, pred_y)  # 计算R²值
                r2_scores.append((max_depth, n_estimators, min_samples_split, r2))
    
    # 转换为DataFrame以便于查看和分析
    r2_df = pd.DataFrame(r2_scores, columns=['max_depth', 'n_estimators', 'min_samples_split', 'r2'])
    
    # 绘制不同超参数组合对应的R²值
    fig, ax = plt.subplots(figsize=(10, 6))
    for max_depth in max_depth_range:
        subset = r2_df[r2_df['max_depth'] == max_depth]
        ax.plot(subset['n_estimators'], subset['r2'], label=f'Max Depth: {max_depth}', marker='o')
    
    ax.set_xlabel('Number of Estimators')
    ax.set_ylabel('R²')
    ax.set_title('Effect of n_estimators on R² for different max_depth values')
    ax.legend()
    plt.show()
    
    # 输出最佳参数组合和对应的R²值
    best_params = r2_df.loc[r2_df['r2'].idxmax()]
    print(f"Best parameters: {best_params[['max_depth', 'n_estimators', 'min_samples_split']]}")
    print(f"Best R²: {best_params['r2']}")
    

    说明:

    1. 添加日期特征:通过 pd.to_datetime 转换日期,并从中提取 year, month, day, weekday 等特征,这些特征会作为输入特征之一用于模型训练。
    2. 超参数调整:通过设置不同的 max_depth, n_estimators, min_samples_split 来观察不同组合对 R² 值的影响,并记录下来。
    3. 绘制 R² 图像:通过绘制不同 max_depthn_estimators 对 R² 的影响,可以观察到不同超参数的效果。
    4. 选择最优超参数:通过计算每种超参数组合的 R² 值,可以选择最优的超参数组合。

    根据以上代码,你可以通过调节超参数和日期特征来提高模型的预测效果,并绘制 R² 的变化图,帮助分析最优超参数的选择。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月13日
  • 已采纳回答 11月13日
  • 创建了问题 11月11日