python中多类SVM的GridSearchCV
我试图学习如何为分类器找到最佳参数。因此,我使用GridSearchCV来解决一个多类分类问题。生成了一个虚拟代码,我只是在n_类=3的情况下使用该代码python中多类SVM的GridSearchCV,python,scikit-learn,svm,grid-search,Python,Scikit Learn,Svm,Grid Search,我试图学习如何为分类器找到最佳参数。因此,我使用GridSearchCV来解决一个多类分类问题。生成了一个虚拟代码,我只是在n_类=3的情况下使用该代码 import numpy as np from sklearn.datasets import make_classification from sklearn.preprocessing import StandardScaler,label_binarize from sklearn.svm import SVC from sklearn.
import numpy as np
from sklearn.datasets import make_classification
from sklearn.preprocessing import StandardScaler,label_binarize
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
from sklearn.grid_search import GridSearchCV
from sklearn.metrics import accuracy_score, recall_score, f1_score, roc_auc_score, make_scorer
X, y = make_classification(n_samples=3000, n_features=10, weights=[0.1, 0.9, 0.3],n_classes=3, n_clusters_per_class=1,n_informative=2)
pipe = make_pipeline(StandardScaler(), SVC(kernel='rbf', class_weight='auto'))
param_space = dict(svc__C=np.logspace(-5,0,5), svc__gamma=np.logspace(-2, 2, 10))
f1_score
my_scorer = make_scorer(f1_score, greater_is_better=True)
gscv = GridSearchCV(pipe, param_space, scoring=my_scorer)
我正试图按照这里的建议进行一次热编码。此外,有时Kaggle上会出现类似于有毒评论分类数据集的数据集,这将为您提供二值化标签
y = label_binarize(y, classes=[0, 1, 2])
for i in classes:
gscv.fit(X, y[i])
print gscv.best_params_
我得到:
ValueError: bad input shape (2000L, 3L)
我不知道为什么会出现这个错误。我的目标是为多类分类问题找到最佳参数。代码的两部分中有两个问题
1) 当您没有对标签进行热编码时,让我们从第一部分开始。你看,SVC
很好地支持多类情况。但是当与(内部)GridSearchCV
组合时,f1_得分
f1_score
默认情况下,在二进制分类的情况下返回肯定标签的分数,因此在您的情况下会抛出错误
或它还可以返回一个分数数组(每个类一个),但GridSearchCV只接受一个值作为分数,因为它需要该值来查找最佳分数和超参数的最佳组合。因此,您需要通过f1\u score
中的平均方法从数组中获取单个值
根据标准,允许使用以下平均方法:
平均值:字符串,[无,'二进制'(默认值),'微','宏',
'样本','加权']
所以,像这样改变你的make_记分员:
my_scorer = make_scorer(f1_score, greater_is_better=True, average='micro')
根据需要更改上面的'average'
参数
2) 现在进入第二部分:当您对标签进行热编码时,y
的形状变为二维,但仅支持文档中指定的一维数组y
:
但是,即使您对标签进行编码并使用支持二维标签的分类器,也必须解决第一个错误。因此,我建议您不要对标签进行热编码,只需更改f1_分数
谢谢,@Vivek Kumar我可以手动选择y(目标)来解决问题#2。然而,我认为我需要在循环中适应(X,y)和GridSearch,我不确定我是否能做到这一点。这是主要的问题。对于类中的i:gscv.fit(X,y[i])
像这样。这样,我将只有1-D的标签。
fit(X, y, sample_weight=None)[source]
X : {array-like, sparse matrix}, shape (n_samples, n_features)
y : array-like, shape (n_samples,)