分类模型评估

混淆矩阵

混淆矩阵也称误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示。具体评价指标有总体精度、制图精度、用户精度等,这些精度指标从不同的侧面反映了图像分类的精度。 [1] 在人工智能中,混淆矩阵(confusion matrix)是可视化工具,特别用于监督学习,在无监督学习一般叫做匹配矩阵。在图像精度评价中,主要用于比较分类结果和实际测得值,可以把分类结果的精度显示在一个混淆矩阵里面。混淆矩阵是通过将每个实测像元的位置和分类与分类图像中的相应位置和分类相比较计算的。

import numpy as np
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
import matplotlib as mpl
import matplotlib.pyplot as plt
import warnings

mpl.rcParams["font.family"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False
warnings.filterwarnings("ignore")

X, y = make_classification(n_samples=200, n_features=2, n_informative=1, n_redundant=0,
        n_clusters_per_class=1, n_classes=2, random_state=3)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
lr = LogisticRegression()
lr.fit(X_train, y_train)
y_hat = lr.predict(X_test)
matrix = confusion_matrix(y_true=y_test, y_pred=y_hat)
print(matrix)

mat = plt.matshow(matrix, cmap=plt.cm.Blues, alpha=0.5)
label = ["负例", "正例"]
ax = plt.gca()
ax.set(xticks=np.arange(matrix.shape[1]), yticks=np.arange(matrix.shape[0]),
        xticklabels=label, yticklabels=label, title="混淆矩阵可视化",
        ylabel="真实值", xlabel="预测值")
for i in range(matrix.shape[0]):
    for j in range(matrix.shape[1]):
        plt.text(x=j, y=i, s=matrix[i, j], va="center", ha="center")
plt.show()

评估指标

正确率
精确率
召回率
F1(调和平均值)

正确率

正确率 = TP + TN / TP + TN + FP + FN

精确率

精确率 = TP / TP + FP

召回率

召回率 = TP / TP + FN

调和平均值F1

F1 = 2 * precision * recall / precision + pecall
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

print("正确率:", accuracy_score(y_test, y_hat))
# 默认将1类别视为正例,可以通过pos_label参数指定。
print("精准率:", precision_score(y_test, y_hat))
print("召回率:", recall_score(y_test, y_hat))
print("F1调和平均值:", f1_score(y_test, y_hat))
# 我们也可以调用逻辑回归模型对象的score方法,也能获取正确率。
# 但是需要注意,score方法与f1_score函数的参数是不同的。
print("score方法计算正确率:", lr.score(X_test, y_test))


另一种办法

from sklearn.metrics import classification_report

print(classification_report(y_true=y_test, y_pred=y_hat))

ROC

ROC曲线

接受者操作特性曲线是指在特定刺激条件下,以被试在不同判断标准下所得的虚报概率P(y/N)为横坐标,以击中概率P(y/SN)为纵坐标,画得的各点的连线。

AUC

AUC(Area Under Curve)被定义为ROC曲线下与坐标轴围成的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。AUC越接近1.0,检测方法真实性越高;等于0.5时,则真实性最低,无应用价值。

ROC代码

roc_curve函数参数

import numpy as np
from sklearn.metrics import roc_curve, auc, roc_auc_score
y = np.array([0, 0, 1, 1])
scores = np.array([0.2, 0.4, 0.35, 0.8])
# 返回ROC曲线相关值。返回FPR,TPR与阈值。当分值达到阈值时,将样本判定为正类,
# 否则判定为负类。
# y_true:二分类的标签值。
# y_score:每个标签(数据)的分值或概率值。当该值达到阈值时,判定为正例,否则判定为负例。
# 在实际模型评估时,该值往往通过决策函数(decision_function)或者概率函数(predict_proba)获得。
# pos_label:指定正例的标签值。
fpr, tpr, thresholds = roc_curve(y, scores, pos_label=1)
print(f"fpr:{fpr}")
print(f"tpr:{tpr}")
print(f"thresholds:{thresholds}")
# auc与roc_auc_score函数都可以返回AUC面积值,但是注意,两个函数的参数是不同的。
print("AUC面积值:", auc(fpr, tpr))
print("AUC面积得分:", roc_auc_score(y_true=y, y_score=scores))

ROC

plt.figure(figsize=(10, 6))
plt.plot(fpr, tpr, label="ROC")
plt.plot([0,1], [0,1], lw=2, ls="--", label="随机猜测")
plt.plot([0, 0, 1], [0, 1, 1], lw=2, ls="-.", label="完美预测")
plt.xlim(-0.01, 1.02)#设置X轴的最大和最小值
plt.ylim(-0.01, 1.02)#设置y轴的最大和最小值
plt.xticks(np.arange(0, 1.1, 0.1))
plt.yticks(np.arange(0, 1.1, 0.1))
plt.xlabel("False Positive Rate(FPR)", fontsize=16)
plt.ylabel("True Positive Rate(TPR)", fontsize=16)
plt.grid()
plt.title(f"ROC曲线-AUC值为{auc(fpr, tpr):.3f}", fontsize=16)
plt.legend()
plt.show()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值