如何将标准化应用于训练和测试数据集

时间:2018-06-27 08:53:27

标签: python machine-learning scikit-learn

假设我有一个10形状的X特征数据集[100, 10]和一个y形状的[100, 1]目标数据集。 例如,用sklearn.model_selection.train_test_split将两者拆分后,我得到:

  • X_train: [70, 10]
  • X_test: [30, 10]
  • y_train: [70, 1]
  • y_test: [30, 1]

应用标准化的正确方法是什么?

我尝试过:

from sklearn import preprocessing
scaler = preprocessing.StandardScaler()

scaler.fit(X_train)

X_train_std = scaler.transform(X_train)
X_test_std = scaler.transform(X_test)

但是如果我尝试使用模型进行预测,当我尝试反转比例以查看MAE时,就会出现错误

from sklearn import linear_model
lr = linear_model.LinearRegression()
lr.fit(X_train_std, y_train)
y_pred_std = lr.predict(X_test_std)

y_pred = scaler.inverse_transform(y_pred_std) # error here


我还有另一个问题。由于我有目标值,因此我应该使用

scaler = preprocessing.StandardScaler()

X_train_std = scaler.fit_transform(X_train, y_train)
X_test_std = scaler.transform(X_test)

代替第一个代码块?


我是否还必须将转换应用于y_trainy_test数据集?我有点困惑

1 个答案:

答案 0 :(得分:4)

StandardScaler仅应用于特征矩阵X。

因此,所有fittransforminverse_transform方法只需要您的X。

请注意,在拟合模型之后,您可以访问以下属性:

  1. mean_X_train中的每个功能的平均值
  2. scale_X_train中每个特征的标准偏差

transform方法对每个样本(X[i, col] - mean_[col] / scale_[col])执行i。而每个样本inverse_transform的{​​{1}}方法(X[i, col] * scale_[col] + mean_[col])