Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中多类SVM的GridSearchCV_Python_Scikit Learn_Svm_Grid Search - Fatal编程技术网

python中多类SVM的GridSearchCV

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.

我试图学习如何为分类器找到最佳参数。因此,我使用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.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,)