Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.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 scikits cross_val_分数中所有等级的f1分数_Python_Scikit Learn_Cross Validation - Fatal编程技术网

Python scikits cross_val_分数中所有等级的f1分数

Python scikits cross_val_分数中所有等级的f1分数,python,scikit-learn,cross-validation,Python,Scikit Learn,Cross Validation,我正在使用scikit learn(软件包sklearn.cross\u validation)中的cross\u val\u分数来评估我的分类器。 如果我对评分参数使用f1,函数将返回一个类的f1评分。为了得到平均分,我可以使用f1_加权,但我不知道如何得到其他班级的f1分数。(精确性和召回率类似) sklearn.metrics中的函数有一个执行此操作的labels参数,但我在文档中找不到类似的参数 是否有一种方法可以一次获得所有课程的f1分数,或者至少指定应考虑使用cross\u val\

我正在使用scikit learn(软件包
sklearn.cross\u validation
)中的
cross\u val\u分数来评估我的分类器。
如果我对
评分
参数使用
f1
,函数将返回一个类的f1评分。为了得到平均分,我可以使用
f1_加权
,但我不知道如何得到其他班级的f1分数。(精确性和召回率类似)

sklearn.metrics
中的函数有一个执行此操作的
labels
参数,但我在文档中找不到类似的参数


是否有一种方法可以一次获得所有课程的f1分数,或者至少指定应考虑使用
cross\u val\u分数的课程?

要计算f1分数,我们可以使用sklearn.metrics.f1\u分数

示例代码

from sklearn import svm
from sklearn import metrics
from sklearn.cross_validation import train_test_split
from sklearn.datasets import load_iris
from sklearn.metrics import f1_score, accuracy_score

# prepare dataset
iris = load_iris()
X = iris.data[:, :2]
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# svm classification
clf = svm.SVC(kernel='rbf', gamma=0.7, C = 1.0).fit(X_train, y_train)
y_predicted = clf.predict(X_test)

# performance
print "Classification report for %s" % clf
print metrics.classification_report(y_test, y_predicted)

print("F1 micro: %1.4f\n" % f1_score(y_test, y_predicted, average='micro'))
print("F1 macro: %1.4f\n" % f1_score(y_test, y_predicted, average='macro'))
print("F1 weighted: %1.4f\n" % f1_score(y_test, y_predicted, average='weighted'))
print("Accuracy: %1.4f" % (accuracy_score(y_test, y_predicted)))
样本输出

Classification report for SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape=None, degree=3, gamma=0.7, kernel='rbf',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)
             precision    recall  f1-score   support

          0       1.00      0.90      0.95        10
          1       0.50      0.88      0.64         8
          2       0.86      0.50      0.63        12

avg / total       0.81      0.73      0.74        30

F1 micro: 0.7333

F1 macro: 0.7384

F1 weighted: 0.7381

Accuracy: 0.7333

使用
make\u scorer
函数创建记分器时,可以传递所需的任何附加参数,如下所示:

cross_val_score(
    svm.SVC(kernel='rbf', gamma=0.7, C = 1.0),
    X, y,
    scoring=make_scorer(f1_score, average='weighted', labels=[2]),
    cv=10)

但是
cross\u val\u score
只允许您返回一个分数。如果没有额外的技巧,你不可能同时获得所有课程的分数。如果您需要,请参考另一个堆栈溢出问题,该问题正好涵盖了这一点:

对于每个类的单独分数,请使用以下内容:

f1=f1_分数(y_测试,y_预测,平均值=无)
打印(“f1列表无意图:”,f1)

谢谢,但这不是我想要的<代码>交叉验证分数
进行交叉验证并计算分数。使用您的方法,我仍然需要实现交叉验证和分数聚合,而且我仍然无法获得每个类的f1分数。我有一个可行的实现,但我希望使用尽可能多的标准函数来简化代码。