Почему F1-оценка, Recall, Precision все равны 1? (классификация изображений linearSVM) - PullRequest
0 голосов
/ 05 мая 2019

Я работаю над классификацией изображений с использованием классификатора 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. Я думаю, должно быть что-то не так, но я понятия не имею. Спасибо !!!

1 Ответ

0 голосов
/ 05 мая 2019

Я могу прокомментировать тот факт, что вы получаете ту же точность и вспомнить;

Согласно документации ,

Обратите внимание, что если все метки включены, «микро» -средня в настройка мультикласса будет производить точность, вспомнить и все идентичны точности. Также обратите внимание, что «взвешенное» усреднение может привести к F-оценка, которая не находится между точностью и отзывом.

Чтобы изменить усреднение, просто передайте параметр average:

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

И выберите значение на основе ваших данных. Следующее должно помочь вам выбрать правильное значение:

Расширяя двоичную метрику для задач мультикласса или мультиметки, данные рассматриваются как набор бинарных задач, по одной на каждую учебный класс. Существует несколько способов усреднить двоичную метрику. расчеты по множеству классов, каждый из которых может быть полезен в какой-то сценарий. Где доступно, вы должны выбрать среди них, используя средний показатель.

  • "macro" просто вычисляет среднее значение двоичных метрик, давая равные вес для каждого класса. В задачах, где редкие занятия тем не менее важно, что макро-усреднение может быть средством выделения их производительность. С другой стороны, предположение, что все классы одинаково важны, часто не соответствуют действительности, так что переоценить типично низкую производительность в нечастом классе.
  • «взвешенный» учитывает дисбаланс классов путем вычисления среднего значения двоичные метрики, в которых оценка каждого класса взвешивается его присутствием в истинной выборке данных.
  • "микро" дает каждой паре класса выборки равный вклад в общую метрику (кроме как в результате Образец весом). Вместо суммирования метрики для класса, это суммы дивиденды и делители, которые составляют показатели класса для рассчитать общий коэффициент. Микроусреднение может быть предпочтительным в настройки нескольких меток, включая классификацию мультиклассов, где класс большинства следует игнорировать.

  • «образцы» относится только к мультиметке проблемы. Вместо этого он не рассчитывает показатель для каждого класса Расчет метрики по истинным и прогнозируемым классам для каждого образец в оценочных данных и возвращая их (образец-взвешенный) средний.

  • Выбор average=None вернет массив с оценкой для каждого класса.
...