做者|Conor O'Sullivan
编译|VK
来源|Towards Data Sciencepython
主成分分析(PCA)是一个很好的工具,能够用来下降特征空间的维数。PCA的显著优势是它能产生不相关的特征,并能提升模型的性能。git
它能够帮助你深刻了解数据的分类能力。在本文中,我将带你了解如何使用PCA。将提供Python代码,完整的项目能够在GitHub连接:https://github.com/conorosully/medium-articles。github
咱们先复习一下这个理论。若是你想确切了解PCA是如何工做的,咱们不会详细介绍,网上有大量学习资源。api
PCA用于减小用于训练模型的特征的数量。它经过从多个特征构造所谓的主成分(PC)来实现这一点。dom
PC的构造方式使得PC1方向在最大变化上尽量地解释了你的特征。而后PC2在最大变化上尽量地解释剩余特征,等等……PC1和PC2一般能够解释整体特征变化中的很大一部分。机器学习
另外一种思考方法是,前两个PC能够很好地归纳大部分特征。这很重要,由于正如咱们将看到的,它容许咱们在二维平面上可视化数据的分类能力。工具
让咱们来看看一个实际的例子。咱们将使用PCA来探索乳腺癌数据集(http://archive.ics.uci.edu/ml/datasets/breast+cancer+wisconsin+(diagnostic)),咱们使用下面的代码导入该数据集。性能
import numpy as np import pandas as pd from sklearn.datasets import load_breast_cancer cancer = load_breast_cancer() data = pd.DataFrame(cancer['data'],columns=cancer['feature_names']) data['y'] = cancer['target']
目标变量是乳腺癌检测的结果,恶性或良性。每次测试,都要取多个癌细胞。而后从每一个癌细胞中采起10种不一样的措施。这些测量包括细胞半径和细胞对称性。最后,为了获得特征值,咱们计算了每一个度量值的平均值、标准偏差和最大值(不太好的),这样咱们总共获得30个特征值。学习
在图中,咱们仔细观察了其中两个特征——细胞的平均对称性(Benign)和最差平滑度(worst smoothness)。测试
在图中,咱们看到这两个特征能够帮助区分这两个类。那就是良性肿瘤每每更为对称和光滑。可是,仍然有不少重叠,因此仅仅使用这些特征的模型不会作得很好。
咱们能够建立这样的图来了解每一个特征的预测能力。可是有30个特征,这意味着有至关多的图要分析,他们也没有告诉咱们如何做为一个总体来预测数据集。这咱们能够引入PCA。
首先,咱们对整个数据集进行主成分分析。咱们使用下面的代码。
from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA #标准化 scaler = StandardScaler() scaler.fit(data) scaled = scaler.transform(data) #PCA pca = PCA().fit(scaled) pc = pca.transform(scaled) pc1 = pc[:,0] pc2 = pc[:,1] #画出主成分 plt.figure(figsize=(10,10)) colour = ['#ff2121' if y == 1 else '#2176ff' for y in data['y']] plt.scatter(pc1,pc2 ,c=colour,edgecolors='#000000') plt.ylabel("Glucose",size=20) plt.xlabel('Age',size=20) plt.yticks(size=12) plt.xticks(size=12) plt.xlabel('PC1')
咱们首先标准化特征,使它们的平均值为0,方差为1。这一点很重要,由于主成分分析经过最大化主成分分析所解释的方差来工做。
一些特征因为其没有通过标准化天然会有更高的方差。例如,以厘米为单位测量的距离将比以千米为单位测量的相同距离具备更高的方差。在不缩放特征的状况下,主成分分析将被那些高方差特征“吸引”。
缩放完成后,咱们会拟合PCA模型,并将咱们的特征转换为PC。因为咱们有30个特征,咱们最多能够有30个PC。可是,对于可视化,咱们只对前两个感兴趣。而后使用PC1和PC2建立如图所示的散点图。
在图2中,咱们能够看到两个不一样的簇。虽然仍然有一些重叠,可是簇比咱们在以前的图中要清晰得多。这告诉咱们,做为一个总体,这个数据集在区分恶性肿瘤和良性肿瘤方面会作得很好。
咱们还应该考虑到,咱们只关注前两个PC,所以并非全部特征的变化都被捕获。这意味着使用全部特征训练的模型仍然能够正确预测异常值(即聚类中不清楚的点)。
在这一点上,咱们应该提到这种方法的一个警告。咱们提到PC1和PC2能够解释你的特征中很大一部分的差别。然而,这并不老是真的。在这种状况下,这些PC能够被认为是对你的特征的错误总结。这意味着,即便你的数据可以很好地分离,你也可能没法得到如上图所示的清晰的簇。
咱们能够经过查看PCA-scree图来肯定。咱们使用下面的代码为这个分析建立scree图,
var = pca.explained_variance_[0:10] #percentage of variance explained labels = ['PC1','PC2','PC3','PC4','PC5','PC6','PC7','PC8','PC9','PC10'] plt.figure(figsize=(15,7)) plt.bar(labels,var,) plt.xlabel('Pricipal Component') plt.ylabel('Proportion of Variance Explained')
它本质上是一个柱状图,其中每一个柱状图的高度是相关PC解释的方差百分比。咱们看到,总共只有大约20%的特征方差是由PC1和PC2解释的。即便只解释了20%,咱们仍然获得两个不一样的集群。这强调了数据的预测能力。
到目前为止,咱们已经使用主成分分析来了解整个特征集对数据的分类效果。咱们也可使用这个过程来比较不一样的特征组。例如,假设咱们想知道细胞的对称性和光滑性是否比细胞的周长和凹陷性更好。
group_1 = ['mean symmetry', 'symmetry error','worst symmetry', 'mean smoothness','smoothness error','worst smoothness'] group_2 = ['mean perimeter','perimeter error','worst perimeter', 'mean concavity','concavity error','worst concavity']
咱们首先建立两组特征。第一组包含全部与对称性和光滑性有关的特征,第二组包含全部与周长和凹陷性有关的特征。而后,除了使用这两组特征外,咱们以与以前相同的方式进行主成分分析。这个过程的结果以下图所示。
咱们能够看到,对于第一组,有一些分离,但仍然有不少重叠。相比之下,第2组有两个不一样的簇。所以,从这些图中,咱们能够预期第2组的特征(即细胞周长和凹陷)将是更好的预测肿瘤是恶性仍是良性的指标。
最终,这将意味着使用组2中的特征的模型比使用组1中的特征的模型具备更高的精度。如今,让咱们来验证这个假设。
咱们使用下面的代码来训练一个使用两组特征的logistic回归模型。在每种状况下,咱们使用70%的数据来训练模型,剩下的30%用来测试模型。
from sklearn.model_selection import train_test_split import sklearn.metrics as metric import statsmodels.api as sm for i,g in enumerate(group): x = data[g] x = sm.add_constant(x) y = data['y'] x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.3, random_state = 101) model = sm.Logit(y_train,x_train).fit() #fit logistic regression model predictions = np.around(model.predict(x_test)) accuracy = metric.accuracy_score(y_test,predictions) print("Accuracy of Group {}: {}".format(i+1,accuracy))
第一组测试集的准确率为74%,相比之下,第二组的准确率为97%。所以,组2的特征明显是更好的预测因子,这正是咱们从主成分分析结果中所看到的。
最后,咱们将了解如何在开始建模以前使用PCA来加深对数据的理解。了解哪些特征是可预测的,将在特征选择方面给你带来优点。此外,查看特征的整体分类能力将使你了解预期的分类精度。
如前所述,这种方法并不能彻底证实,所以应与其余数据勘探图和汇总统计一块儿使用。通常来讲,在开始建模以前,最好从尽量多的不一样角度查看数据。
原文连接:https://towardsdatascience.com/visualising-the-classification-power-of-data-54f5273f640
欢迎关注磐创AI博客站:
http://panchuang.net/
sklearn机器学习中文官方文档:
http://sklearn123.com/
欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/