机器学习可视化神器——Scikit-Plot

教育   科技   2024-09-02 18:01   湖北  
点击“算法数据侠”,“星标”公众号

阅读今日所有推文,汇聚好运召唤神龙

Fighting,小侠客们好呀,今天的侠客主题是机器学习可视化神器——Scikit-Plot。在机器学习过程中画图是一个重要的步骤,例如在分类任务中需要画P-R曲线、AUC曲线、混淆曲线等,使用matpotlib、seaborn等类库作图需要写多行代码,例如设置title、xlim、ylim、lengend等,如果有一个工具可以封装这些操作的话可以帮助我们节省时间,提升开发效率,从而使我们专注在算法/业务的改进上。

当机器学习工具Scikit-Learn遇上了可视化工具Matplotlib,就衍生出Scikit-Plot。Scikit-Plot是由Reiichiro Nakano创建,用在机器学习流程中的可视化工具。它简直就是玩机器学习的数据科学家的福音,能最快速简洁地画出用 Matplotlib要写很多行语句才能画出的图,使用Scikit-Plot的每个人都可以用一行代码 (one-liner) 完成任务。开始渴望使用Scikit-plot?来吧,展示~

01

Installation

首先,确保已经安装了最新版本的Scikit-plot。Scikit-plot在PyPi上,所以只需运行下面语句即可安装最新版本:

pip install scikit-plot
或者在根文件夹克隆源存储库并运行:
python setup.py install
Scikit-plot依赖于Scikit-learn和Matplotlib来发挥它的魔力,所以也需要确保安装了它们。
02

First Plot

对于快速示例,这里展示随机森林对与Scikit-learn捆绑在一起的数字数据集的分类效果如何。评估分类器性能的一种流行方法是查看其混淆矩阵。
在开始绘图之前,需要为Scikit-plot导入以下matplotlib依赖:
import matplotlib.pyplot as plt
matplotlib.pyplot像在MATLAB中一样进行绘图,并处理轴、图形和子图等内容。除非是高级用户,否则在使用Scikit-plot时不需要了解任何内容。需要注意的是,还需要使用matplotlib.pyplot.show()函数来显示Scikit-plot生成的图。
First plot从生成示例数字数据集开始:
from sklearn.datasets import load_digits
X, y = load_digits(return_X_y=True)
在这里,X和y分别包含分类数据集的特征和标签。继续使用一些初始参数从Scikit-learn创建一个RandomForestClassifier对象的实例:
from sklearn.ensemble import RandomForestClassifier
random_forest_clf = RandomForestClassifier(n_estimators=5, max_depth=5, random_state=1)
接下来,使用sklearn.model_selection.cross_val_predict()在数据集上生成预测标签:
from sklearn.model_selection import cross_val_predict
predictions = cross_val_predict(random_forest_clf, X, y)
对于那些不熟悉cross_val_predict()功能的小侠客们,它会为数据集中的每个样本点生成交叉验证的估计值,将交叉验证的估计值与真实标签进行比较,能够获得评估指标,例如准确度、精确度、召回率,在本文例子中,还有混淆矩阵。
为了绘制和显示的混淆矩阵,将使用函数plot_confusion_matrix(),将真实标签和预测标签传递给它。还将设置可选参数normalize=True,以便混淆矩阵图中显示的值将在[0, 1]范围内。最后,为了展示生成的混淆矩阵细节,调用plt.show()进行展示。
import scikitplot as skplt
skplt.metrics.plot_confusion_matrix(y, predictions, normalize=True)
plt.show()

就是这样,一行代码可视化!快速浏览一下上面的混淆矩阵就会发现,分类器在识别数字 1、8 和 9 方面表现不佳,或许调整随机森林的超参数后可以得到更棒的结果。

03

One more example

下面展示一个不使用Scikit-learn的示例,用于在样本数据集上生成Keras分类器的精确召回曲线。
import matplotlib.pyplot as plt
import scikitplot as skplt
# This is a Keras classifier. We'll generate probabilities on the test set
keras_clf.fit(X_train, y_train, batch_size=64, nb_epoch=10, verbose=2)
probas = keras_clf.predict_proba(X_test, batch_size=64)
# Now plot
skplt.metrics.plot_precision_recall_curve(y_test, probas)
plt.show()
再一次,一行代码可视化!如上例所示,需要做的就是将真实标签和预测概率传递给plot_precision_recall_curve()生成精确召回曲线。这意味着可以使用任何想要生成精确召回曲线的分类器,从Keras分类器到NLTK朴素贝叶斯再到 XGBoost,只要以正确的格式传入预测概率即可。

04

Metrics Module

scikitplot.metrics模块包括机器学习评估指标图,例如混淆矩阵、轮廓分数等。下面将逐个进行介绍,给出代码示例,并展示可视化图形。由于上述已经介绍了混淆矩阵和精确召回曲线的绘制方法,下面内容不再包含这两种图形。

4.1 从标签和分数/概率生成KS统计图

import scikitplot as skplt
lr = LogisticRegression()
lr = lr.fit(X_train, y_train)
y_probas = lr.predict_proba(X_test)
# 绘制KS统计图
skplt.metrics.plot_ks_statistic(y_test, y_probas)
plt.show()

4.2 绘制一组分类器概率估计的校准曲线

绘制分类器的校准曲线有助于确定是否可以将它们的预测概率直接解释为置信水平。例如,一个经过良好校准的二分类器应该对样本进行分类,使得对于它给出 0.8分的样本,大约80%实际上应该来自正类。该方法目前仅适用于二分类。

import scikitplot as skplt
rf = RandomForestClassifier()
lr = LogisticRegression()
nb = GaussianNB()
svm = LinearSVC()
rf_probas = rf.fit(X_train, y_train).predict_proba(X_test)
lr_probas = lr.fit(X_train, y_train).predict_proba(X_test)
nb_probas = nb.fit(X_train, y_train).predict_proba(X_test)
svm_scores = svm.fit(X_train, y_train).decision_function(X_test)
probas_list = [rf_probas, lr_probas, nb_probas, svm_scores]
clf_names = ['Random Forest', 'Logistic Regression', 'Gaussian Naive Bayes', 'Support Vector Machine']
skplt.metrics.plot_calibration_curve(y_test, probas_list, clf_names)
plt.show()
4.3 从标签和分数/概率生成累积收益图
累积增益图表用于确定二分类的有效性,可以在 http://mlwiki.org/index.php/Cumulative_Gain_Chart找到关于累计增益的详细解释。该方法也仅仅适用于二分类。
import scikitplot as skplt
lr = LogisticRegression()
lr = lr.fit(X_train, y_train)
y_probas = lr.predict_proba(X_test)
skplt.metrics.plot_cumulative_gain(y_test, y_probas)
plt.show()

05

Estimators Module

scikitplot.estimators模块包括专门为scikit-learn估计器(分类器/回归器)实例构建的图,例如随机森林。可以使用自己的估算器,但这些图假设了scikit-learn估算器共享的特定属性,具体要求按功能记录。
5.1 生成学习器的训练和测试指标曲线图
import scikitplot as skplt
rf = RandomForestClassifier()
skplt.estimators.plot_learning_curve(rf, X, y)
plt.show()

5.2 为学习器生成训练和测试学习曲线图

import scikitplot as skplt
rf = RandomForestClassifier()
rf.fit(X, y)
skplt.estimators.plot_feature_importances(rf, feature_names=['petal length', 'petal width', 'sepal length', 'sepal width'])
plt.show()

06

Cluster Module

scikitplot.cluster模块包括专门为scikit-learn聚类器实例构建的图,例如 KMeans。当然,也可以使用自己的聚类器,但这些图假设了scikit-learn估计器共享的特定属性,具体要求按功能记录。
6.1 为KMeans聚类绘制不同K值的手肘曲线
import scikitplot as skplt
kmeans = KMeans(random_state=1)
skplt.cluster.plot_elbow_curve(kmeans, cluster_ranges=range(1, 30))
plt.show()
6.2 绘制聚类方法的轮廓系数分析图
import scikitplot as skplt
kmeans = KMeans(n_clusters=4, random_state=1)
cluster_labels = kmeans.fit_predict(X)
skplt.metrics.plot_silhouette(X, cluster_labels)
plt.show()
07

Decomposition Module

scikitplot.decomposition模块包括专门为用于降维的scikit-learn估计器构建的图,例如PCA、t-SNE。可以使用自己的估算器,但这些图假设了scikit-learn估算器共享的特定属性,具体要求按功能记录。
7.1 绘制PCA分量的解释方差比

对于整数/无输入,如果y是二进制或多类, StratifiedKFold则使用。如果估计器不是分类器或者既不y是二分类也不是多分类,KFold则使用。

import scikitplot as skplt
pca = PCA(random_state=1)
pca.fit(X)
skplt.decomposition.plot_pca_component_variance(pca)
plt.show()
7.2 在给定数据集上绘制PCA的二维投影
import scikitplot as skplt
pca = PCA(random_state=1)
pca.fit(X)
skplt.decomposition.plot_pca_2d_projection(pca, X, y)
plt.show()
08

结束语

以上就是机器学习可视化神器——Scikit-Plot的所有内容了。Scikit-Plot是一个非常实用的Python库,它简化了机器学习模型的评估和可视化过程。本文详细介绍了Scikit-Plot的基本用法,并演示了如何使用该库生成常见的模型评估图表。通过利用Scikit-Plot,我们可以更好地理解模型的性能和行为,并作出更准确的决策。感兴趣的小侠客可以点击文末“阅读原文”深度学习关于Scikit-Plot的更多细节。今天的学习到此结束,我们下次再见咯~

算法数据侠
Hi, 今日的你比昨日更优秀!算法数据侠致力于最全最优质的AI算法与数据集分享,不定期更新AI算法/数据集、竞赛TOP方案和前沿学术速递,期待各位小侠客共勉!
 最新文章