【问题标题】:Much worse performance when use cross_val_scores, why?使用 cross_val_scores 时性能更差,为什么?
【发布时间】:2019-02-22 08:33:55
【问题描述】:

我先用train_test_split来分离train和test数据,代码:

X=LOG.iloc[:,:-3]
y=LOG.iloc[:,-3]
X_train,X_test,y_train, y_test=train_test_split(X,y)

scaler=MinMaxScaler().fit(X)
X_train_scaled=scaler.transform(X_train)
X_test_scaled=scaler.transform(X_test)

for thisalpha in [0.1,1,10]:
    mlpreg=MLPRegressor(hidden_layer_sizes=(11,8,4),
                    activation ="tanh",
                    alpha = thisalpha,
                    solver ="lbfgs",max_iter=20000).fit(X_train_scaled, y_train)

    y_test_predict = mlpreg.predict(X_test_scaled)
    y_train_predict= mlpreg.predict(X_train_scaled)
    print "aipha = {}, train score= {:.4f}, test score = {:.4f}, iter_number={}, loss={:.4f}".format(
        thisalpha,
        mlpreg.score(X_train_scaled,y_train),
        mlpreg.score(X_test_scaled,y_test),
        mlpreg.n_iter_,
        mlpreg.loss_)

我得到这样的表现:

aipha = 0.1,训练分数 = 0.7696,测试分数 = 0.7358

aipha = 1,训练分数 = 0.7419,测试分数 = 0.7219

aipha = 10,训练分数 = 0.6414,测试分数 = 0.6494

然后我尝试使用交叉验证来测试相同的数据集,我得到的分数要低得多:

X=LOG.iloc[:,:-3]
y=LOG.iloc[:,-3]

scaler= MinMaxScaler()

X_scaled=scaler.fit_transform(X)
clf=MLPRegressor(hidden_layer_sizes=(11,8,4),alpha= 
1,solver="lbfgs",max_iter=20000)
scores = cross_val_score(clf,X_scaled,y,cv=3)     

print scores

cross_val_score 是:

[0.04719619 0.36858483 0.36004186]

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    我找到了问题所在。我的数据实际上是以“堆栈”的方式放置的:所有类都在顶部,然后类 n 在底部。所以它给了我奇怪的结果。我像这样更改了我的代码,我需要首先对数据进行洗牌,然后使用交叉验证方法。

    kfold = KFold(n_splits=3,shuffle=True,random_state=0)
    
    X_scaled=scaler.fit_transform(X)
    clf=MLPRegressor(hidden_layer_sizes=(11,8,4),alpha= 1,solver="lbfgs",max_iter=20000)
    scores = cross_val_score(clf,X_scaled,y,cv=kfold)
    
    print scores
    

    我得到这样的分数:

    [0.68697805 0.70411961 0.69466066]

    【讨论】:

      【解决方案2】:

      查看您的代码,这可能是因为您在运行交叉验证模型时遗漏了activation="tanh"。否则,我能看到的唯一真正区别是您在第一种情况下测试了 25% 的数据,而在第二种情况下测试了 33%。这不会像您显示的那样显着影响准确性。

      请注意,您不应使用验证/测试集来适应缩放器,因为这会将模型(间接)暴露给您的测试数据。这在第一种情况下很容易解决,但在使用 cross_val_score 时更难处理。

      【讨论】:

      • 我找到了原因,我需要在使用交叉/验证之前对数据进行洗牌。是的,我同意你关于缩放器的看法。我只是想确保我在每一侧都有相同的缩放方法。谢谢。
      猜你喜欢
      • 2017-05-24
      • 2023-04-08
      • 2021-04-04
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      相关资源
      最近更新 更多