来讲一下实习碰到的实际问题,针对每个小样本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',