GridSearchCV用于python中的多类SVM
作者:互联网
我正在尝试学习如何为分类器找到最佳参数.所以,我使用GridSearchCV来解决多类分类问题.在Does not GridSearchCV support multi-class?上生成了一个虚拟代码我正在使用n_classes = 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.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)
我正在尝试按照这里建议的一热编码Scikit-learn GridSearch giving “ValueError: multiclass format is not supported” error.此外,有时会有像Kaggle上的Toxic Comment Classification数据集这样的数据集,它会为您提供二值化标签.
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_score不会.
在二进制分类的情况下,f1_score默认返回正标签的分数,因此会在您的情况下抛出错误.
或者它也可以返回一个分数数组(每个类一个),但GridSearchCV只接受一个值作为分数,因为它需要找到最佳分数和超参数的最佳组合.因此,您需要在f1_score中传递平均方法以从数组中获取单个值.
根据f1_score
documentation,允许采用平均方法:
average : string, [None, ‘binary’ (default), ‘micro’, ‘macro’,
‘samples’, ‘weighted’]
所以像这样改变你的make_scorer:
my_scorer = make_scorer(f1_score, greater_is_better=True, average='micro')
根据您的需要更改上面的“平均”参数.
2)现在进入第二部分:当您对标签进行单热编码时,y的形状变为2-d,但SVC
仅支持1-d数组,如文档中指定的y:
06001
但即使您对标签进行编码并使用支持2-d标签的分类器,也必须解决第一个错误.所以我建议你不要对标签进行单热编码,只需更改f1_score即可.
标签:grid-search,python,scikit-learn,svm 来源: https://codeday.me/bug/20190910/1799375.html