GridSearchCV 结果与直接应用的默认模型 (SVM) 不同

数据挖掘 Python scikit-学习 支持向量机 交叉验证 网格搜索
2022-02-04 23:19:42

我在部分训练集上运行支持向量机模型,结果如下:

alg = sk.svm.SVC(probability=True, gamma='auto')
cv_results = model_selection.cross_validate(alg, X_pca, labels, cv =4)

在此处输入图像描述

但是当我尝试调整参数时,使用以下方法:

model=sk.svm.SVC()
params = {'C' : [0.01, 0.1, 1, 10],
      'gamma' : [0.1, 1, 'auto'],
      'probability' : [True] 
     }
clf =  GridSearchCV(model, params, cv=2, return_train_score=False).fit(X_pca, labels)
pd.DataFrame(clf.cv_results_).loc[:, ['mean_test_score', 'rank_test_score', 'params']].sort_values(by='rank_test_score')

在此处输入图像描述

因此,不仅所有结果看起来都很糟糕,因为它们是相同的。但也在其中一行中我有 C:1, gamma:auto 和 probability: True ,这与第一个表中的参数相同。

我还想说,我在其余 15 个 ML 算法中使用的逻辑相同,只有 SVM 表现出这种奇怪的行为。想知道也许我在创建 X_pca 和标签数据表时犯了一些愚蠢的错误,我从其他算法中复制了代码,只是替换了第二个代码,但它给出了相同的结果。

你能看出哪里不对吗?

1个回答

我认为问题可能是由于数据,因为这段代码:

from sklearn import svm
from sklearn.model_selection import GridSearchCV
import pandas as pd
import numpy as np

X_pca = np.random.rand(100, 2)
labels = X_pca[:, 0] + X_pca[:, 1] > 0.5

model = svm.SVC()
params = {'C' : [0.01, 0.1, 1, 10],
      'gamma' : [0., 0.1, 1, 'auto'],
      'probability' : [True] 
     }
clf =  GridSearchCV(model, params, cv=2, return_train_score=False)
clf.fit(X_pca, labels)

print(pd.DataFrame(clf.cv_results_).loc[:, ['mean_test_score', 'rank_test_score']] \
        .sort_values(by='rank_test_score'))

提供更好的输出:

    mean_test_score  rank_test_score
10             1.00                1
13             1.00                1
14             1.00                1
15             1.00                1
11             0.95                5
0              0.83                6
1              0.83                6
2              0.83                6
3              0.83                6
4              0.83                6
5              0.83                6
6              0.83                6
7              0.83                6
8              0.83                6
9              0.83                6
12             0.83                6

(考虑到结果将取决于rand函数的种子这一事实,但对于其他种子,它们是相似的,并且平均测试分数使用不同的参数值而变化。