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

2024-09-28 22:37:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

新更新

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

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

时间序列数据取自市场信息统计数据库http://statistics.mla.com.au/Report/List。我共享了reproducible data in this link,并在this gist中共享了我的完整编码尝试

我的尝试

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值。现在我几乎不知道如何使用它们进行预测,以及它们可能会或可能不会有助于预测目标变量

这背后的直觉

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

新更新:目标

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


Tags: 数据方法testlog目标dfsize时间
1条回答
网友
1楼 · 发布于 2024-09-28 22:37:16

这是一个非常广泛的话题,你问了很多问题,包括DataScience.SECrossValidated如何使用detrending,使用哪种类型的模型,如何在单个timeseries数据集上使用滚动窗口技术来生成多个(训练、测试)切片,从何处获取以下外部变量的月度数据集:

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

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

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

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

相关问题 更多 >