繁体   English   中英

为什么F1-score,Recall,Precision都等于1? (图像分类linearSVM)

[英]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.jpg0341_AD_axial_002_MRI.jpg

CN_images_MRI的文件名,例如, 0983_CN_axial_001_MRI.jpg0985_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM