使用SAME参数时,GridSearchCV的性能比普通SVM差

时间:2018-10-22 18:30:38

标签: python machine-learning scikit-learn svm grid-search

社区。

我正在编码一些ML,以将一些数据分类。

我尝试了不同的方法,但是当我使用SVM时遇到了这个问题。

我有一组简单的数据(3个类,6个功能),当我使用带有固定参数( C = 10 gamma = 1 )的SVM时,我预测在相同数据上我可以获得100%的准确性(这些向量可能过拟合,但这是另一个问题)。

我很难理解的是,然后我尝试使用GridSearchCV(sklearn.model_selection.GridSearchCV),然后将C和gamma的10的所有幂从10 ^ -5扫到10 ^ 5(当然包括C = 10,且gamma = 1),并且它是best_params: C = 10 ^ -5 gamma = 10 ^ -5 。使用这些参数,准确性为41%,所有预测都属于一个类别

至少我应该能够预测与FIXED SVM相同的参数。 令人费解的是,以前相同的代码对其他数据集也起作用...

现在我的问题不是(因此,如果您回答,请不要讨论):

  1. 过度拟合,或将相同数据用于培训和测试;

  2. 一组不平衡的数据;

  3. 数据集问题。

我的问题只是为什么GridSearchCV的行为与普通SVM不同。我确信这一定是我在编写错误的代码,否则它们确实无法按预期工作。

代码如下:

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

xl= pd.ExcelFile('3classes_6_features.xlsx')
cont= xl.parse()

 # Encode labels:
labeling = preprocessing.LabelEncoder()
labeling.fit(cont[cont.keys()[0]])

### cont.keys()[0] == "GS"
y_all= labeling.transform(np.array(cont["GS"]))
X_all= np.array(cont.drop(["GS"],1))

# NORMAL SVM:
SVMclassifier= svm.SVC(kernel='rbf', gamma=1, C=10, random_state=0)
SVMclassifier.fit(X_all,y_all)

# SVM with HYPERPARAMETRIC TUNING:
log_sweep= [10**(i)/j for i in range(-5,5) for j in [2,1]]
SVMparam_grid = {'C': log_sweep, 'gamma': log_sweep}

SVMgrid_classifier= GridSearchCV(svm.SVC(kernel='rbf', random_state=0), SVMparam_grid)
SVMgrid_classifier= SVMgrid_classifier.fit(X_all,y_all)


print("INITIAL CLASSES: ", y_all)
print("NORMAL SVM prediction: ", SVMclassifier.predict(X_all))
print("TUNED SVM prediction: ", SVMgrid_classifier.predict(X_all))

结果是:

  

初始类别:[0 1 2 2 0 0 2 0 1 0 0 1 2 0 0 1 1 1 2 1 2]

     

正常SVM预测:[0 1 2 2 0 0 2 0 1 0 0 1 2 0 0 1 1 1 2 1 2]

     

TUNED SVM预测:[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

如果您想自己尝试,我会附加数据:

https://drive.google.com/open?id=1LPRiMFNeSXu790lG_-NP3HAkvq8vyLcV

谢谢!

此致

卢克

1 个答案:

答案 0 :(得分:2)

问题在于,当您使用“正常SVM”进行拟合和预测时,您将使用所有数据进行训练,然后对同一数据进行预测。

当您使用GridSearchCV时,默认情况下会执行K折交叉验证(检查参数'cv'),这意味着它将数据分为训练和验证,因此该模型从不训练整个数据集,而是在进行预测(验证)未经训练的数据-最佳参数取决于从验证步骤获得的最高得分。

然后选择交叉验证产生的最佳模型来执行预测。