我在Python中编写了一个分类算法。它满足Scikit-Learn的API。鉴于标记数据X, y
,我想以下列方式训练我的算法:
X, y
分为X_aux, y_aux
和X_test, y_test
。X_aux, y_aux
分为X_train, y_train
和X_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
应该正常化的原因。我仍然不确定我的想法是否正确。