python中多类SVM的GridSearchCV

kri*_*hna 3 python svm scikit-learn grid-search

我正在尝试学习如何为分类器找到最佳参数。因此,我将GridSearchCV用于多类分类问题。上生成一个虚拟的代码确实不GridSearchCV支持多级的?我只是使用 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)
Run Code Online (Sandbox Code Playgroud)

我正在尝试按照此处的建议进行One-hot 编码Scikit-learn GridSearch 给出 "ValueError: multiclass format is not supported" error。此外,有时会有像Toxic Comment Classification dataset on Kaggle这样的数据集会给你二值化标签。

y = label_binarize(y, classes=[0, 1, 2])
for i in classes:    
gscv.fit(X, y[i])

print gscv.best_params_
Run Code Online (Sandbox Code Playgroud)

我正进入(状态:

ValueError: bad input shape (2000L, 3L)
Run Code Online (Sandbox Code Playgroud)

我不确定为什么会收到此错误。我的目标是为多类分类问题找到最佳参数。

Viv*_*mar 5

你的代码的两部分有两个问题。

1)让我们从第一部分开始,当您还没有对标签进行单热编码时。你看,SVC支持多类情况就好了。但是f1_score当与 (inside) 结合时GridSearchCV则不然。

f1_score 默认情况下,在二进制分类的情况下返回正标签的分数,因此在您的情况下会抛出错误。

OR它也可以返回一组分数(每个类一个),但 GridSearchCV 只接受一个值作为分数,因为它需要它来找到最佳分数和超参数的最佳组合。因此,您需要传入平均方法f1_score以从数组中获取单个值。

根据f1_score文档,允许使用以下平均方法:

平均值:字符串,[无,'二进制'(默认),'微','宏','样本','加权']

所以像这样改变你的 make_scorer :

my_scorer = make_scorer(f1_score, greater_is_better=True, average='micro')
Run Code Online (Sandbox Code Playgroud)

根据您的需要更改'average'上面的参数。

2)现在进入第二部分:当您对标签进行单热编码时, 的形状y变为二维,但SVC仅支持y文档中指定的一维数组:

fit(X, y, sample_weight=None)[source]

    X : {array-like, sparse matrix}, shape (n_samples, n_features)
    y : array-like, shape (n_samples,)
Run Code Online (Sandbox Code Playgroud)

但即使您对标签进行编码并使用支持二维标签的分类器,也必须解决第一个错误。因此,我建议您不要对标签进行一次性编码,而只需更改f1_score.