作者:小鱼微信公众号:PythonDataSciencePreface玩过建模的朋友都知道,在建立模型之前,有很长一段时间的特征工程工作要做,而在特征工程的过程中,探索性数据分析是必不可少的一环,因为如果我们要对每一个特征进行详细的分析,那么必然会进行一些可视化来辅助我们进行选择和判断。可视化工具很多,但是能够对特征探索性分析进行特殊可视化的却不多。今天给大家介绍一个非常强大的工具:yellowbrick。希望在这个工具的帮助下,可以节省更多的探索时间,快速获取特征信息。FeatureRadarRadVizRadViz雷达图是一种多元数据可视化算法,将每个特征均匀分布在圆周上,并对每个特征值进行归一化处理。通常,数据科学家使用此方法来检测类之间的关联。例如,是否有机会从特征集中学习一些东西,或者是否有太多噪音?#加载分类数据setdata=load_data("occupancy")#指定感兴趣的特征和目标的类别features=["temperature","relativehumidity","light","C02","humidity"]classes=["unoccupied","occupied"]#提取实例和targetX=data[features]y=data.occupancy#Importthevisualizerfromyellowbrick.featuresimportRadViz#Instantiatethevisualizervisualizer=RadViz(classes=classes,features=features)visualizer.fit(X,y)#Fitthedatatothevisualizervisualizer.transform(X)#Transformthedatavisualizer.poof()#Draw/show/poofthedata从上面的雷达图可以看出,在5个维度,温度对于目标类的影响比较大。One-DimensionalRankingOne-DimensionalRankingRank1Dfeatures利用只考虑个体特征的ranking算法,默认使用Shapiro-Wilk算法评估与特征相关的实例分布的正态性,然后绘制条形图显示每个特征的相对等级。fromyellowbrick.featuresimportRank1D#使用Sharpiro排名算法实例化1D可视化器visualizer=Rank1D(features=features,algorithm='shapiro')visualizer.fit(X,y)#将数据拟合到可视化器visualizer.transform(X)#Transformthedatavisualizer.poof()#Draw/show/poofthedataPCAProjectionPCA分解可视化使用主成分分析将高维数据分解成两个或三个维度,从而可以将每个实例绘制成散点图。PCA的使用意味着可以沿变化的主轴分析投影数据集,并且可以解释该数据集以确定是否可以利用球面距离度量。BiplotPCA投影可以增强为双标图,其中点是投影实例,向量表示高维空间中数据的结构。通过使用proj_features=True标志,数据集中每个特征的向量将在该特征的最大方差方向上绘制在散点图上。这些结构可用于分析特征对分解的重要性或寻找相关方差的特征以供进一步分析。#加载分类数据setdata=load_data('concrete')#指定感兴趣的特征和目标target="strength"features=['cement','slag','ash','water','splast','coarse','fine','age']#提取实例数据和targetX=data[features]y=data[target]visualizer=PCADecomposition(scale=True,proj_features=True)visualizer.fit_transform(X,y)visualizer.poof()特征重要性特征工程过程涉及选择生成有效模型所需的最少特征,因为模型包含的特征越多,它就越复杂(数据越稀疏),因此模型越敏感是方差误差。一种常见的剔除特征的方法是描述它们对模型的相对重要性,然后剔除较弱的特征或特征的组合,并在交叉验证时重新评估以确定模型是否更好。在scikit-learn中,决策树模型和树的集合(例如随机森林、梯度提升和AdaBoost)在拟合时提供feature_importances_属性。YellowbrickFeatureImportances可视化工具利用此属性对相对重要性进行排名和绘制。importmatplotlib.pyplotaspltfromsklearn.ensembleimportGradientBoostingClassifierfromyellowbrick.features.importancesimportFeatureImportances#创建一个新的matplotlib图fig=plt.figure()ax=fig.add_subplot()viz=FeatureImportances(GradientBoosting(),viz=FeatureImportances(GradientBoosting(),viz=.fit(X,y)viz.poof()RecursiveFeatureEliminationRecursiveFeatureEliminationRecursiveFeatureElimination(RFE)是一种特征选择方法,它训练一个模型,去除最弱的一个(或多个)特征,直到指定的量化特征。特征按照模型的coef_或feature_importances_属性排序,通过每次循环递归剔除少量特征,RFE试图去除模型中可能存在的依赖和共线性。RFE需要保留指定数量的特征,但它通常事先不知道有多少特征是有效的。为了找到最佳特征数量,交叉验证与RFE一起使用来打分e不同的特征子集并选择最佳的评分特征集。RFECV可视化绘制模型中的特征数量及其交叉验证测试分数和可变性,并可视化选定数量的特征。fromsklearn.svmimportSVCfromsklearn.datasetsimportmake_classificationfromyellowbrick.featuresimportRFECV#创建一个只有3个信息特征的数据集X,y=make_classification(n_samples=1000,n_features=25,n_informative=3,n_redundant=20,n_repeated=n_classes=8,n_clusters_per_class=1,random_state=0)#CreateRFECVvisualizerwithlinearSVMclassifierviz=RFECV(SVC(kernel='linear',C=1))viz.fit(X,y)viz.poof()该图显示了理想的RFECV曲线,当捕获三个信息特征时,它会跳到极好的精度,然后随着非信息特征被添加到模型中,精度逐渐下降。阴影区域表示交叉验证变异性,在绘制曲线的平均精度分数上下各有一个标准差。下面是一个真实的数据集,我们可以在其中看到RFECV对信用违约二元分类器的影响。从sklearn.ensembleimportRandomForestClassifierfromsklearn.model_selectionimportStratifiedKFolddf=load_data('credit')target='default'features=[colforcolindata.columnsifcol!=target]X=data[features]y=data[target]cv=StratifiedKFold(5)oz=RFECV(RandomForestClassifier(),cv=cv,scoring='f1_weighted')oz.fit(X,y)oz.poof()在这个例子中我们可以看到19是被选择的特征,尽管模型的f1-score在大约5个特征后似乎没有太大改善。选择要消除的特征在确定每次递归的结果中起着重要作用;修改步骤参数以在每个步骤中消除多个特征可能有助于尽早消除最差的特征,提高其余特征(也可用于加速具有大量特征的数据集的特征消除)。残差图在回归模型的上下文中,残差是目标变量(y)的观察值和预测值(?)之间的差异,即预测中的误差。残差图显示纵轴上的残差与横轴上的因变量之间的差异,允许检测目标中可能或多或少容易出错的区域。fromsklearn.linear_modelimportRidgefromyellowbrick.regressorimportResidualsPlot#实例化线性模型和visualizerridge=Ridge()visualizer=ResidualsPlot(ridge)visualizer.fit(X_train,y_train)#将训练数据拟合到模型visualizer.score(X_test)#在测试上评估模型datavisualizer.poof()#Draw/show/poofthedataRegularizationAlphaSelectionRegularization旨在惩罚模型的复杂性,因此alpha越高,模型越复杂,由于方差(过拟合)而减少误差.另一方面,太高的alpha会增加由于偏差(下冲)引起的误差。因此,重要的是选择最佳的α以最小化两个方向的误差。AlphaSelectionVisualizer演示了不同的alpha值如何影响线性模型正则化过程中的模型选择。一般来说,α会增加正则化的影响,例如如果alpha为零,则没有正则化,α越高,正则化参数对最终模型的影响越大。importnumpyasnpfromsklearn.linear_modelimportLassoCVfromyellowbrick.regressorimportAlphaSelection#创建一个alpha列表来交叉验证talphas=np.logspace(-10,1,400)#实例化线性模型和可视化器modelphas=alphasCV(alphas)visualizer=AlphaSelection(model)visualizer.fit(X,y)g=visualizer.poof()类别预测错误类别预测错误类别预测错误图提供了一种快速查看分类器预测正确类别的方法。fromsklearn.ensembleimportRandomForestClassifierfromyellowbrick.classifierimportClassPredictionError#实例化分类模型和visualizervisualizer=ClassPredictionError(RandomForestClassifier(),classes=classes)#将训练数据拟合到visualizervisualizer.fit(EX_thetrain)testdatavisualizer.score(X_test,y_test)#Drawvisualizationg=visualizer.poof()当然还有分类评价指标的可视化,包括混淆矩阵,AUC/ROC,召回率/准确率等。,f1-score和排队率,用于二元分类器的判别阈值。辨别阈值是选择正类而不是负类的概率或分数。通常,这被设置为50%,但可以调整阈值以增加或减少对误报或其他应用因素的敏感度。fromsklearn.linear_modelimportLogisticRegressionfromyellowbrick.classifierimportDiscriminationThreshold#实例化分类模型和visualizerlogistic=LogisticRegression()visualizer=DiscriminationThreshold(logistic)visualizer.fit(X,y)#拟合可视化数据(X,y)#拟合训练data(thevisualizer)/show/poofthedataclusteringElbowMethodKElbowVisualizer实现了“elbow”方法,通过使模型具有K值的范围来帮助数据科学家选择最佳的聚类数。如果折线图类似于一个手臂,然后是“肘部”(拐点是曲线)是一个很好的指示,表明基础模型最适合该点。在下面的示例中,KElbowVisualizer在具有8个随机点集的样本2D数据集上拟合KMeans模型,以获得从4到11的K值范围。当模型拟合8个聚类时,我们可以在图中看到“肘部”,在这种情况下,我们知道它是最佳数字。fromsklearn.datasetsimportmake_blobs#创建具有8个随机簇的合成数据集X,y=make_blobs(centers=8,n_features=12,shuffle=True,random_state=42)fromsklearn.clusterimportKMeansfromclusteryellowbrick.clusterimportKElbowVisualizer#modelandvisualizermodel=KMeans()visualizer=KElbowVisualizer(model,k=(4,12))visualizer.fit(X)#Fitthedatatothevisualizervisualizer.poof()#Draw/show/poofdataclustersIntercluster之间的距离图距离图显示2D聚类中心的嵌入,并保留到其他中心的距离。例如。中心离可视化越近,它们就越接近原始特征空间。根据评分指标调整集群的大小。默认情况下,它们按内部数据排序,例如属于每个集线器的实例数。这给出了集群的相对重要性。但是请注意,由于两个簇在2D空间中重叠,并不意味着它们在原始特征空间中重叠。fromsklearn.datasetsimportmake_blobs#Make_blobs(centers=12,n_samples=1000,n_features=16,shuffle=True)fromsklearn.clusterimportKMeansfromyellowbrick.clusterimportInterclusterDistance#实例化集群模型=InterclusterDistance(KMeans(9))visualizer.fit(X)#Fitthetrainingdatatothevisualizervisualizer.poof()#draw/show/poofthedatamodelselection-learningcurveLearningCurve学习曲线是根据不同的训练次数样本,检查模型训练分数和交叉验证测试分数之间的关系。这种可视化通常用来表达两件事:随着数据量的增加,模型会变得更好吗?该模型对偏差和方差更敏感。以下是使用yellowbrick生成的学习曲线的可视化。此学习曲线适用于分类、回归和聚类。模型选择-验证曲线ValidationCurve模型验证用于确定模型对其训练数据的有效性以及它对新输入的泛化能力。为了衡量模型的性能,我们首先将数据集分为训练和测试,将模型拟合到训练数据上,并对保留的测试数据进行评分。为了最大化得分,必须选择模型的超参数以最好地允许模型在指定的特征空间中运行。大多数模型都有多个超参数,选择这些参数组合的最佳方法是使用网格搜索。但是,有时绘制单个超参数对训练和测试数据的影响以确定模型对于某些超参数值是欠拟合还是过拟合很有用。importnumpyasnpfromsklearn.treeimportDecisionTreeRegressorfromyellowbrick.model_selectionimportValidationCurve#加载回归数据集data=load_data('energy')#指定感兴趣的特征和目标targets=["heatingload","coolingload"]colfeatures=[forcolindata.columnsifcolnotintargets]#提取实例和targetX=data[features]y=data[targets[0]]viz=ValidationCurve(DecisionTreeRegressor(),param_name="max_depth",param_range=np.arange(1,11),cv=10,scoring="r2")#fitandpoofthevisualizerviz.fit(X,y)viz.poof()总结个人觉得yellowbrick这个工具很好,一个是因为它解决了特性工程和建模过程中的可视化问题,大大简化了操作;其次,通过各种可视化,也可以补充一些建模的盲点。本文仅展示建模中的部分可视化功能。详细完整的功能请参考:https://www.scikit-yb.org/en/...如果觉得有帮助,请点个赞!欢迎来到我的个人公众号:PythonDataScience
