机器学习可视化利器-Yellowbrick

2022-04-01 00:00:00 数据 模型 代码 复制 可视化

Yellowbrick简介

Yellowbrick是一款用于促进机器学习模型选择的可视化分析和诊断工具。它在scikit-learn的api基础上做了扩展,能让我们更容易的驾驭模型优化阶段。简而言之,yellowbrick将scikit-learn和matplotlib有机结合起来,通过可视化方式帮助我们优化模型。

安装

pip install -U yellowbrick
复制代码

虽然Yellowbrick提供了颜色、大小和标题等参数来帮助你自定义绘图。 但是,有时您只想用一行代码绘制一个图形。Yellowbrick提供了许多一行代码即可可视化的工具。

下面将展示一些流行的用于特征分析、分类、回归、聚类和目标评估的可视化工具。

特征分析可视化

Rank1D/Rank2D

默认情况下,Rank1D使用Shapiro-Wilk算法来评估特征分布的正态性。然后绘制条形图,显示每个特征的相对等级。

Shapiro-Wilk算法从统计学意义上将样本分布与正态分布进行比较,以确定数据是否显示出与正态性的偏离或符合。

from yellowbrick.features import rank1d
from yellowbrick.datasets import load_energy


X, _ = load_energy()
visualizer = rank1d(X, color="r")
复制代码

默认情况下,Rank2D可视化工具使用皮尔逊相关系数检测两个特征之间的相关性。

from yellowbrick.features import rank2d
from yellowbrick.datasets import load_credit


X, _ = load_credit()
print(X[['limit','sex', 'edu']].head())
visualizer = rank2d(X)
复制代码

平行坐标(Parallel Coordinates)

平行坐标是多维特征可视化技术,其中垂直轴(Y轴)为每个特征的值,Y轴表示特征。折线的颜色表示目标值。这允许一次性可视化多个维度;事实上,给定无限的水平空间(例如滚动窗口),技术上可以显示无限数量的维度!

from sklearn.datasets import load_wine
from yellowbrick.features import parallel_coordinates


X, y = load_wine(return_X_y=True)

print(X.shape,y.shape) #(178, 13) (178,)
visualizer = parallel_coordinates(X, y, normalize="standard")
复制代码

径向坐标可视化(Radial Visualization)

RadViz 是一种多元数据可视化算法,它围绕圆的圆周均匀地绘制每个特征维度,然后在圆的内部绘制点,以便该点在从中心到每个弧的轴上对其值进行归一化。 这种机制允许尽可能多的维度可以很容易地放在一个圆上,大大扩展了可视化的维度。

数据科学家使用这种方法来检测类之间的可分离性。例如 是否有机会从特征集中学习,还是噪音太大?

如果您的数据包含具有缺失值的行 (numpy.nan),则不会绘制这些缺失值。 换句话说,您可能无法获得数据的全貌。 RadViz 将发出 DataWarning 警告,告诉您丢失的百分比。

如果您收到此警告,则可能需要查看插补策略。 具体如何填充缺失值请参考:scikit-learn Imputer。

from yellowbrick.features import radviz
from yellowbrick.datasets import load_occupancy


X, y = load_occupancy()
visualizer = radviz(X, y, colors=["maroon", "gold"])
复制代码

PCA

PCA 分解可视化器利用主成分分析将高维数据分解为两个或三个维度,以便可以将每个实例绘制在散点图中。 PCA 的使用意味着这些投影的数据集可以沿着主要变化的轴进行分析,并且可以被解释,以确定是否可以利用球面距离度量。

from yellowbrick.datasets import load_spam
from yellowbrick.features import pca_decomposition

X, y = load_spam()
print(X.shape,y.shape) # (4600, 57) (4600,)
visualizer = pca_decomposition(X, y)
复制代码

流形(Manifold)

流形可视化工具使用流形学习将多维度描述的实例嵌入到2维,提供高维可视化。从而允许创建散点图来显示数据中的潜在结构。

与 PCA 和 SVD 等分解方法不同,流形通常使用近邻方法进行嵌入,允许他们捕获会丢失的非线性结构。然后可以分析生成的投影的噪声或可分离性,以确定是否可以在数据中创建决策空间。

from sklearn.datasets import load_iris
from yellowbrick.features import manifold_embedding


X, y = load_iris(return_X_y=True)
visualizer = manifold_embedding(X, y)
复制代码

分类模型可视化

类别预测误差(Class Prediction Error)

ClassPredictionError图将拟合分类模型中每个类的支持度(训练样本数),并显示为堆叠条形图。 每个条形都被分段以显示每个类别的预测比例(包括假阴性和假阳性,如混淆矩阵)。

您可以使用 ClassPredictionError 来可视化您的分类器遇到特别困难的类别,

更重要的是,它在每个类的基础上给出了哪些不正确的答案。 这通常可以让您更好地了解不同模型的优缺点以及数据集特有的特定挑战。

类别预测误差图提供了一种方法来快速了解分类器在预测正确类别方面的效果。

from yellowbrick.datasets import load_game
from sklearn.preprocessing import OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
from yellowbrick.classifier import class_prediction_error


X, y = load_game()
X = OneHotEncoder().fit_transform(X)
visualizer = class_prediction_error(
    RandomForestClassifier(n_estimators=10), X, y
)
复制代码

分类报告(Classification Report)

分类报告可视化器显示模型的准确率、召回率、F1分数。 为了更容易的解释和问题检测,该报告将数字分数与颜色编码的热图相结合。 所有热图都在 (0.0, 1.0) 范围内,以便于在不同分类报告之间轻松比较分类模型。

from yellowbrick.datasets import load_credit
from sklearn.ensemble import RandomForestClassifier
from yellowbrick.classifier import classification_report


X, y = load_credit()
visualizer = classification_report(
    RandomForestClassifier(n_estimators=10), X, y
)
复制代码

混淆矩阵(Confusion Matrix)

ConfusionMatrix 可视化器是一个 ScoreVisualizer,它使用拟合的 scikit-learn 分类器和一组测试 X 和 y 值,然后返回一个报告,显示每个测试值预测的类别与其实际类别的比较情况。

数据科学家使用混淆矩阵来了解哪些类容易混淆。

from yellowbrick.datasets import load_game
from sklearn.preprocessing import OneHotEncoder
from sklearn.linear_model import RidgeClassifier
from yellowbrick.classifier import confusion_matrix


X, y = load_game()
X = OneHotEncoder().fit_transform(X)
visualizer = confusion_matrix(RidgeClassifier(), X, y, cmap="Greens")
复制代码

率/召回率曲线(Precision/Recall)

PrecisionRecallCurve 显示了分类器精度(结果相关性的度量)和召回率(完整性的度量)之间的权衡。

对于每个类别,精度定义为真阳性与真假阳性总和的比率,召回率是真阳性与真阳性和假阴性总和的比率。

from sklearn.naive_bayes import GaussianNB
from yellowbrick.datasets import load_occupancy
from yellowbrick.classifier import precision_recall_curve


X, y = load_occupancy()
visualizer = precision_recall_curve(GaussianNB(), X, y)
复制代码

ROC/AUC

ROC/AUC图是用户可视化分类器的灵敏度和特异性之间的权衡。

ROC是分类器预测质量的度量,它比较可视化模型的灵敏度和特异性之间的权衡。绘制时,ROC 曲线在 Y 轴上显示真阳性率,在 X 轴上显示每个类别的假阳性率。因此,理想点是图的左上角:假阳性为零,真阳性为 1。

另一个度量,即曲线下面积 (AUC),它是对假阳性和真阳性之间关系的计算。 AUC 越高,模型通常越好。然而,检查曲线的“陡度”也很重要,因为这描述了真阳性率的大化,同时,假阳性率的小化。

from yellowbrick.classifier import roc_auc
from yellowbrick.datasets import load_spam
from sklearn.linear_model import LogisticRegression


X, y = load_spam()
visualizer = roc_auc(LogisticRegression(), X, y)
复制代码

判别阈值(Discrimination Threshold)

精度、召回率、f1 分数等指标是对二元分类器的判别阈值的可视化。

判别阈值是选择正类而不是负类的概率或分数。 通常,这设置为 50%,但可以调整阈值以增加或减少对误报或其他应用程序因素的敏感度。

from yellowbrick.classifier import discrimination_threshold
from sklearn.linear_model import LogisticRegression
from yellowbrick.datasets import load_spam

X, y = load_spam()
visualizer = discrimination_threshold(
    LogisticRegression(multi_class="auto", solver="liblinear"), X, y
)
复制代码

回归模型可视化

残差图(Residuals Plot)

在回归模型的上下文中,残差是目标变量的观测值 (y) 与预测值 (ŷ) 之间的差异,即预测的误差。

残差图显示了纵轴上的残差和横轴上的因变量之间的差异,使您可以检测目标内可能容易受到或多或少误差影响的区域。

from sklearn.linear_model import Ridge
from yellowbrick.datasets import load_concrete
from yellowbrick.regressor import residuals_plot


X, y = load_concrete()
visualizer = residuals_plot(
    Ridge(), X, y, train_color="maroon", test_color="gold"
)
复制代码

预测误差图(Prediction Error)

预测误差图显示了数据集中的实际目标与我们的模型生成的预测值。 这使我们能够看到模型中有多少方差。

数据科学家可以使用此图通过与45度线进行比较来诊断回归模型,那个地方预测结果完全的匹配模型。

from sklearn.linear_model import Lasso
from yellowbrick.datasets import load_bikeshare
from yellowbrick.regressor import prediction_error

X, y = load_bikeshare()
visualizer = prediction_error(Lasso(), X, y)
复制代码

库克距离(Cooks Distance)

Cook距离是统计分析中一种常见的距离,用于诊断各种回归分析中是否存在异常数据。

具有较大影响的实例可能是异常值,并且具有大量高影响点的数据集可能不适合线性回归,而无需进一步处理,例如去除异常值或插补。

CooksDistance 可视化器按索引显示所有实例的茎图及其相关距离分数,以及启发式阈值,以快速显示数据集的百分比可能会影响 OLS 回归模型。

from sklearn.datasets import load_diabetes
from yellowbrick.regressor import cooks_distance


X, y = load_diabetes(return_X_y=True)
visualizer = cooks_distance(X, y)
复制代码

聚类模型可视化

轮廓系数(Silhouette Scores)

当关于数据集的真实情况未知时,使用轮廓系数,并对模型聚类密度的估算进行计算。 该分数是通过对每个样本的轮廓系数求平均值来计算的,计算为每个样本的平均簇内距离和平均近簇距离之间的差异,并对大值归一化。这会产生介于 1 和 -1 之间的分数,其中 1 是高度密集的聚类,而 -1 是完全不正确的聚类。

Silhouette可视化器在每个簇的基础上显示每个样本的轮廓系数,可视化哪些簇是密集的,哪些不是。这对于确定聚类不平衡或通过比较多个可视化工具为选择值特别有用。

from sklearn.cluster import KMeans
from yellowbrick.datasets import load_nfl
from yellowbrick.cluster import silhouette_visualizer

X, y = load_nfl()
visualizer = silhouette_visualizer(KMeans(5, random_state=42), X)
复制代码

簇间距离图(Intercluster Distance)

簇间距离图显示了簇中心在二维中的嵌入,并保留了与其他中心的距离。

例如,在可视化中越靠近中心,它们就越靠近原始特征空间。根据评分指标来确定簇的大小。

默认情况下,它们按成员身份确定大小,例如,属于每个中心的实例数。这给出了簇的相对重要性的理解。

注意:

因为两个簇在 2D 空间中重叠,所以并不意味着它们在原始特征空间中重叠。

from yellowbrick.datasets import load_nfl
from sklearn.cluster import MiniBatchKMeans
from yellowbrick.cluster import intercluster_distance


X, y = load_nfl()
visualizer = intercluster_distance(MiniBatchKMeans(5, random_state=777), X)
复制代码

目标值分析

类平衡(ClassBalance)

分类模型的大挑战之一是训练数据中的类不平衡。严重的类不平衡可能会被相对较好的 F1 和准确度分数所掩盖。

分类器只是猜测多数类,而不是对代表性不足的类进行任何评估。

有几种处理类别不平衡的技术,例如分层抽样、对多数类别进行下采样、加权等。

但在采取这些行动之前,了解训练数据中的类别平衡是什么很重要。

ClassBalance 可视化工具通过为每个类创建一个条形图来了解类别的平衡,即类在数据集中的表示频率。

from yellowbrick.datasets import load_game
from yellowbrick.target import class_balance

X, y = load_game()
visualizer = class_balance(y, labels=["draw", "loss", "win"])
复制代码

总结

Yellowbrick这个工具包,给我们机器学习建模带来了极大地便利。一是因为解决了特征工程和建模过程中的可视化问题,极大地简化了操作;二是通过各种可视化也可以补充自己对建模的一些盲区。这里只介绍了Yellowbrick的冰山一角,详情请参见官网。

参考文章

  • yellowbrick source code
  • yellowbrick oneliners

相关文章