python pca 分类变量_python与机器学习入门(9)PCA主成分原理与实现

1.降维

简单粗暴的说:降低自变量的个数,可以简化问题,便于分析

比方说:在***多元线性回归***中提到的,并不需要所有的自变量,只需要挑选出几个最重要的自变量,再去进行分析

同时,这也有利于进行可视化分析

2.降维的方法特征选择

1.反向淘汰 2.顺向选择 3.双向淘汰 4.信息量比较

思想是:原有的自变量不变,只进行提取

比如10个自变量,提取出5个进行分析

特征提取

1.PCA主成分 2.kernel PCA

就是提取的新的5个自变量已经不是原来的自变量了,即重新排列组合得到

3.PCA介绍

一种无监督模型,在具有m条自变量的数据中,PCA从中提取出p个新的自变量,p≤m,可以较好地解释数据自变量的方差(差异性)

注意:不关乎因变量是什么

其实,PCA也可以叫寻找最大方差的方向,将下图的两类数据运用一次PCA

得到下面的图,可以观察到,在PC1的方向上,数据的差异是比较大的,PC2的方向上数据的差异较小,那就可以说,PC1是最大方差的方向

找到了最大方差的方向之后,其他的数据就很可能是噪音了,便可以删除

4.PCA的数学原理X:m个自变量的矩阵,对X进行特征缩放

A:X的方差矩阵

A的特征值与特征向量,并大到小排列

选取P:解释方差的百分比,并选取前P个特征值,使得:

解释公式: 前P个就是最大的那些P,使得这些值的和,比上所有特征值的和大于等于P对应前P个特征值的特征向量,即为所选取的主成分

运用投射矩阵(此矩阵为选取的P个特征向量组成),维度由m变为了p

5.PCA实践

这次实践要分析的是非常著名的wine数据集,可以点进去下载,没法下载的没关系,文章末尾有源码与数据集的链接

数据集一共有14列,前13因变量列是关于酒的各种化学成分的多少,最后的自变量对应的是葡萄酒的品种(一共有3类),所以说我们的目的就是运用PCA提取主要的因变量,去对葡萄酒进行分类

下面每一部分都包含一小段代码

懒癌患者可以直接跳到文章末尾进行下载

下载的源码每一行代码都带有解释

导入数据集,选定自变量,因变量

特征缩放,以防止过拟合

运用PCA就行降维

由于两个数据可以很好的进行可视化,所以此处仅提取两个因变量

但是,两个变量可以很好地解释这所有的变量吗???

这次给大家提供的方法是,先设置主成分的为None,进行下面代码的检验,

pca = PCA(n_components = None) #创建pca对象,n_components成分的个数

X_train = pca.fit_transform(X_train) #拟合PCA,用训练集拟合pca模型,之后进行transform转化

X_test = pca.transform(X_test) # 测试集的转化,直接用pca

explained_variance = pca.explained_variance_ratio_ #得到每一个成分可以解释方差的百分比,用的是自带的方法

在Spyder的Variable explorer中打开explained_variance查看,前两个数据便可以代表大约56%的方差,所以可以放心将n_components 设为2

用训练集拟合逻辑回归模型

这部分可以参考[逻辑回归]

classifier = LogisticRegression(random_state = 0)

classifier.fit(X_train, y_train)

预测

y_pred = classifier.predict(X_test)

利用混淆矩阵对结果进行评估

本次结果可达到97%的准确率

from sklearn.metrics import confusion_matrix

cm = confusion_matrix(y_test, y_pred)可视化预测与实际的结果

这里只看测试集的结果,(源码中包含训练集的结果)可以看出来这里只有一个蓝点是出错的

X_set, y_set = X_test, y_test

X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),

np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))

plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),

alpha = 0.75, cmap = ListedColormap(('red', 'green', 'blue')))

plt.xlim(X1.min(), X1.max())

plt.ylim(X2.min(), X2.max())

for i, j in enumerate(np.unique(y_set)):

plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],

c = ListedColormap(('red', 'green', 'blue'))(i), label = j)

plt.title('Logistic Regression (Test set)')

plt.xlabel('PC1')

plt.ylabel('PC2')

plt.legend()

plt.show()

源码与数据集的下载请移步:次链接文章末尾https://blog.csdn.net/qq_38248958/article/details/83421589​blog.csdn.net


版权声明:本文为weixin_39814393原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。