使用 Yellowbrick 创建简单、有效的机器学习图

2022-04-07  本文已影响0人  Python_Camp

使用 Yellowbrick 创建简单、有效的机器学习图

Yellowbrick: Machine Learning Visualization — Yellowbrick v1.3.post1 documentation (scikit-yb.org)
https://www.scikit-yb.org/en/latest/

安斯科姆的四重奏

Yellowbrick吸取了安斯康伯的教训--这就是为什么我们认为视觉诊断对机器学习至关重要。

什么是安斯库姆Anscombe四重奏?
1973年,统计学家F.J. Anscombe构造出了四组奇特的数据。它告诉人们,数据分析之前,描绘数据所对应的可视化图形有多么的重要!如何理解?
相关系数(correlation coefficient)相关系数是变量间关联程度的最基本测度之一,如果我们想知道两个变量之间的相关性,那么我们就可以计算相关系数,进行判定。

相关系数基本特征低度相关:0 ≤ |r|< 0.3

中度相关:0.3 ≤ |r|< 0.8

高度相关:0.8 ≤ |r|< 1

正相关:两个变量变化方向相同负相关:两个变量变化方向相反方向量级(magnitude)散点图在进行相关分析之前,通常会绘制散点图来观察变量之间的相关性,如果这些数据在二维坐标轴中构成的数据点分布在一条直线上的周围,那么就说明变量间存在线性相关关系,如下图所示:

import yellowbrick as yb
import matplotlib.pyplot as plt

g = yb.anscombe()
plt.show()
image.png

残差图
残差,在回归模型的背景下,是目标变量的观察值(y)和预测值(ŷ)之间的差异,也就是预测的误差。残差图显示了纵轴上的残差和横轴上的因变量之间的差异,使你能够检测到目标中可能会出现更多或更少误差的区域。

代码块from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split

from yellowbrick.datasets import load_concrete
from yellowbrick.regressor import ResidualsPlot

# Load a regression dataset
X, y = load_concrete()

# Create the train and test data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Instantiate the linear model and visualizer
model = Ridge()
visualizer = ResidualsPlot(model)

visualizer.fit(X_train, y_train)  # Fit the training data to the visualizer
visualizer.score(X_test, y_test)  # Evaluate the model on the test data
visualizer.show()                 # Finalize and render the figure
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split

from yellowbrick.datasets import load_concrete
from yellowbrick.regressor import ResidualsPlot

# Load a regression dataset
X, y = load_concrete()

# Create the train and test data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Instantiate the linear model and visualizer
model = Ridge()
visualizer = ResidualsPlot(model)

visualizer.fit(X_train, y_train)  # Fit the training data to the visualizer
visualizer.score(X_test, y_test)  # Evaluate the model on the test data
visualizer.show()                 # Finalize and render the figure

image.png
visualizer = ResidualsPlot(model, hist=False, qqplot=True)
visualizer.fit(X_train, y_train)
visualizer.score(X_test, y_test)
visualizer.show()
image.png

残差图

开发机器学习模型的一个重要步骤是评估性能。根据您正在处理的机器学习问题的类型,通常可以选择一些指标来执行此步骤。

然而,仅仅孤立地看一两个数字并不总能让我们做出正确的模型选择。例如,一个单一的错误度量并没有给我们任何关于错误分布的信息。它不能回答诸如模型是在很大程度上错误的次数很少,还是会产生很多较小的错误之类的问题?

还必须直观地检查模型性能,因为图表可以揭示我们在观察单个指标时可能会错过的信息。

Yellowbrick是一个 Python 库,致力于为使用Scikit-learn开发的机器学习模型轻松创建丰富的可视化。

在接下来的文章中,我将介绍这个方便的机器学习工具,并提供代码示例来创建一些最常见的机器学习可视化。

混淆矩阵

混淆矩阵是一种直观评估分类器预测正确频率的简单方法。

from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split as tts
from sklearn.linear_model import LogisticRegression
from yellowbrick.classifier import ConfusionMatrix

# We'll use the handwritten digits data set from scikit-learn.
# Each feature of this dataset is an 8x8 pixel image of a handwritten number.
# Digits.data converts these 64 pixels into a single array of features
digits = load_digits()
X = digits.data
y = digits.target

X_train, X_test, y_train, y_test = tts(X, y, test_size =0.2, random_state=11)

model = LogisticRegression(multi_class="auto", solver="liblinear")

# The ConfusionMatrix visualizer taxes a model
cm = ConfusionMatrix(model, classes=[0,1,2,3,4,5,6,7,8,9])

# Fit fits the passed model. This is unnecessary if you pass the visualizer a pre-fitted model
cm.fit(X_train, y_train)

# To create the ConfusionMatrix, we need some test data. Score runs predict() on the data
# and then creates the confusion_matrix from scikit-learn.
cm.score(X_test, y_test)

# How did we do?
cm.show()
image.png

为了说明混淆矩阵,我使用了一个称为“糖尿病”的数据集。该数据集包含患者的许多特征,例如体重指数、2 小时血清胰岛素测量值和年龄,以及指示患者糖尿病检测呈阳性或阴性的列。目的是使用这些数据来建立一个可以预测糖尿病阳性结果的模型。

下面的代码通过 Scikit-learn API 导入这个数据集。

在二元分类问题中,模型做出的预测可能有四种潜在结果。

真阳性:模型正确预测了阳性结果,例如患者的糖尿病检测结果为阳性,模型预测为阳性。

假阳性:模型错误地预测了阳性结果,例如患者的糖尿病检测结果为阴性,但模型预测为阳性。

真阴性:模型正确预测了阴性结果,例如患者的糖尿病检测为阴性,模型预测为阴性。

假阴性:模型错误地预测了阴性结果,例如患者的糖尿病检测结果为阳性,但模型预测为阴性。

混淆矩阵在网格中可视化了这些可能结果中的每一个的计数。下面的代码使用 Yellowbrick ConfusionMatrix 可视化器为模型生成混淆矩阵。

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split as tts

from yellowbrick.classifier import ConfusionMatrix

iris = load_iris()
X = iris.data
y = iris.target
classes = iris.target_names

X_train, X_test, y_train, y_test = tts(X, y, test_size=0.2)

model = LogisticRegression(multi_class="auto", solver="liblinear")

iris_cm = ConfusionMatrix(
    model, classes=classes,
    label_encoder={0: 'setosa', 1: 'versicolor', 2: 'virginica'}
)

iris_cm.fit(X_train, y_train)
iris_cm.score(X_test, y_test)
iris_cm.show()

混淆矩阵

image.png

图片由作者提供。

ROC 曲线

分类器的初始输出不是标签,而是特定观察属于某个类别的概率。

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

from yellowbrick.classifier import ROCAUC
from yellowbrick.datasets import load_spam

# Load the classification dataset
X, y = load_spam()

# Create the training and test data
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

# Instantiate the visualizer with the classification model
model = LogisticRegression(multi_class="auto", solver="liblinear")
visualizer = ROCAUC(model, classes=["not_spam", "is_spam"])

visualizer.fit(X_train, y_train)        # Fit the training data to the visualizer
visualizer.score(X_test, y_test)        # Evaluate the model on the test data
visualizer.show()                       # Finalize and show the figure

然后通过选择一个阈值将该概率转化为一个类别。例如,我们可能会说,如果患者检测呈阳性的概率高于 0.5,则我们分配阳性标签。

根据模型、数据和用例,我们可以选择一个阈值来优化特定结果。在糖尿病示例中,缺少阳性结果可能会危及生命,因此我们希望尽量减少假阴性。更改分类器的阈值是优化此结果的一种方法,而 ROC 曲线是可视化此权衡的一种方法。

下面的代码使用 Yellowbrick 构建 ROC 曲线。

image.png

ROC 曲线。

图片由作者提供。

image.png

ROC 曲线绘制了真阳性率与假阳性率的关系。使用它,我们可以评估降低或提高分类阈值的影响。

精确召回曲线

ROC 曲线并不总是评估分类器的最佳方法。如果类别不平衡(与另一个类别相比,一个类别有更多的观察值),ROC 曲线的结果可能会产生误导。

在这些情况下,精确召回曲线通常是更好的选择。

让我们快速回顾一下精确度和召回率的含义。

精度衡量模型在正确识别正类方面的能力。换句话说,在对正类的所有预测中,有多少实际上是正确的?

回想一下,告诉我们模型在正确预测数据集中所有正面观察方面的能力如何。

准确率和召回率之间通常需要权衡取舍。例如,您可以以降低召回为代价来提高精度。

精确召回曲线显示了在不同分类阈值下的这种权衡。

下面的代码使用 Yellowbrick 库为糖尿病分类器生成精确召回曲线。

import matplotlib.pyplot as plt

from yellowbrick.datasets import load_spam
from sklearn.linear_model import RidgeClassifier
from yellowbrick.classifier import PrecisionRecallCurve
from sklearn.model_selection import train_test_split as tts

# Load the dataset and split into train/test splits
X, y = load_spam()

X_train, X_test, y_train, y_test = tts(
    X, y, test_size=0.2, shuffle=True, random_state=0
)

# Create the visualizer, fit, score, and show it
viz = PrecisionRecallCurve(RidgeClassifier(random_state=0))
viz.fit(X_train, y_train)
viz.score(X_test, y_test)
viz.show()

精确召回曲线。

图片由作者提供。


image.png

簇间距离

Yellowbrick 库还包含一组用于分析聚类算法的可视化工具。评估聚类模型性能的一种常用方法是使用聚类间距离图。

集群间距离图绘制每个集群中心的嵌入,并可视化集群之间的距离和基于成员资格的每个集群的相对大小。

我们可以仅使用特征 (X) 将糖尿病数据集转化为聚类问题。

在我们对数据进行聚类之前,我们可以使用流行的肘部方法来找到最佳的聚类数。Yellowbrick 对此有一个方法。

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

from yellowbrick.cluster import InterclusterDistance

# Generate synthetic dataset with 12 random clusters
X, y = make_blobs(n_samples=1000, n_features=12, centers=12, random_state=42)

# Instantiate the clustering model and visualizer
model = KMeans(6)
visualizer = InterclusterDistance(model)

visualizer.fit(X)        # Fit the data to the visualizer
visualizer.show()        # Finalize and render the figure
image.png

肘部方法
KElbowVisualizer实现了 "肘部 "方法,以帮助数据科学家通过用K值的范围来拟合模型来选择最佳的集群数量。如果折线图类似于一个手臂,那么 "肘部"(曲线上的拐点)就很好地表明基础模型在这一点上是最适合的。在可视化软件中,"肘部 "将用虚线来标注。

为了证明这一点,在下面的例子中,KElbowVisualizer在一个有8个随机聚类点的二维数据集的K值范围内拟合KMeans模型,从4到11。当模型以8个集群进行拟合时,我们可以看到图中的 "肘 "的注释线,在这种情况下,我们知道这是一个最佳数字。

image.png

从这里我们可以看出,两个集群之间有很多分离。成员资格表明,一个集群有 165 个观测值,另一个集群有 603 个观测值。这非常接近糖尿病数据集中两个类别的平衡,即分别有 268 和 500 个观测值。

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

from yellowbrick.cluster import KElbowVisualizer

# Generate synthetic dataset with 8 random clusters
X, y = make_blobs(n_samples=1000, n_features=12, centers=8, random_state=42)

# Instantiate the clustering model and visualizer
model = KMeans()
visualizer = KElbowVisualizer(model, k=(4,12))

visualizer.fit(X)        # Fit the data to the visualizer
visualizer.show()        # Finalize and render the figure

残差图

基于回归的机器学习模型有自己的一组可视化。Yellowbrick 也为这些提供支持。

为了说明回归问题的可视化,我们将使用可以通过 Scikit-learn API 获得的糖尿病数据集的变体。该数据集与本文前面使用的数据集具有相似的特征,但目标是基线后一年疾病进展的定量测量。

在回归中,可视化残差是分析模型性能的一种方法。残差是观察值与模型预测值之间的差异。它们是量化回归模型中的误差的一种方法。

下面的代码为简单回归模型生成残差图。

残差图。

图片由作者提供。

Yellowbrick 库中基于回归的模型的其他可用可视化包括:

预测误差图。

阿尔法选择。

库克的距离。

Yellowbrick Python 库提供了一种闪电般的方式来为使用 Scikit-learn 开发的模型创建机器学习可视化。除了用于评估模型性能的可视化之外,Yellowbrick 还具有用于可视化交叉验证、学习曲线和特征重要性的工具。此外,它还提供文本建模可视化功能。

如文章中所述,单一评估指标模型可能很有用,在某些情况下,如果您有一个简单的问题并比较不同的模型,它可能就足够了。然而,通常情况下,为模型性能创建可视化是获得对机器学习模型有效性的真正理解的重要附加步骤。

如果您想了解更多关于单一评估指标的信息,我之前写过一篇文章,涵盖了分类评估指标和回归评估指标。

衡量分类性能的 8 个指标…用简单的英语解释向datascience.com

3 回归的评估指标…用简单的英语解释向datascience.com

上一篇下一篇

猜你喜欢

热点阅读