随机森林(以及大多数监督学习模型)接受一个向量 x = (X1, . . .Xķ) 每次观察并尝试正确预测输出 是的. 所以你需要将你的训练数据转换成这种格式。以下pandas
基于 - 的功能将有所帮助:
import pandas as pd
def table2lags(table, max_lag, min_lag=0, separator='_'):
""" Given a dataframe, return a dataframe with different lags of all its columns """
values=[]
for i in range(min_lag, max_lag + 1):
values.append(table.shift(i).copy())
values[-1].columns = [c + separator + str(i) for c in table.columns]
return pd.concat(values, axis=1)
例如,下面的代码:
df = pd.DataFrame({'y1':[1,2,3,4,5], 'y2':[10,20,40,50,30], 'z': [1,4,9,16,25]})
x = table2lags(df[['y1', 'y2']], 2)
print(x)
会产生输出
y1_0 y1_1 y1_2 y2_0 y2_1 y2_2
0 1.0 NaN NaN 10.0 NaN NaN
1 2.0 1.0 NaN 20.0 10.0 NaN
2 3.0 2.0 1.0 40.0 20.0 10.0
3 4.0 3.0 2.0 50.0 40.0 20.0
4 5.0 4.0 3.0 30.0 50.0 40.0
前两行缺少值,因为滞后 1 和 2 在它们上未定义。你可以用你认为合适的填充它们,或者干脆省略它们。
当你有矩阵 X例如,您可以将其提供给scikit-learn
回归器:
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor().fit(x[2:], df['z'][2:])
最后,一个忠告。如果您不仅使用原始滞后值作为特征,而且使用它们的不同聚合:均值、其他线性组合(例如 ewm)、分位数等,那么您的模型可能会得到很大改进。在线性模型中包含额外的线性组合是没有用的,但是对于树基于模型的它可以提供很大帮助。