在受监督的ML算法中对验证数据进行缩放

时间:2018-02-28 15:27:11

标签: python machine-learning scikit-learn normal-distribution

我在Python中编写了一个分类算法。它满足Scikit-Learn的API。鉴于标记数据X, y,我想以下列方式训练我的算法:

  • X, y分为X_aux, y_auxX_test, y_test
  • X_aux, y_aux分为X_train, y_trainX_val, y_val

然后,使用Scikit-Learn,我定义了一个Pipeline,它是StandardScaler(用于特征规范化)和我的模型的串联。最终,管道的培训和评估如下:

pipe = Pipeline([('scaler', StandardScaler()), ('clf', Model())])
pipe.fit(X_train, y_train, validation_data = (X_val, y_val))
pred_proba = pipe.predict_proba(X_test)
score = roc_auc_score(y_test, pred_proba)

fit Model方法接受validation_data参数来监控培训过程中的进度,并可能避免过度拟合。为此目的,在每次迭代时,fit方法打印训练数据上的模型损失(X_train, y_train)(训练损失)和验证数据(X_val, y_val)上的模型丢失(验证丢失)。除了验证丢失之外,我还希望fit方法在验证数据上返回ROC AUC分数。我的问题如下:

  

在用于计算训练期间的ROC AUC评分之前,是否应使用管道的缩放器对X_val进行标准化?此外,在此代码中,只有X_train由缩放器标准化。我应该X_aux = scaler.fit_transform(X_aux)代替然后分成火车/验证吗?

我提前道歉,因为我的问题非常幼稚。我承认我很困惑。 我认为X_val应该正常化。我认为它的方式是上面几行代码相当于:

scaler = StandardScaler()
clf = Model()
X_train = scaler.fit_transform(X_train)                                                                                                                                                              
clf.fit(X_train, y_train, validation_data = (X_val, y_val))          
#    During `fit`, at each iteration, we would have:
#    train_loss = loss(X_train, y_train)
#    validation_loss = loss(X_val, y_val)
#    pred_proba_val = predict_proba(X_val, y_val)                   (*)
#    roc_auc_val = roc_auc_score(y_val, pred_proba_val)
X_test = scaler.transform(X_test)
pred_proba = clf.predict_proba(X_test)                              (**)
score = roc_auc_score(y_test, pred_proba)

在行(*)中,对非标准化数据调用predict_proba方法,而在行(**)上调用标准化数据。这就是我认为X_val应该正常化的原因。我仍然不确定我的想法是否正确。

0 个答案:

没有答案