我应该在 train\test 拆分之前 Standadize 和 detrend 吗?

Should i Standadize and detrend before train\test split?

我是 python 的新手,正在尝试执行 运行dom 森林回归任务。 我导入的数据集总共有 5 列(包括日期列)。我的数据是时间相关的,所以我不能使用 train/test 拆分。所以我改为执行以下操作

feature_cols = [ 'Rainfall' ,'Temperature','Usage amount']
target_v = df['water level']
X = df[feature_cols] 
y = target_v 

然后我使用 sklearn 中的时间序列拆分将我的数据拆分为训练和测试

from sklearn.model_selection import TimeSeriesSplit
tss = TimeSeriesSplit(n_splits = 3)
for train_index, test_index in tss.split(X):
    X_train, X_test = X.iloc[train_index, :], X.iloc[test_index,:]
    y_train, y_test = y.iloc[train_index], y.iloc[test_index]

现在我需要执行预处理,例如缩放数据和移除均值(去趋势)。所以我的问题是我应该先做什么?即我是先去除均值然后缩放我的数据还是先缩放然后去除均值?

另外,我是在我的整个数据帧 (df) 上还是在我的数据子集上(即仅在训练数据上)执行这 2 种技术?如果它是一个子集,我该怎么做?

这是我在整个数据帧上尝试过的缩放和均值去除示例

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df = pd.DataFrame(scaler.fit_transform(df), columns=df.columns, index=df.index)

mean = np.mean((df.values), axis=-1, keepdims=True)
detrended = df - mean

然后我使用去趋势数据帧将我的数据拆分为训练和测试以及 运行 我的模型。不确定这是否是正确的方法?任何帮助将不胜感激,谢谢

您几乎总是在训练测试拆分数据后进行标准化。当你稍后获得真实世界的数据来测试你的模型时,你将无法返回并修改你的缩放器或它会弄乱你的模型。 有些人甚至可能考虑将测试数据包含在缩放过度拟合中,因为让网络在缩放时考虑测试数据有点作弊。

所以你首先应该做的是Train Test Split。 然后将 Scaler 拟合到训练数据上,用 Scaler 变换训练数据,然后在不重新拟合的情况下使用相同的 scaler 变换测试数据。通过这样做,您可以确保对于所有可能被注入网络的未来数据以相同的方式表示相同的值

————————

Sklearn 有两个功能:拟合和转换。 Fit 会更新 Scaler 的参数(它如何缩放数据)以匹配您的数据。转换将缩放器应用于您的数据,以便缩放您的数据。 Sklearn 还有另一个函数可以同时进行拟合和变换 (fit_transform)。

我们想将我们的缩放器调整到我们的训练集,然后缩放数据,所以我们 运行 fit_transform。对于我们的测试集,我们不希望缩放器调整它缩放数据的方式,我们只希望它缩放我们的数据,所以我们以与训练集相同的方式缩放。所以这次我们只做运行 Transform。

如果你愿意,你可以适应和转换你的特征和标签,尽管缩放你的标签不那么重要,因为当涉及到尺寸的差异时你不会遇到同样的问题您的功能之间的值。