如何在python中使用sklearn回归器正确预测目标变量?

如何在python中使用sklearn回归器正确预测目标变量?,python,scikit-learn,time-series,Python,Scikit Learn,Time Series,我想根据营销时间序列数据预测未来的价格。为此,我在任务中使用了sklearn,因为它比statsmodel和fbprophet更灵活。然而,为了进行预处理,我通过为选定的特征和目标变量取对数值,从时间序列数据中去除了季节性,然后使用对数值和滞后值进行预测。我不明白的是每个单独的特征(它有滞后值和对数值)是如何预测目标变量的。在预测问题中,首先对特征进行归一化和预处理,然后根据特征的重要性选择性地选择特征,减少训练数据的维数,然后对模型进行训练,得到相应的预测结果 新更新 然而,在时间序列设置中,

我想根据营销时间序列数据预测未来的价格。为此,我在任务中使用了
sklearn
,因为它比
statsmodel
fbprophet
更灵活。然而,为了进行预处理,我通过为选定的特征和目标变量取对数值,从时间序列数据中去除了季节性,然后使用对数值和滞后值进行预测。我不明白的是每个单独的特征(它有滞后值和对数值)是如何预测目标变量的。在预测问题中,首先对特征进行归一化和预处理,然后根据特征的重要性选择性地选择特征,减少训练数据的维数,然后对模型进行训练,得到相应的预测结果

新更新

然而,在时间序列设置中,我们需要首先处理季节性,然后使用特征的对数值和滞后值进行预测。在我的尝试中,我只是简化了过程,没有使用很多特征(没有使用特征重要性),只选择了两个特征,并尝试预测目标变量(每个特征都有其日志值和滞后值,以便消除季节性)。为什么我预测目标变量的方法无效?这样做的更好方法是什么?有人能给我指出一些可能的建议或补救措施吗

感谢@smci,他鼓励我在我的帖子中详细说明问题并只关注一个问题。我确实指定了数据源链接,并使用了如下时间序列数据:

时间序列数据取自市场信息统计数据库。我在中共享了,并共享了我的完整编码尝试

我的尝试

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostRegressor

url = "https://gist.githubusercontent.com/adamFlyn/f71e2e0e66303df23dfc2f37ec98e8c7/raw/ba9e871e90201eb504e30127e99cf6179c3e3b18/tradedf.csv"

df = pd.read_csv(url, parse_dates=['dates'])
df.drop(columns=['Unnamed: 0'], inplace=True)

df['log_eyci'] = np.log(df.eyci)  ### Log value
df['log_aus_avg_rain'] = np.log(df['aus_avg_rain'])  ### Log value

for i in range(3):
    df[f'avgRain_lag_{i+1}'] = df['aus_avg_rain'].shift(i+1)   
    df.dropna(inplace=True)
    df[f'log_avgRain_lag_{i+1}'] = np.log(df[f'avgRain_lag_{i+1}'])
    
for i in range(3):
    df[f'eyci_lag_{i+1}'] = df.eyci.shift(i+1)   
    df.dropna(inplace=True)
    df[f'log_eyci_lag_{i+1}'] = np.log(df[f'eyci_lag_{i+1}'])
    df[f'log_difference_{i+1}'] = df.log_eyci - df[f'log_eyci_lag_{i+1}']

X,Y = df[['log_difference_2', 'log_difference_3', 'aus_avg_rain', 'aus_slg_fmCatl']] , df['log_difference_1']
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, shuffle=False, random_state=42)
使用AdaBoost回归器拟合模型

mdl_adaboost = AdaBoostRegressor(n_estimators=100, learning_rate=0.01)
mdl_adaboost.fit(X_train, Y_train)   # Fit the data
pred = mdl_adaboost.predict(X_test)  # make predictions
当我试图绘制一个预测输出图时,我尝试了下面的方法

## make plot
test_size = X_test.shape[0]
plt.plot(list(range(test_size)), np.exp(df.tail(test_size).log_eyci_lag_1  + pred), label='predicted', color='red')
plt.plot(list(range(test_size)), df.tail(test_size).eyci, label='real', color='blue')
plt.legend(loc='best')
plt.title('Predicted vs Real with log difference values')
@smci指出,使用
train,test=X[0:size],X[size:len(X)]
不是一个好主意。我想知道我该如何纠正我的方法的局限性

我在这个问题上要问的一个问题是,如何从可能具有季节性的时间序列数据中预测目标变量。我确实对特性和目标变量使用了log和lag值。现在我几乎不知道如何使用它们进行预测,以及它们可能会或可能不会有助于预测目标变量

这背后的直觉

我发展了预测商品价格的直觉,到目前为止,我对这项任务建模的方法仍然存在问题。我也要感谢@smci的支持。有人能在
scikit learn
中建议一种可能的编码补救方法或正确的预测方法吗?有什么想法吗

新更新:目标


我使用了澳大利亚市场信息数据库,我想做的是预测澳大利亚牛肉价格,比如。历史市场价格数据来自澳大利亚市场信息数据库,我将通过简单的特征(如牛屠宰数量、牛产量等)预测澳大利亚牛肉价格。因为我使用的是月度数据,所以我认为采用月度季节性数据就可以了。再次感谢@smci促使我澄清我的帖子和他的有用反馈。

这对SO来说基本上是离题的,而且非常广泛,你问了多个问题,如何使用detrending,使用哪种模型,如何在单个timeseries数据集上使用滚动窗口技术来生成多个(训练,测试)切片,从中获取以下外部变量的月度数据集:

  • 您的数据集(请添加引文)是2015-01年美国农业部牛肉月(批发)价格。。。2020-08. 这些价格是澳大利亚的还是美国的?(请添加引文、数据字典以解释列等)。为你试图建模的东西培养一种直觉是很好的,而不仅仅是向它扔更多的数据和更复杂的模型

  • 你想预测未来12-18个月的价格:
    2020-09。。2022-02

  • 因此,我预计两者都会出现:

    • 年度季节性
    • 长期经济供求波动
      • 对美国(?)/澳大利亚经济的依赖
      • 对美国(?)/澳大利亚出口每种特定类型牛肉的外国经济体的依赖性(中国、日本、韩国等)
    • 其他外部事件(衰退、天气危机、关税、补贴、美国大豆贸易战等)无法从历史牛肉价格值中预测(如果你抛出更多的历史数据集,或者追溯到更远的时间,你只会阻塞你的模型,而不会增加对未来的预测能力)
  • 因此,如果你想要更高的准确性,你真的需要所有这些外在事物的宏观模型——而不仅仅是原始历史数据集值本身


我想你说的是“如何解释模型”,而不是“如何正确预测”。不同的,甚至是黑匣子模型有不同的解释模型的方法,包括评估哪些特征影响结果以及影响程度。您已经拟合了您的模型,您已经对其应用了预测方法,您的问题是什么?1。预测未来是最困难的预测类型,并不总是成功的。2.大多数sklearn预测者,以及支持者和装袋者,不会提前预测几个步骤,而是一步一步地预测。3.要预测多个步骤,您需要切换到一个循环并进一步预测您已经完成的一个步骤预测,或者切换到ARIMA模型,该模型可在
R
预测
包或
statsmodels
中获得,用于python的尝试肯定可以进行,但只需提前一步(这就是大多数ML时间序列问题的结构),或者,如果您的时间序列符合ARIMA,您可以尝试预测