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/83421589blog.csdn.net