机器学习中非常重要的一环就是数据的可视化分析,从源数据的可视化到结果数据的可视化都离不开可视化工具的使用,sklearn+matplotlib的组合在日常的工作中已经满足了绝对大多数的需求,今天主要介绍的是一个基于sklearn和matplotlib模块进行扩展的可视化工具Yellowbrick。这个神器的作者还是一位美女程序啊,厉害厉害了!
Yellowbrick的官方文档在http://www.scikit-yb.org/zh/latest/。
Yellowbrick是由一套被称为"Visualizers"组成的可视化诊断工具组成的套餐,其由Scikit-Learn API延伸而来,对模型选择过程其指导作用。总之,Yellowbrick结合了Scikit-Learn和Matplotlib并且最好得传承了Scikit-Learn文档,对 你的 模型进行可视化!
Yellowbrick主要包含的组件如下:
Visualizers Visualizers也是estimators(从数据中习得的对象),其主要任务是产生可对模型选择过程有更深入了解的视图。从Scikit-Learn来看,当可视化数据空间或者封装一个模型estimator时,其和转换器(transformers)相似,就像"ModelCV" (比如 RidgeCV, LassoCV )的工作原理一样。Yellowbrick的主要目标是创建一个和Scikit-Learn类似的有意义的API。其中最受欢迎的visualizers包括: 特征可视化 Rank Features: 对单个或者两两对应的特征进行排序以检测其相关性 Parallel Coordinates: 对实例进行水平视图 Radial Visualization: 在一个圆形视图中将实例分隔开 PCA Projection: 通过主成分将实例投射 Feature Importances: 基于它们在模型中的表现对特征进行排序 Scatter and Joint Plots: 用选择的特征对其进行可视化 分类可视化 Class Balance: 看类的分布怎样影响模型 Classification Report: 用视图的方式呈现精确率,召回率和F1值 ROC/AUC Curves: 特征曲线和ROC曲线子下的面积 Confusion Matrices: 对分类决定进行视图描述 回归可视化 Prediction Error Plot: 沿着目标区域对模型进行细分 Residuals Plot: 显示训练数据和测试数据中残差的差异 Alpha Selection: 显示不同alpha值选择对正则化的影响 聚类可视化 K-Elbow Plot: 用肘部法则或者其他指标选择k值 Silhouette Plot: 通过对轮廓系数值进行视图来选择k值 文本可视化 Term Frequency: 对词项在语料库中的分布频率进行可视化 t-SNE Corpus Visualization: 用随机邻域嵌入来投射文档 ... 以及更多!Visualizers随时在增加中,请务必查看示例(甚至是 develop branch 上的),并且随时欢迎你对Visualizers贡献自己的想法。
这里以癌症数据集为例绘制ROC曲线,如下:
def testFunc1(savepath='Results/breast_cancer_ROCAUC.png'): ''' 基于癌症数据集的测试 ''' data=load_breast_cancer() X,y=data['data'],data['target'] X_train, X_test, y_train, y_test = train_test_split(X, y) viz=ROCAUC(LogisticRegression()) viz.fit(X_train, y_train) viz.score(X_test, y_test) viz.poof(outpath=savepath)
结果如下:
结果看起来也是挺美观的。之后用平行坐标的方法对高维数据进行作图,数据集同上:
def testFunc2(savepath='Results/breast_cancer_ParallelCoordinates.png'): ''' 用平行坐标的方法对高维数据进行作图 ''' data=load_breast_cancer() X,y=data['data'],data['target'] print 'X_shape: ',X.shape #X_shape: (569L, 30L) visualizer=ParallelCoordinates() visualizer.fit_transform(X,y) visualizer.poof(outpath=savepath)
结果如下:
这个最初没有看明白什么意思,其实就是高维特征数据的可视化分析,这个功能还可以对原始数据进行采样,之后再绘图。
基于癌症数据集,使用逻辑回归模型来分类,绘制分类报告
def testFunc3(savepath='Results/breast_cancer_LR_report.png'): ''' 基于癌症数据集,使用逻辑回归模型来分类,绘制分类报告 ''' data=load_breast_cancer() X,y=data['data'],data['target'] model=LogisticRegression() visualizer=ClassificationReport(model) X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42) visualizer.fit(X_train,y_train) visualizer.score(X_test,y_test) visualizer.poof(outpath=savepath)
结果如下:
有没有感觉与sklearn似曾相识的感觉呢?
这样的结果展现方式还是比较美观的,在使用的时候发现了这个模块的一个不足的地方,就是:如果连续绘制两幅图片的话,第一幅图片就会累加到第二幅图片中去,多幅图片绘制亦是如此,在matplotlib中可以使用plt.clf()方法来清除上一幅图片,这里没有找到对应的API,希望有找到的朋友告知一下。
接下来基于共享单车数据集进行租借预测,具体如下:
首先基于特征对相似度分析方法来分析共享单车数据集中两两特征之间的相似度
def testFunc5(savepath='Results/bikeshare_Rank2D.png'): ''' 共享单车数据集预测 ''' data=pd.read_csv('bikeshare/bikeshare.csv') X=data[["season", "month", "hour", "holiday", "weekday", "workingday", "weather", "temp", "feelslike", "humidity", "windspeed" ]] y=data["riders"] visualizer=Rank2D(algorithm="pearson") visualizer.fit_transform(X) visualizer.poof(outpath=savepath)
结果如下:
基于线性回归模型实现预测分析
def testFunc7(savepath='Results/bikeshare_LinearRegression_ResidualsPlot.png'): ''' 基于共享单车数据使用线性回归模型预测 ''' data = pd.read_csv('bikeshare/bikeshare.csv') X=data[["season", "month", "hour", "holiday", "weekday", "workingday", "weather", "temp", "feelslike", "humidity", "windspeed"]] y=data["riders"] X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3) visualizer=ResidualsPlot(LinearRegression()) visualizer.fit(X_train, y_train) visualizer.score(X_test, y_test) visualizer.poof(outpath=savepath)
结果如下:
基于共享单车数据使用AlphaSelection
def testFunc8(savepath='Results/bikeshare_RidgeCV_AlphaSelection.png'): ''' 基于共享单车数据使用AlphaSelection ''' data=pd.read_csv('bikeshare/bikeshare.csv') X=data[["season", "month", "hour", "holiday", "weekday", "workingday", "weather", "temp", "feelslike", "humidity", "windspeed"]] y=data["riders"] alphas=np.logspace(-10, 1, 200) visualizer=AlphaSelection(RidgeCV(alphas=alphas)) visualizer.fit(X, y) visualizer.poof(outpath=savepath)
结果如下:
基于共享单车数据绘制预测错误图
def testFunc9(savepath='Results/bikeshare_Ridge_PredictionError.png'): ''' 基于共享单车数据绘制预测错误图 ''' data=pd.read_csv('bikeshare/bikeshare.csv') X=data[["season", "month", "hour", "holiday", "weekday", "workingday", "weather", "temp", "feelslike", "humidity", "windspeed"]] y=data["riders"] X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3) visualizer=PredictionError(Ridge(alpha=3.181)) visualizer.fit(X_train, y_train) visualizer.score(X_test, y_test) visualizer.poof(outpath=savepath)
结果如下:
agaricus-lepiota.txt数据集使用
def testFunc10(): ''' agaricus-lepiota.txt数据集使用 ''' names=['class','cap-shape','cap-surface','cap-color'] dataset=pd.read_csv('agaricus-lepiota.txt') dataset.columns=names print dataset.head() features,target=['cap-shape','cap-surface','cap-color'],['class'] X,y=dataset[features],dataset[target] return X,y def visual_model_selection(X,y,estimator,savepath): ''' 测试估计 ''' y=LabelEncoder().fit_transform(y.values.ravel()) model=Pipeline([('label_encoding', EncodeCategorical(X.keys())), ('one_hot_encoder', OneHotEncoder()), ('estimator', estimator)]) visualizer=ClassificationReport(model,classes=['edible','poisonous']) visualizer.fit(X,y) visualizer.score(X,y) visualizer.poof(outpath=savepath)
下面是各个分类模型的结果:
Anscombe's Quartet 问题也可以很容易实现:
简单介绍一下这个问题:
1973年,统计学家F.J. Anscombe构造出了四组奇特的数据。它告诉人们,在分析数据之前,描绘数据所对应的图像有多么的重要。这四组数据中,x值的平均数都是9.0,y值的平均数都是7.5;x值的方差都是10.0,y值的方差都是3.75;它们的相关度都是0.816,线性回归线都是y=3+0.5x。单从这些统计数字上看来,四组数据所反映出的实际情况非常相近,而事实上,这四组数据有着天壤之别。这四组数据如下所示:
把它们描绘在图表中,你会发现这四组数据是四种完全不同的情况。第一组数据是大多人看到上述统计数字的第一反应,是最“正常”的一组数据;第二组数据所反映的事实上是一个精确的二次函数关系,只是在错误地应用了线性模型后,各项统计数字与第一组数据恰好都相同;第三组数据描述的是一个精确的线性关系,只是这里面有一个异常值,它导致了上述各个统计数字,尤其是相关度值的偏差;第四组数据则是一个更极端的例子,其异常值导致了平均数、方差、相关度、线性回归线等所有统计数字全部发生偏差。
这四组数据绘制散点对比图如下图所示:
def testFunc11(savepath='Results/anscombe.png'): ''' Anscombe's Quartet 问题 ''' g=yb.anscombe() plt.savefig(savepath)
结果如下:
可以对特征数据很容易地进行重要性排名展示:
def testFunc12(savepath='Results/credit_Rank1D.png'): ''' Rank1D 一维特征排名 ''' data=load_data('credit') features=['limit', 'sex', 'edu', 'married', 'age', 'apr_delay', 'may_delay', 'jun_delay', 'jul_delay', 'aug_delay', 'sep_delay', 'apr_bill', 'may_bill', 'jun_bill', 'jul_bill', 'aug_bill', 'sep_bill', 'apr_pay', 'may_pay', 'jun_pay', 'jul_pay', 'aug_pay', 'sep_pay',] X,y=data[features].as_matrix(),data.default.as_matrix() #Rank1D #特征的一维排序利用排名算法,该排名算法一次仅考虑单个特征(例如,直方图分析)。 默认情况下,我们使用Shapiro-Wilk算法来评估与特征相关的实例分布的正常性。 然后绘制一个条形图,显示每个特征的相对等级。 visualizer = Rank1D(features=features, algorithm='shapiro') visualizer.fit(X, y) visualizer.transform(X) visualizer.poof(outpath=savepath)
结果如下:
还可以对其进行二维展示:
十分地强大,十分地方便,绝对的可视化神器,相关的使用还有很多很多,接下来有时间再继续去实践使用,欢迎交流学习!