her*_*uzz 3 machine-learning scikit-learn
我见过一些使用两种不同的实验,StandardScaler如下所示:
scaler_1 = StandardScaler().fit(X_train)
train_sc = scaler_1.transform(X_train)
scaler_2 = StandardScaler().fit(X_test)
test_sc = scaler_2.fit(X_test)
Run Code Online (Sandbox Code Playgroud)
我知道人们不应该对混合训练/测试数据的分类器产生偏见,但我想知道另一种情况是否正确:
# X_all represents X feature vector before splitting (train + test)
X_scaled = StandardScaler().fit_transform(X_all)
X_train, y_train, X_test, y_test = train_test_split(X_scaled,y_all)
Run Code Online (Sandbox Code Playgroud)
另外,我想知道这个案例如何延伸到KFold交叉验证。
A C*_* Co 15
在分割数据之前进行标准化是不正确的。一般来说,你不应该在整个数据集上拟合任何预处理算法(PCA,StandardScaler...),而只在训练集上拟合,并使用拟合的算法来转换测试集。
因此,您提出的两种经验都不正确。你应该做的是:
scaler = StandardScaler().fit(X_train)
train_sc = scaler.transform(X_train)
test_sc = scaler.transform(X_test)
Run Code Online (Sandbox Code Playgroud)
如果你这样想就很容易理解:测试集用于估计模型在不可见的情况下的性能数据上的性能。因此,在训练算法时,您应该表现得好像您无权访问测试集,这对于交叉验证也有效。
当您在整个数据集上拟合标准缩放器时,测试集的信息将用于标准化训练集。这是“数据泄漏”的常见情况,这意味着在训练模型时使用了测试集中的信息。这通常会导致模型性能的高估。
请注意,在 scikit-learn 中,您可以使用Pipelines将预处理步骤与估计器链接起来,并在交叉验证过程中使用它。这将确保交叉验证过程的每一步都重复相同的步骤。
| 归档时间: |
|
| 查看次数: |
10132 次 |
| 最近记录: |