![](/img/trans.png)
[英]How to return average score for precision, recall and F1-score from Sklearn Classification report?
[英]Why F1-score, Recall, Precision all equal to 1? (image classification linearSVM)
我正在使用SVM分类器进行图像分类。 但是,在运行代码后,F1分数,精度和召回都等于1.我不知道它是如何发生的。
例如,该文件夹是Image_MRI,其包含两个名为AD_images_MRI
(1120图像)和CN_images_MRI
(552图像)的子文件夹。
AD_images_MRI
的文件名,例如, 0341_AD_axial_001_MRI.jpg
, 0341_AD_axial_002_MRI.jpg
CN_images_MRI
的文件名,例如, 0983_CN_axial_001_MRI.jpg
, 0985_CN_axial_002_MRI.jpg
import os,sys,glob
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
from sklearn import svm, metrics, datasets
from sklearn.utils import Bunch
from sklearn.model_selection import GridSearchCV, train_test_split
from skimage.io import imread
from skimage.transform import resize
def load_image_files(container_path, dimension=(64, 64)):
image_dir = Path(container_path)
folders = [directory for directory in image_dir.iterdir() if directory.is_dir()]
categories = [fo.name for fo in folders]
descr = "A image classification dataset"
images = []
flat_data = []
target = []
for i, direc in enumerate(folders):
for file in direc.iterdir():
img = imread(file)
img_resized = resize(img, dimension, anti_aliasing=True, mode='reflect')
flat_data.append(img_resized.flatten())
images.append(img_resized)
target.append(i)
flat_data = np.array(flat_data)
target = np.array(target)
images = np.array(images)
return Bunch(data=flat_data,
target=target,
target_names=categories,
images=images,
DESCR=descr)
image_dataset = load_image_files("Image_MRI/")
X_train, X_test, y_train, y_test = train_test_split(
image_dataset.data, image_dataset.target, test_size=0.3,random_state=109)
param_grid = [{'C': [1, 10, 100, 1000], 'kernel': ['linear']}]
svc = svm.SVC()
clf = GridSearchCV(svc, param_grid)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print("Classification report for - \n{}:\n{}\n".format(
clf, metrics.classification_report(y_test, y_pred)))
Classification report for -
GridSearchCV(cv='warn', error_score='raise-deprecating',
estimator=SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovr', degree=3, gamma='auto_deprecated',
kernel='rbf', max_iter=-1, probability=False, random_state=None,
shrinking=True, tol=0.001, verbose=False),
fit_params=None, iid='warn', n_jobs=None,
param_grid=[{'C': [1, 10, 100, 1000], 'kernel': ['linear']}],
pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',
scoring=None, verbose=0):
precision recall f1-score support
0 1.00 1.00 1.00 161
1 1.00 1.00 1.00 341
micro avg 1.00 1.00 1.00 502
macro avg 1.00 1.00 1.00 502
weighted avg 1.00 1.00 1.00 502
我想知道为什么这些结果都等于1.00。 我认为一定有问题,但我不知道。 谢谢!!!
我可以评论一下你获得同样的精确度和回忆的事实;
根据文件 ,
请注意,如果包含所有标签,多类设置中的“微观”平均将产生精确度,召回率,并且都与精度相同。 另请注意,“加权”平均可能会产生不在精度和召回之间的F分数。
要更改平均值,只需传递average
参数:
metrics.classification_report(y_test, y_pred, average='..')
并根据您的数据选择值。 以下内容可帮助您选择正确的值:
在将二进制度量扩展到多类或多标记问题时,数据被视为二进制问题的集合,每个类对应一个问题。 然后有许多方法可以在这组类中平均二进制度量计算,每种方法在某些情况下都很有用。 如果可用,您应该使用平均参数在这些中进行选择。
- “宏”只是计算二元度量的平均值,给每个类赋予相同的权重。 在不常见的课程很重要的问题中,宏观平均可能是突出其表现的一种手段。 另一方面,所有类别同等重要的假设通常是不真实的,因此宏观平均将过度强调不常见的类别上通常较低的性能。
- “加权”通过计算二进制度量的平均值来解释类别不平衡,其中每个类别的分数通过其在真实数据样本中的存在来加权。
“micro”使每个样本类对对整体度量的贡献相等(除了样本权重的结果)。 这不是对每个类的度量进行求和,而是将构成每类度量的红利和除数相加以计算总商。 在多标记设置中可能优选微平均,包括多类分类,其中多数类被忽略。
“样本”仅适用于多标签问题。 它不计算每类度量,而是计算评估数据中每个样本的真实和预测类别的度量,并返回它们的(sample_weight-weighted)平均值。
- 选择
average=None
将返回一个包含每个类得分的数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.