我有一个df,我需要在接下来的7天内预测每一天的因变量(数字).火车数据如下:
df.head()
Date X1 X2 X3 Y
2004-11-20 453.0 654 989 716 # row 1
2004-11-21 716.0 878 886 605
2004-11-22 605.0 433 775 555
2004-11-23 555.0 453 564 680
2004-11-24 680.0 645 734 713
具体而言,对于第1行中的2004-11-20日期,我需要接下来7天中每天的Y预测值,而不仅仅是当前日期(变量Y),并考虑预测从2004年开始的第5天 – 11-20从2004-11-20开始,我将无法获得接下来4天的数据.
我一直在考虑创建7个变量(“Y 1day”,“Y 2day”等)的想法,但我需要为每天创建一个训练df,因为机器学习技术只返回一个变量作为输出.有没有更简单的方法?
我正在使用skikit-learn库进行建模.
最佳答案 您绝对可以训练模型来预测sklearn中的多个输出.而且大熊猫非常灵活.在下面的示例中,我将Date列转换为日期时间索引,然后使用shift实用程序获取更多Y值.
import io
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
# Read from stackoverflow artifacts
s = """Date X1 X2 X3 Y
2004-11-20 453.0 654 989 716
2004-11-21 716.0 878 886 605
2004-11-22 605.0 433 775 555
2004-11-23 555.0 453 564 680
2004-11-24 680.0 645 734 713"""
text = io.StringIO(s)
df = pd.read_csv(text, sep='\\s+')
# Datetime index
df["Date"] = pd.to_datetime(df["Date"], format="%Y/%m/%d")
df = df.set_index("Date")
# Shifting for Y@Day+N
df['Y1'] = df.shift(1)['Y'] # One day later
df['Y2'] = df.shift(2)['Y'] # Two...
当我们使用shift时,我们必须估算或删除导致的NaN.在大型数据集中,这有希望仅在时间范围的边缘产生估算或丢弃的数据.例如,如果您想要7天转移,您将从数据集中丢失7天,具体取决于您的数据结构以及转换方式.
df.dropna(inplace=True) # Drop two rows
train, test = train_test_split(df)
# Get two training rows
trainX = train.drop(["Y", "Y1", "Y2"], axis=1)
trainY = train.drop(["X1", "X2", "X3"], axis=1)
# Get the test row
X = test.drop(["Y", "Y1", "Y2"], axis=1)
Y = test.drop(["X1", "X2", "X3"], axis=1)
现在我们可以从sklearn实例化一个分类器并进行预测.
from sklearn.linear_model import LinearRegression
clf = LinearRegression()
model = clf.fit(trainX, trainY)
model.predict(X) # Array of three numbers
model.score(X, Y) # Predictably abysmal score
sklearn版本0.20.1对我来说这些都很好.当然,我得到了一个糟糕的得分结果,但模型确实训练,预测方法确实返回每个Y列的预测,并且得分方法返回得分.