如何预处理时间序列测试数据以进行分类预测?

时间:2017-07-13 12:00:14

标签: python machine-learning scikit-learn time-series

使用时间序列数据集训练分类器模型时,如果使用整个训练数据集的最小值/最大值进行标准化/缩放,您也会考虑未来的值,并且在实际场景中,您将不会拥有此信息,对吗?好的,那么你应该只用你的训练数据建立你的缩放器:

scaler = StandardScaler().fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

但是如果新值与训练值略有不同怎么办?

考虑到这一点,我的意思是:

scaler = StandardScaler() # or MinMaxScaler()

scaler_train = scaler.fit(X_train)
X_train = scaler_train.transform(X_train)

scaler_full = scaler.fit(X) # X_train + X_test
X_test = scaler_full.transform(X_test)

或者可能只是平均列车和测试的平均值和标准,以规范测试输入:

X_train_mean = np.mean(X_train)
X_train_std  = np.std(X_train)
X_train_normalized = (X_train - X_train_mean) / X_train_std

X_test_mean = np.mean(y_test)
X_test_std  = np.std(y_test)

new_mean =  (X_train_mean + X_test_mean) / 2
new_std  =  (X_train_std + X_test_std) / 2

X_test_normalized = (X_test - new_mean) / new_std

this log1p solution怎么样,它与log(1 + x)相同,因此可以用于(-1;∞)?或者exp normalize怎么办?

处理这种情况的最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

首先,你应该使用scikit-learn's pipelines。这可以确保,当您在管道上放置训练数据时,测试数据中不会有data leakage

您的所有建议都支持数据泄漏,从而过度拟合。

但是,请允许我强调,当您将训练数据缩放到介于-1和1之间时,这不一定适用于您的测试数据。但是,您的分类器/回归通常仍然能够解释此类输入。此外,您使用的是标准缩放器,它只是转换为零均值和单位方差。因此,任何大/小的值仍然可能但不太可能

通常,您希望只有少数几个点可以超出test_set的范围。否则,您没有“代表性地”或随着时间的推移对某些必要的变化进行抽样。然后你可以重新训练你的算法。但是,如果算法的泛化性能良好,这也无关紧要。

也许你应该使用cross validation for time-series sampling scheme

移位的日志(而不是通常的日志)通常仅用于允许0个输入值。