gpt4 book ai didi

python - 使用相同参数时,GridSearchCV 的性能比普通 SVM 差

转载 作者:行者123 更新时间:2023-11-30 09:32:24 30 4
gpt4 key购买 nike

社区。

我正在编写一些机器学习代码,将一些数据分类。

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

我有一组简单的数据(3 个类别,6 个特征),当我使用具有固定参数(C=10gamma=1)的 SVM 时,我使用相同的数据进行预测,我获得 100% 的准确率(这些可能是过度拟合的向量,但这是另一个问题)。

我觉得难以理解的是,然后我尝试 GridSearchCV (sklearn.model_selection.GridSearchCV),我扫描了 C 和 gamma 从 10^-5 到 10^5 的所有 10 次幂(这当然包括 C= 10 和 gamma=1),它发现 best_params:C=10^-5gamma=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))

结果是:

INITIAL CLASSES: [0 1 2 2 0 0 2 0 1 0 0 1 2 0 0 1 1 1 2 1 2]

NORMAL SVM prediction: [0 1 2 2 0 0 2 0 1 0 0 1 2 0 0 1 1 1 2 1 2]

TUNED SVM prediction: [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

提前致谢!

问候,

卢克

最佳答案

问题是,当您使用“普通 SVM”进行拟合和预测时,您使用所有数据进行训练,然后对相同的数据进行预测。

当您使用 GridSearchCV 时,它默认执行 K 折交叉验证(检查参数“cv”),这意味着它将把数据拆分为训练和验证,因此模型永远不会使用整个数据集进行训练,然后进行预测(验证)未训练的数据 - 最佳参数基于验证步骤中获得的最高分数。

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

关于python - 使用相同参数时,GridSearchCV 的性能比普通 SVM 差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52935644/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com