当前位置 博文首页 > weixin_38753422的博客:盘一盘 Python 系列 9 - Scikit-Plot

    weixin_38753422的博客:盘一盘 Python 系列 9 - Scikit-Plot

    作者:[db:作者] 时间:2021-08-20 09:47

    640?wx_fmt=png


    全文共 17278 字,107 幅图, 预计阅读时间 66 分钟。
    文末有彩蛋!


    0引言


    本文是 Python 系列的第十二篇


    • Python 入门篇 (上)

    • Python 入门篇 (下)

    • 数组计算之 NumPy (上)

    • 数组计算之 NumPy (下)

    • 科学计算之 SciPy

    • 数据结构之 Pandas (上)

    • 数据结构之 Pandas (下)

    • 基本可视化之 Matplotlib

    • 统计可视化之 Seaborn

    • 炫酷可视化之 PyEcharts

    • 机器学习之 Sklearn

    • 机学可视化之 Scikit-Plot

    • 深度学习之?Keras

    • 深度学习之TensorFlow

    • 深度学习之 PyTorch

    • 深度学习之 MXnet




    当机器学习工具?Scikit-Learn 遇上了可视化工具 Matplotlib,就衍生出?Scikit-Plot。?


    Scikit-Plot 是由 Reiichiro Nakano 创建的用在机器学习的可视化工具。它简直就是玩机器学习的数据科学家的福音,能最快速简洁的画出用 Matplotlib 要写很多行语句才能画出的图。每个人都喜欢用一行代码 (one-liner) 完成任务。?


    安装 Scikit-Plot 非常简单。

    pip install scikit-plot

    注:要运行 Scikit-Plot 里面的函数,确定你已经安装好了 Scikit-Learn 和 Matplotlib。


    要使用 Scikit-Plot,首先要引用它并起个别名skplt

    import scikitplot as skplt


    Scikit-Plot 有四大模块,度量模块、估计器模块、聚类模块和降维模块。如下图所示


    640?wx_fmt=png



    从 Scikit-Plot 官网中,搜集出这四大模块里所有的细分函数:


    • scikitplot.metrics

      • plot_confusion_matrix分类的混淆矩阵

      • plot_precision_recall分类的查准查全

      • plot_roc分类的 ROC 曲线

      • plot_ks_statistic

      • plot_silhouette度量聚类好坏的轮廓系数

      • plot_calibration_curve

      • plot_cumulative_gain

      • plot_lift_curve

    • scikitplot.estimators

      • plot_learning_curve学习曲线

      • plot_feature_importances特征重要性

    • scikitplot.cluster

      • plot_elbow_curve决定簇个数的肘部曲线

    • scikitplot.decomposition

      • plot_pca_component_variance可解释方差

      • plot_pca_2d_projection高维投影到二维




    红色的函数是比较常见的,本帖用三个数据集来讲解它们,但不是单单讲解这些绘图函数,而花大量时间画大量图标来详细讲解相关的知识点,每个绘图函数和要明晰的知识点如下:


    • plot_pca_component_variance:主成分方差是什么?

    • plot_pca_2d_projection:为什么要降维?

    • plot_confusion_matrix:混淆矩阵是什么?

    • plot_precision_recall:查准率和查全率是什么?

    • plot_roc:ROC 和 AUC 是什么?

    • plot_silhouette:轮廓系数是什么?

    • plot_elbow_curve:肘部方法是什么?

    • plot_learning_curve:学习曲线是什么?

    • plot_feature_importances:特征重要性是什么?


    此外,我们对比 Scikit-Plot 和 Matplotlib,思路就是用后者来复现前者绘制的图。前者只要一行代码,后者需要大量代码,通过对比,读者也会更加喜欢 Scikit-Plot 的便捷性。


    本帖目录如下:

    目录

    第一章 -?手写数字数据集


    ????1.1 数据介绍

    ????1.2 可解释方差

    ????1.3 降维投影

    ????1.4 混淆矩阵

    ????1.5 查准率查全率

    ????1.6 接受者操作特征曲线


    第二章 - 鸢尾花数据集


    ????2.1 数据介绍

    ? ? 2.2 肘部曲线

    ? ? 2.3 轮廓系数


    第三章 - 乳腺癌数据集


    ????3.1 数据介绍

    ? ? 3.2 学习曲线

    ? ? 3.3 特征重要性


    第四章 - Scikit-Plot vs Matplotlib


    ? ? 4.1?plot_pca_component_variance

    ? ? 4.2?plot_pca_2d_projection

    ????4.3?plot_confusion_matrix

    ????4.4?plot_precision_recall

    ????4.5?plot_roc

    ????4.6?plot_silhouette

    ????4.7?plot_elbow_curve

    ? ? 4.8?plot_learning_curve

    ????4.9?plot_feature_importances


    总结


    640?wx_fmt=png


    用谷歌和百度搜索了下,除了 Scikit-Plot 的官方文档,只有一篇关于它的英文博客,而且内容也不是很丰富,希望这篇是中文版的第一篇介绍?Scikit-Plot 的好文。



    1手写数字数据集


    1.1

    数据介绍


    本小节使用的数据是

    手写数字数据集 (MNIST)


    MNIST 有 70000 张规格较小的手写数字图片,由美国的高中生和美国人口调查局的职员手写而成。每张图片有 784 个特征。这是因为每个图片都是 28*28 像素的,并且每个像素的值介于 0~255 之间。


    下图以数字 8 举例,看看如何将一张图片转换成 784 个像素的。


    640?wx_fmt=png


    MNIST 的类别就 10 类,就是数字 0 到 9。


    由于 MNIST 的数据集比较大,在 sklearn 中用?fetch_的方法,详细解释见〖机器学习之 Sklearn〗的小节 2.2 。再用?train_test_split 的方法将训练集和测试集分成 80:20 (test_size=0.2)。


    from sklearn.model_selection import train_test_split

    640?wx_fmt=png


    70000 张的图片分成含 56000 张的训练集和含 14000 张的测试集,而且 X 有 784 个特征 (784 个像素),X 和 y 的形状为


    ????X = (样本数,特征数)

    ????y = (样本数,)


    照片像素在 0 到 255 之间,做正规化 (除以 255) 使得 X_trainX_test 里的元素在 0 和 1 之间。

    X_train, X_test = X_train/255.0, X_test/255.0


    取 y 里不重复的类别个数,10 类,分别是数字 0, 1, 2, ..., 9。??

    n_class = len(np.unique(y))n_class
    10


    看看训练集中前 100 张图片和对应的标签 (左下角蓝色小字)。


    640?wx_fmt=png

    640?wx_fmt=png


    在下面五节我们来多分类 0 到 9 这十个数字。由于 784 个特征太多,首先我们想用「主成分分析」做特征降维,并投影在二维平面可视化数据,之后再用「对率回归」来分类,并画出相应的混淆矩阵、查准率查全率,接受者操作特征曲线等指标。



    1.2

    可解释方差


    Scikit-Plot 中的?plot_pca_component_variance 函数可以画出「主成分分析」里「主成分个数-解释方差比率」一一对应的关系图。


    先看一个「主成分分析」的知识点。


    主成分分析 主成分分析 (Principle Component Analysis, PCA)?是一种分析、简化数据集的技术。

    PCA 经常用于减少数据集的维数,同时保持数据集中的 对方差贡献最大 的特征。
    关于方差的直观解释如下图,深青点是数据,红色轴和灰色轴可想象成两个超平面,红点和灰点则是数据在超平面上的投影。那么方差是衡量投影数据的分散程度。
    640?wx_fmt=png
    显然把数据投影在 红色轴 上 (大方差) 以后更容易分类。因此 PCA 做的事情就是让样本点在某个超平面上的投影能尽可能地分开,即需最大化投影点的方差。

    我们总听到有人说「前 3 个主成分解释了 75% 的总方差」,这到底是什么意思呢?首先 PCA 每个主成分 PC 都可以解释数据中一部分方差,排序图如下,方差率越高,说明越是重要的 PC。

    640?wx_fmt=png


    总方差等于每一个 PC 的方差之和,而 PC i 可解释的方差比率等于

    ????方差比率 i =?方差 i /方差
    具体来讲
    • 第一个 PC 解释了 35% 的总方差

    • 前两个 PC 解释了 48% 的总方差

      ...

    • 前十个 PC 解释了 98% 的总方差

    • 所有 PC 解释了 100% 的总方差

    显然,用到的 PC 越多,解释了方差比率也就越高。一般来说,我们都先定一个「可解释方差」的阈值 (threshold),然后找出对应的 PC 的个数。用上图的例子,我们希望 80% 的方差能被解释,因此选前 6 个 PC。


    首先创建 PCA 估计器命名为?pca,再拟合训练集X_train


    640?wx_fmt=png


    函数?plot_pca_component_variance 用到的参数有 3 个:


    • pca:PCA 估计器

    • target_explained_variance:可解释方差的比率

    • figsize:图片大小


    640?wx_fmt=png

    640?wx_fmt=png


    上图展示了两条信息:


    蓝色曲线?- PC 个数和可解释方差比率呈递增关系,而且一开始猛增,后来微增。前 100 个 PC 大概可以解释 90% 的方差了,而后面 684 个 PC (一张总共 784 个特征) 才解释 10% 的方差。如果想压缩数据,可以不要后面 684 个 PC,压缩率 87.2% (684/784)。


    红色点?- 目标可解释方差比率和对应的 PC 个数,在本例中分别是 90% 和 87。



    1.3

    降维投影


    Scikit-Plot 中的?plot_pca_2d_projection?函数可以画出用 PCA 将「高维数据」投影到「二维平面」,便于我们可视化不同类别的在二维平面上特征表示。


    先看一个「PCA 降维」的知识点。


    PCA 降维
    PCA 将 n 个特征降维到 k 个,可以用来进行数据压缩,例如 784 维的向量最后可以用二维来表示,那么压缩率为 99.7% (1-2/784)。
    降到二维是为了可视化,三维以上的东西很难想像。


    首先创建 PCA 估计器命名为?pca,再拟合训练集?X_train


    640?wx_fmt=png


    函数?plot_pca_component_variance 用到的参数有 4 个:


    • pca:PCA 估计器

    • X_train:训练集特征

    • y_train:训练集标签

    • figsize:图片大小


    640?wx_fmt=png