我刚开始学习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
然后,我使用去趋势后的数据框来拆分我的数据为训练集和测试集,并运行我的模型。我不确定这种方法是否正确?任何帮助都将不胜感激,谢谢你
回答:
你几乎总是应该在训练测试拆分后再进行标准化。当你以后获取真实世界的数据来测试你的模型时,你将无法返回并修改你的缩放器,否则会干扰你的模型。有些人甚至可能认为在缩放时包含测试数据是一种过拟合,因为你在缩放时让网络考虑了测试数据,这有点像作弊。
所以你应该首先进行训练测试拆分。然后将缩放器拟合到训练数据上,用缩放器转换训练数据,然后使用相同的缩放器转换测试数据,但不要重新拟合。这样做可以确保所有将来输入网络的数据以相同的方式表示相同的值。
———————
Sklearn有两个函数:fit和transform。Fit更新缩放器的参数(它如何缩放数据)以匹配你的数据。Transform将缩放器应用到你的数据上,使你的数据被缩放。Sklearn还提供了另一个同时进行拟合和转换的函数(fit_transform)。
我们希望调整我们的缩放器以适应训练集,然后缩放数据,所以我们运行fit_transform。对于测试集,我们不希望缩放器调整它缩放数据的方式,我们只希望它以与训练集相同的方式缩放我们的数据。所以这次我们只运行Transform。
如果你愿意,你可以对你的特征和标签进行拟合和转换,尽管缩放你的标签的重要性要小得多,因为你不会遇到由于特征值规模差异而产生的问题。