我已经用Python编写了一个分类算法。它满足了sciketlearn的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
。你知道吗然后,使用scikitlearn,我定义了一个管道,它是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)
Model
的fit
方法接受validation_data
参数来监视训练过程中的进度,并可能避免过度拟合。为此,在每次迭代中,fit
方法打印训练数据上的模型丢失(X_train, y_train)
(训练丢失)和验证数据上的模型丢失(X_val, y_val)
(验证丢失)。除了验证损失之外,我还希望fit
方法返回验证数据的ROC AUC得分。我的问题如下:
Shall
X_val
be normalized with the scaler of the pipeline before it is used to compute validation ROC AUC score during training ? Also, in this code, onlyX_train
is normalized by the scaler. Should I doX_aux = scaler.fit_transform(X_aux)
instead and then split into train/validation ?
我事先道歉,我的问题很幼稚。我承认我搞糊涂了。
我认为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\u proba方法在非规范化数据上调用,而在(**)行中在规范化数据上调用。这就是为什么我认为X_val
应该规范化。我仍然不确定我的想法是否正确。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐