如何在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
- 因此,我预计两者都会出现:
- 年度季节性
- 长期经济供求波动
- 对美国(?)/澳大利亚经济的依赖
- 对美国(?)/澳大利亚出口每种特定类型牛肉的外国经济体的依赖性(中国、日本、韩国等)
- 其他外部事件(衰退、天气危机、关税、补贴、美国大豆贸易战等)无法从历史牛肉价格值中预测(如果你抛出更多的历史数据集,或者追溯到更远的时间,你只会阻塞你的模型,而不会增加对未来的预测能力)
- 因此,如果你想要更高的准确性,你真的需要所有这些外在事物的宏观模型——而不仅仅是原始历史数据集值本身
R
预测包或statsmodels
中获得,用于python的尝试肯定可以进行,但只需提前一步(这就是大多数ML时间序列问题的结构),或者,如果您的时间序列符合ARIMA,您可以尝试预测