监督ML算法中验证数据的缩放

2024-04-26 23:44:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经用Python编写了一个分类算法。它满足了sciketlearn的API。给定带标签的数据X, y,我想用以下方式训练我的算法:

  • X, y分为X_aux, y_auxX_test, y_test。你知道吗
  • X_aux, y_aux分为X_train, y_trainX_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)

Modelfit方法接受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, only X_train is normalized by the scaler. Should I do X_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应该规范化。我仍然不确定我的想法是否正确。你知道吗


Tags: 数据testtrainval规范化predictfitvalidation