《Hands-On Machine Learning with Scikit-Learn and TensorFlow》 学习笔记第三篇----分类模型

傅新
2023-12-01

Mnist分类器

一、数据准备

从tensorflow下载mnist数据

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets('/content',one_hot=True)

查看训练数据的大小
print(mnist.train.images.shape)  # (55000, 784)
print(mnist.train.labels.shape)  # (55000, 10)

查看验证数据的大小
print(mnist.validation.images.shape)  # (5000, 784)
print(mnist.validation.labels.shape)  # (5000, 10)

查看测试数据的大小
print(mnist.test.images.shape)  # (10000, 784)
print(mnist.test.labels.shape)  # (10000, 10)

打印出第0幅图片的向量表示
print(mnist.train.images[0, :])

打印出第0幅图片的标签
print(mnist.train.labels[0, :])

从keras下载mnist数据

from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

二、训练模型

三、评估模型

详见模型评估方法

交叉验证cross_val_score

准确率通常无法成为分类器的首要性能指标,特别是当你
处理偏斜数据集(skewed dataset)的时候(即某些类比其他类更为频
繁)所以用cross_val_score交叉验证不行

混淆矩阵confusion_matrix

画出混淆矩阵

conf_mx=confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)
plt.matshow(conf_mx, cmap=plt.cm.gray)
plt.show()

分析:
稍暗一些的地方,这可能意味着数据集中这些样本的图片较少,也可能是分类器在这些样本上的执行效果不如在其他样本分类上好。
改进:
将混淆矩阵中的每个值除以相应类别中的图片数量,用0填充对角线,只保留错误,重新绘制结果

row_sums = conf_mx.sum(axis=1, keepdims=True)
norm_conf_mx = conf_mx / row_sums
np.fill_diagonal(norm_conf_mx, 0)
plt.matshow(norm_conf_mx, cmap=plt.cm.gray)
plt.show()

三个指标

召回率:实际为正的样本中被预测为正样本的概率recall_score(y_true, y_pred)
查准率:所有被预测为正的样本中实际为正的样本的概率precision_score(y_true, y_pred)
F1值:查准率和召回率的调和值f1_score(y_true, y_pred)

可以使用precision_recall_curve() 函数来计算所有可能的阈值的精度和召回率,并画图。目的寻找阈值,提高阈值确实可以降低召回率,通过轻松选择阈值来实现最佳的精度/召回率权衡,改变阈值可以实现一个你想要的精度分类器

from sklearn.metrics import precision_recall_curve

precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)
def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):
    plt.plot(thresholds, precisions[:-1], "b--", label="Precision", linewidth=2)
    plt.plot(thresholds, recalls[:-1], "g-", label="Recall", linewidth=2)
    plt.xlabel("Threshold", fontsize=16)
    plt.legend(loc="upper left", fontsize=16)
    plt.ylim([0, 1])

plt.figure(figsize=(8, 4))
plot_precision_recall_vs_threshold(precisions, recalls, thresholds)
plt.xlim([-700000, 700000])
save_fig("precision_recall_vs_threshold_plot")
plt.show()

二元分类器ROC曲线

二分类的时候,可以利用roc_curve计算fpr,tpr,和阈值thresholds;并画出roc曲线,利用roc_auc_score计算auc的值

fpr,tpr,thresholds=roc_curve(y_test,y_pred, pos_label=None, sample_weight=None, drop_intermediate=True)
print (tpr,fpr,thresholds)
auc = auc(fpr, tpr)#计算auc的值,在(0,1)之间,根据曲线上的点,然后计算AUC值
auc = roc_auc_score(y_true, y_pred)#计算auc的值,在(0,1)之间,根据真实值(必须是二值)、预测值
plt.plot(fpr, tpr, lw=1, label='ROC(area = %0.2f)' % (roc_auc))
plt.xlabel("FPR (False Positive Rate)")
plt.ylabel("TPR (True Positive Rate)")
plt.title("Receiver Operating Characteristic, ROC(AUC = %0.2f)"% (roc_auc))
plt.show()

两种计算AUC方法

  • auc = auc(fpr, tpr)
    #计算auc的值,在(0,1)之间,根据曲线上的点,然后计算AUC值
  • auc = roc_auc_score(y_true, y_pred)
    #计算auc的值,在(0,1)之间,根据真实值(必须是二值)、预测值

对角线表示纯随机分类器的ROC曲线;一个优秀的分类器应该离这条线越远越好(向左上角) 。测量曲线下面积(AUC),面积越接近1,分类效果越好。

 类似资料: