使用时间序列数据集训练分类器模型时,如果使用整个训练数据集的最小值/最大值进行标准化/缩放,您也会考虑未来的值,并且在实际场景中,您将不会拥有此信息,对吗?好的,那么你应该只用你的训练数据建立你的缩放器:
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怎么办?
处理这种情况的最佳做法是什么?
答案 0 :(得分:1)
首先,你应该使用scikit-learn's pipelines。这可以确保,当您在管道上放置训练数据时,测试数据中不会有data leakage。
您的所有建议都支持数据泄漏,从而过度拟合。
但是,请允许我强调,当您将训练数据缩放到介于-1和1之间时,这不一定适用于您的测试数据。但是,您的分类器/回归通常仍然能够解释此类输入。此外,您使用的是标准缩放器,它只是转换为零均值和单位方差。因此,任何大/小的值仍然可能但不太可能
通常,您希望只有少数几个点可以超出test_set的范围。否则,您没有“代表性地”或随着时间的推移对某些必要的变化进行抽样。然后你可以重新训练你的算法。但是,如果算法的泛化性能良好,这也无关紧要。
也许你应该使用cross validation for time-series sampling scheme
移位的日志(而不是通常的日志)通常仅用于允许0个输入值。