小样本多变量时间序列回归预测-随机森林+线性回归+梯度提升

文章讲述了作者在实习中遇到的小样本时序预测问题,通过尝试使用单回归器、其组合以及多回归器取平均的方法,特别关注了随机森林和梯度提升回归在预测四个相关特征变量上的表现。文中还讨论了数据预处理、特征相关性分析以及评估指标的选择,如RMSE。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来讲一下实习碰到的实际问题,针对每个小样本set进行多变量的时序预测,但是每个set的样本数比较少,12-46个不等;本文尝试使用可以预测多变量的单回归器,和预测单变量的单回归器的组合,和多个回归器取均值的三种策略来寻找最优的办法

先看一下原始数据:

主要关注标黄的四个变量的预测:

先数据预处理一下:

# 查看数据的基本信息,包括变量类型和空缺值情况

# 查看数据的基本信息,包括变量类型和空缺值情况
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1926 entries, 0 to 1926
Data columns (total 10 columns):
 #   Column           Non-Null Count  Dtype         
---  ------           --------------  -----         
 0   cp_center        1926 non-null   int64         
 1   ENDPOINT         1926 non-null   datetime64[ns]
 2   form_mis_all     1926 non-null   int64         
 3   form_tot_all     1926 non-null   int64         
 4   pat_vis          1926 non-null   float64       
 5   pat              1926 non-null   float64       
 6   mis_per_pat_vis  1926 non-null   float64       
 7   mis_per_patient  1926 non-null   float64       
 8   center_record    1926 non-null   int64         
 9   max_value        1926 non-null   float64       
dtypes: datetime64[ns](1), float64(5), int64(4)
memory usage: 165.5 KB

发现有一行存在缺失值,drop一下:

# 如果需要,可以查看空缺值的详细情况
df.isnull().sum()

cp_center          0
ENDPOINT           0
form_mis_all       0
form_tot_all       0
pat_vis            1
pat                1
mis_per_pat_vis    1
mis_per_patient    1
center_record      0
max_value          0
dtype: int64

#删除缺失值的行
df = df.dropna()

然后查看每个set的样本个数:

# 统计cp_center列的取值情况
cp_center_counts = df['cp_center'].value_counts()
cp_center_counts

360001     44
360003     42
360004     41
1520002    40
1520001    40
           ..
8400002    12
7920005    12
8260002    12
7920008    12
1560004    12
Name: cp_center, Length: 80, dtype: int64

可视化一下看看数据的样子:

#按照cp_center分组绘画mis_per_pat_vis 和mis_per_patient关于ENDPOINT列作为x轴的折线图

#按照cp_center分组绘画mis_per_pat_vis 和mis_per_patient关于ENDPOINT列作为x轴的折线图
import matplotlib.dates as mdates
import math

# 获取cp_center的唯一值
cp_centers = df['cp_center'].unique()

# 计算需要多少行来放置所有子图
num_rows = math.ceil(len(cp_centers) / 4)

# 创建一个新的Figure对象
fig, axes = plt.subplots(nrows=num_rows, ncols=4, figsize=(20, 5 * num_rows))

# 遍历每个cp_center值
for i, cp_center in enumerate(cp_centers):
    # 获取当前cp_center的数据
    group = df[df['cp_center'] == cp_center]
    
    # 获取当前子图的轴对象
    ax1 = axes[i // 4, i % 4]
    
    # 在主y轴上绘制mis_per_pat_vis
    ax1.plot(group['ENDPOINT'], group['mis_per_pat_vis'], label='mis_per_pat_vis')
    ax1.set_ylabel('mis_per_pat_vis', color='blue')
    ax1.tick_params(axis='y',
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值