我正在使用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。我认为一定有问题,但我不知道。谢谢!!!
答案 0 :(得分:0)
我可以评论一下您获得相同的精度和召回率;
请注意,如果包括所有标签,则“ 多类设置将产生精度,召回率,而这一切 与准确性相同。另请注意,“加权”平均可能会产生 不在精度和召回率之间的F分数。
要更改平均,只需传递average
参数:
metrics.classification_report(y_test, y_pred, average='..')
然后根据您的数据选择值。以下内容将帮助您选择正确的值:
在将二进制指标扩展到多类或多标签问题时, 数据被视为二进制问题的集合,每个二进制问题 类。然后,有多种方法可以对二进制指标求平均 一组类中的计算,每种计算在 一些情况。在可用的情况下,您应该使用以下选项进行选择 平均参数。
- “宏” 仅计算二进制指标的均值,等于 每个班级的体重。在不常上课的问题中 但是,重要的是,宏平均可能是一种突出显示方式 他们的表现。另一方面,假设所有类别 同样重要的是常常是不正确的,这样宏平均会 过分强调了不经常上课的学生通常表现不佳的情况。
- “加权” 通过计算 二进制指标,其中每个班级的得分都根据其存在情况进行加权 在真实的数据样本中。
“微型” 为每个样本类对赋予相等的值 对整体指标的贡献(由于 样本权重)。而不是对每个类的指标求和 构成每个类别指标的股息和除数 计算总商。微平均可能是首选 多标签设置,包括多类分类,其中 多数阶级将被忽略。
“样本” 仅适用于多标签 问题。它不计算每个类别的度量,而是 计算每个类别的真实和预测类的指标 评估数据中的样本,并返回它们 (sample_weight-weighted)平均值。
- 选择
average=None
将返回 包含每个班级得分的数组。