当使用时间序列数据集训练分类器模型时,如果您使用整个训练数据集的最小/最大值进行归一化/缩放,那么您也会考虑未来的值,而在真实场景中,您不会有这些信息,对吧?好的,那么你应该只用你的训练数据来构建你的scaler:
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
与日志(1+x)相同的this log1p solution如何处理(-1;∞)?或者exp normalize呢?
处理这种情况的最佳实践是什么?
发布于 2017-07-13 12:16:21
首先,你应该使用scikit learn的pipelines。这确保了,当您的训练数据适合您的管道时,测试数据中不会有任何data leakage。
你的所有建议都支持数据泄漏,从而导致过度拟合。
但是,我要强调的是,当您将训练数据缩放到-1和1之间时,这不一定适用于您的测试数据。但是,您的分类器/回归通常仍然能够解释这些输入。此外,您使用的是标准定标器,它可以简单地转换为零均值和单位方差。因此,任何足够大/足够小的值仍然是可能的,但不太可能
通常,对于test_set,您只希望有几个点超出该范围。否则,你没有“有代表性地”或随着时间的推移,一些本质上发生了变化的东西。然后你可以重新训练你的算法。但如果算法的泛化性能良好,这也无关紧要。
也许你应该使用cross validation for time-series sampling scheme
移位的对数(而不是通常的对数)通常仅用于允许0个输入值。
https://stackoverflow.com/questions/45080001
复制