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

时间:2019-05-04 22:21:10

标签: python scikit-learn svm scikit-image

我正在使用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。我认为一定有问题,但我不知道。谢谢!!!

1 个答案:

答案 0 :(得分:0)

我可以评论一下您获得相同的精度和召回率;

根据documentation

  

请注意,如果包括所有标签,则“   多类设置将产生精度,召回率,而这一切   与准确性相同。另请注意,“加权”平均可能会产生   不在精度和召回率之间的F分数。

要更改平均,只需传递average参数:

metrics.classification_report(y_test, y_pred, average='..')

然后根据您的数据选择值。以下内容将帮助您选择正确的值:

  

在将二进制指标扩展到多类或多标签问题时,   数据被视为二进制问题的集合,每个二进制问题   类。然后,有多种方法可以对二进制指标求平均   一组类中的计算,每种计算在   一些情况。在可用的情况下,您应该使用以下选项进行选择   平均参数。

     
      
  • “宏” 仅计算二进制指标的均值,等于   每个班级的体重。在不常上课的问题中   但是,重要的是,宏平均可能是一种突出显示方式   他们的表现。另一方面,假设所有类别   同样重要的是常常是不正确的,这样宏平均会   过分强调了不经常上课的学生通常表现不佳的情况。
  •   
  • “加权” 通过计算   二进制指标,其中每个班级的得分都根据其存在情况进行加权   在真实的数据样本中。
  •   
  • “微型” 为每个样本类对赋予相等的值   对整体指标的贡献(由于   样本权重)。而不是对每个类的指标求和   构成每个类别指标的股息和除数   计算总商。微平均可能是首选   多标签设置,包括多类分类,其中   多数阶级将被忽略。

  •   
  • “样本” 仅适用于多标签   问题。它不计算每个类别的度量,而是   计算每个类别的真实和预测类的指标   评估数据中的样本,并返回它们   (sample_weight-weighted)平均值。

  •   
  • 选择average=None将返回   包含每个班级得分的数组。
  •