多种预测

时间:2018-12-17 01:39:14

标签: python datetime scikit-learn prediction

我有一个df,需要在接下来的7天中每天预测因变量(数字)。 train数据类似于:

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-11-20开始的第5天,我将不会从2004-11-20开始获得接下来4天的数据。

我一直在考虑创建另外7个变量("Y+1day""Y+2day”等)的想法,但是由于机器学习技术只会回归,我每天都需要创建一个训练df一个变量作为输出。有没有更简单的方法?

我正在使用skikit-learn库进行建模。

1 个答案:

答案 0 :(得分:1)

您绝对可以训练模型来预测sklearn中的多个输出。 pandas非常灵活。在下面的示例中,我将您的Date列转换为datetime索引,然后使用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列返回了预测,分数方法返回了分数。