Python 以f1为评分函数的网格搜索,错误消息数页

Python 以f1为评分函数的网格搜索,错误消息数页,python,scikit-learn,grid-search,Python,Scikit Learn,Grid Search,希望使用Gridsearch查找最佳参数,并使用f1作为评分标准 如果我删除评分功能,所有的工作都很好,我没有得到错误 这是我的密码: from sklearn import grid_search parameters = {'n_neighbors':(1,3,5,10,15),'weights':('uniform','distance'),'algorithm':('ball_tree','kd_tree','brute'),'leaf_size':(5,10,20,30,50)} r

希望使用Gridsearch查找最佳参数,并使用f1作为评分标准

如果我删除评分功能,所有的工作都很好,我没有得到错误

这是我的密码:

from sklearn import grid_search 
parameters = {'n_neighbors':(1,3,5,10,15),'weights':('uniform','distance'),'algorithm':('ball_tree','kd_tree','brute'),'leaf_size':(5,10,20,30,50)}
reg = grid_search.GridSearchCV(estimator=neigh,param_grid=parameters,scoring="f1")
train_classifier(reg, X_train, y_train)
train_f1_score = predict_labels(reg, X_train, y_train)
print reg.best_params_
print "F1 score for training set: {}".format(train_f1_score)
print "F1 score for test set: {}".format(predict_labels(reg, X_test, y_test))
当我执行时,我会一页接一页地将其视为错误,我无法对其做出正面或反面的判断:(

ValueError回溯(最近一次调用)
在()
3个参数={'n_邻居':(1,3,5,10,15),'weights':('uniform','distance'),'algorithm':('ball_tree','kd_tree','brute'),'leaf_size':(5,10,20,30,50)}
4 reg=网格搜索。网格搜索CV(估计器=neigh,参数网格=参数,评分=“f1”)
---->5列分类器(reg、X列、y列)
6列车f1\U分数=预测标签(reg、X\U列车、y\U列车)
7打印注册最佳参数_
列内分类器(clf、X列、y列)
5打印“培训{}…”格式(clf.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
6开始=时间。时间()
---->7 clf.装配(X_系列、y_系列)
8结束=时间。时间()
9打印“完成!\n打印时间(秒):{.3f}”。格式(结束-开始)
//anaconda/lib/python2.7/site-packages/sklearn/grid_search.pyc in-fit(self,X,y)
802
803         """
-->804返回自拟合(X,y,参数网格(自参数网格))
805
806
//anaconda/lib/python2.7/site-packages/sklearn/grid_search.pyc in_fit(self,X,y,parameter_iterable)
551 self.fit_参数,返回_参数=True,
552错误分数=自我错误分数)
-->553用于参数_iterable中的参数
554用于列车,在cv中进行试验)
555
//anaconda/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in_u_调用(self,iterable)
802自迭代=真
803
-->804自调度一批时(迭代器):
805通行证
806
//anaconda/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc在dispatch_one_批处理中(self,迭代器)
660返回错误
661其他:
-->662自我派遣(任务)
663返回真值
664
//anaconda/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in_dispatch(self,batch)
568
569如果self.\u池为无:
-->570作业=立即计算机批处理(批处理)
571自我作业。附加(作业)
572自编号已发送批次+=1
//anaconda/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in_u_init__;(self,batch)
181#不要延迟应用程序,以免保留输入
182#内存中的参数
-->183 self.results=batch()
184
185 def get(自我):
//anaconda/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in____________(self)
70
71定义呼叫(自我):
--->72返回[func(*args,**kwargs),用于self.items中的func、args、kwargs]
73
74定义(自我):
//anaconda/lib/python2.7/site-packages/sklearn/cross_validation.pyc in_fit_和_分数(估计器、X、y、计分器、训练、测试、详细、参数、拟合参数、返回训练分数、返回参数、错误分数)
1548
1549其他:
->1550测试分数=_分数(估计员、X测试、y测试、计分员)
1551如果返回列车评分:
1552训练分数=_分数(估计员、X训练、y训练、计分员)
//anaconda/lib/python2.7/site-packages/sklearn/cross_validation.pyc in_分数(估计器、X_测试、y_测试、计分器)
1604分数=记分员(估计员,X_检验)
1605其他:
->1606分数=记分员(估计员、X_检验、y_检验)
1607如果不存在(分数、数字、数字):
1608 raise VALUE ERROR(“评分必须返回一个数字,取而代之的是%s(%s)。”
//anaconda/lib/python2.7/site-packages/sklearn/metrics/scorer.pyc in_uuuu调用(self,估计器,X,y_真,样本重量)
88.其他:
89返回self.\u签名*self.\u分数\u函数(y\u真,y\u pred,
--->90**self._-kwargs)
91
92
//f1_分数中的anaconda/lib/python2.7/site-packages/sklearn/metrics/classification.pyc(y_真、y_pred、标签、位置标签、平均值、样本重量)
637返回fbeta_分数(y_true,y_pred,1,标签=标签,
638位置标签=位置标签,平均值=平均值,
-->639样品重量=样品重量)
640
641
//fbeta_分数中的anaconda/lib/python2.7/site-packages/sklearn/metrics/classification.pyc(y_真、y_pred、beta、标签、位置标签、平均值、样本重量)
754平均值=平均值,
755 warn_for=('f-score',),
-->756样品重量=样品重量)
757返回f
758
//anaconda/lib/python2.7/site-packages/sklearn/metrics/classification.pyc的精确性、召回率、核心支持率(y_真、y_pred、beta、标签、位置标签、平均值、警告、样本重量)
982其他:
983提升值错误(“位置标签=%r不是有效标签:%r”%
-->984(位置标签、当前标签))
985标签=[位置标签]
986如果标签为无:
ValueError:pos_label=1不是有效的标签:数组(['no','yes'],
数据类型=“| S3”)

似乎您的标签数组的值为“否”和“是”,您应该将它们转换为二进制1-0数字表示,因为您的错误表明评分函数无法理解0和1在标签数组中的位置

在不修改标签数组的情况下解决此问题的其他可能方法:

from sklearn.metrics import f1_score
from sklearn.metrics import make_scorer

f1_scorer = make_scorer(f1_score, pos_label="yes")
reg = grid_search.GridSearchCV(estimator=neigh,param_grid=parameters,scoring=f1_scorer)

我理解您的想法和我的错误。不幸的是,如果我使用您提出的解决方案,我仍然会遇到这些错误:
from sklearn.metrics import f1_score
from sklearn.metrics import make_scorer

f1_scorer = make_scorer(f1_score, pos_label="yes")
reg = grid_search.GridSearchCV(estimator=neigh,param_grid=parameters,scoring=f1_scorer)