首页 > 解决方案 > 我应该在训练\测试拆分之前站稳脚跟吗?

问题描述

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

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)或我的数据子集(即仅在训练数据上)执行这两种技术?如果它是一个子集,我该怎么做?

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

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

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

标签: pythonmachine-learningtrain-test-splitstandardized

解决方案


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

所以你首先应该做的是训练测试拆分。然后将 Scaler 拟合到训练数据上,用 Scaler 转换训练数据,然后使用相同的 scaler 转换测试数据,无需重新拟合。通过这样做,您可以确保所有未来可能被注入网络的数据以相同的方式表示相同的值

——————</p>

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

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

如果您愿意,您可以对特征和标签进行拟合和转换,尽管缩放标签的重要性要小得多,因为当涉及到特征之间的值比例差异时,您最终不会遇到相同的问题。


推荐阅读