Jus*_*ife 10 machine-learning svm scikit-learn
我已经尝试了许多关于F1微型和精确度的scikit-learn的例子,在所有这些例子中,我看到F1 micro与Accuracy相同.这总是如此吗?
脚本
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)))
Run Code Online (Sandbox Code Playgroud)
产量
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
Run Code Online (Sandbox Code Playgroud)
F1微=准确度
sha*_*sha 12
在保证每个测试用例仅分配给一个类的分类任务中,micro-F等同于准确性.在多标签分类中不会出现这种情况.
小智 11
这是因为我们正在处理多类分类,其中每个测试数据应该只属于 1 类而不是多标签,在没有 TN 的情况下,我们可以将 True Negatives 称为 True Positives。
公式明智,
校正:F1 分数为 2* 精度* 召回率 / (精度 + 召回率)
小智 7
对于每个实例必须分类为一个(且仅一个)类的情况,微平均精度、召回率、f1 和准确率都是相等的。了解这一点的一个简单方法是查看公式:精度=TP/(TP+FP) 和召回率=TP/(TP+FN)。分子是相同的,一个类的每个 FN 都是另一类的 FP,这使得分母也相同。如果精度 = 召回率,那么 f1 也将相等。
对于任何输入应该能够表明:
from sklearn.metrics import accuracy_score as acc
from sklearn.metrics import f1_score as f1
f1(y_true,y_pred,average='micro')=acc(y_true,y_pred)
Run Code Online (Sandbox Code Playgroud)
小智 6
我有同样的问题,所以我调查并提出了这个:
仅仅考虑一下理论,每个数据集的准确率和准确率都不可能f1-score
完全相同。其原因是,f1-score
与真阴性无关,而准确性则不然。
通过获取数据集f1 = acc
并向其中添加真负例,您可以得到f1 != acc
。
>>> from sklearn.metrics import accuracy_score as acc
>>> from sklearn.metrics import f1_score as f1
>>> y_pred = [0, 1, 1, 0, 1, 0]
>>> y_true = [0, 1, 1, 0, 0, 1]
>>> acc(y_true, y_pred)
0.6666666666666666
>>> f1(y_true,y_pred)
0.6666666666666666
>>> y_true = [0, 1, 1, 0, 1, 0, 0, 0, 0]
>>> y_pred = [0, 1, 1, 0, 0, 1, 0, 0, 0]
>>> acc(y_true, y_pred)
0.7777777777777778
>>> f1(y_true,y_pred)
0.6666666666666666
Run Code Online (Sandbox Code Playgroud)