1、前言及回顾html
2、sklearn的PCA类介绍python
5、完整代码函数
6、总结post
从上一篇《PCA数据降维原理及python应用(葡萄酒案例分析)》,咱们知道,主成分分析PCA是一种无监督数据压缩技术,上一篇逐步自行写代码可以让我更好地理解PCA内部实现机制,那知识熟悉以及技术成熟后咱们能够运用什么提升编码效率?学习
答案就是:基于sklearn的主成分分析代码实现,使用PCA类进行无监督数据降维,仍然以葡萄酒数据集wine.data为案例,本文将运用sklearn封装的PCA类来实现,提升编码效率,并且会感受十分简单,前提须要学习理解PCA实现原理及步骤。测试
这里回顾:《PCA数据降维原理及python应用(葡萄酒案例分析)》编码
sklearn中的PCA类至关于一个转换器,首先用训练数据来拟合模型,以葡萄酒数据集为例,经过逻辑回归转化样本数据,实现了主成分分析以及特征提取,直接调用PCA类便可。url
为了在分类结果区别决策区域并可视化表示,这里编写plot_decision_region函数。
def plot_decision_regions(x, y, classifier, resolution=0.02): markers = ['s', 'x', 'o', '^', 'v'] colors = ['r', 'g', 'b', 'gray', 'cyan'] cmap = ListedColormap(colors[:len(np.unique(y))]) x1_min, x1_max = x[:, 0].min() - 1, x[:, 0].max() + 1 x2_min, x2_max = x[:, 1].min() - 1, x[:, 1].max() + 1 xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution)) z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T) z = z.reshape(xx1.shape) plt.contourf(xx1, xx2, z, alpha=0.4, cmap=cmap) for idx, cc in enumerate(np.unique(y)): plt.scatter(x=x[y == cc, 0], y=x[y == cc, 1], alpha=0.6, c=cmap(idx), edgecolor='black', marker=markers[idx], label=cc)
10行感受是否很简单,确实关键步骤调用PCA类和plt画图总共10行。
代码以下:
pca = PCA(n_components=2) # 前两个主成分
lr = LogisticRegression() # 逻辑回归来拟合模型
x_train_pca = pca.fit_transform(x_train_std) x_test_pca = pca.fit_transform(x_test_std) lr.fit(x_train_pca, y_train) plot_decision_regions(x_train_pca, y_train, classifier=lr) plt.xlabel('PC1') plt.ylabel('PC2') plt.legend(loc='lower left') plt.show()
这里看出使用到的主成分也是前两个,使用逻辑回归对训练数据进行拟合,创建模型。
来看看结果就是这样。训练集上的分类效果仍是很不错,跟上次本身实现的PCA几乎同样,此次加上了区域的边界划分,更加直观!
测试集上呢?竟然是这样!
观察一下,发现好像也不是分类错误,而是发生镜像反转了。形成这种差别的缘由是,在测试集上的特征向量正负方向问题,因此须要将测试数据乘以-1反转镜像,从而获得正确的图像。
上面测试数据的pca直接乘以-1,修改成:
x_test_pca = pca.fit_transform(x_test_std) * -1 # 预测时候特征向量正负问题,乘-1反转镜像
这时候镜像反转就对了:看效果在测试集上的分类也不错。
固然,数据加载以及标准化处理仍是原来的方法。
# load data
df_wine = pd.read_csv('D:\\PyCharm_Project\\maching_learning\\wine_data\\wine.data', header=None) # 本地加载
# split the data,train:test=7:3
x, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, stratify=y, random_state=0) # standardize the feature 标准化单位方差
sc = StandardScaler() x_train_std = sc.fit_transform(x_train) x_test_std = sc.fit_transform(x_test)
这里完整给出代码,并实现训练效果和测效果子图的对比。
from sklearn.linear_model import LogisticRegression from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from matplotlib.colors import ListedColormap import matplotlib.pyplot as plt import pandas as pd import numpy as np def plot_decision_regions(x, y, classifier, resolution=0.02): markers = ['s', 'x', 'o', '^', 'v'] colors = ['r', 'g', 'b', 'gray', 'cyan'] cmap = ListedColormap(colors[:len(np.unique(y))]) x1_min, x1_max = x[:, 0].min() - 1, x[:, 0].max() + 1 x2_min, x2_max = x[:, 1].min() - 1, x[:, 1].max() + 1 xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution)) z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T) z = z.reshape(xx1.shape) plt.contourf(xx1, xx2, z, alpha=0.4, cmap=cmap) for idx, cc in enumerate(np.unique(y)): plt.scatter(x=x[y == cc, 0], y=x[y == cc, 1], alpha=0.6, c=cmap(idx), edgecolor='black', marker=markers[idx], label=cc) def main(): # load data
# df_wine = pd.read_csv('D:\\PyCharm_Project\\maching_learning\\wine_data\\wine.data', header=None) # 本地加载
df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data', header=None) # 服务器加载
# split the data,train:test=7:3
x, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, stratify=y, random_state=0) # standardize the feature 标准化单位方差
sc = StandardScaler() x_train_std = sc.fit_transform(x_train) x_test_std = sc.fit_transform(x_test) pca = PCA(n_components=2) lr = LogisticRegression() x_train_pca = pca.fit_transform(x_train_std) x_test_pca = pca.fit_transform(x_test_std) * -1 # 预测时候特征向量正负问题,乘-1反转镜像
lr.fit(x_train_pca, y_train) plt.figure(figsize=(6, 7), dpi=100) # 画图高宽,像素
plt.subplot(2, 1, 1) plot_decision_regions(x_train_pca, y_train, classifier=lr) plt.title('Training Result') plt.xlabel('PC1') plt.ylabel('PC2') plt.legend(loc='lower left') plt.subplot(2, 1, 2) plot_decision_regions(x_test_pca, y_test, classifier=lr) plt.title('Testing Result') plt.xlabel('PC1') plt.ylabel('PC2') plt.legend(loc='lower left') plt.tight_layout() # 子图间距
plt.show() if __name__ == '__main__': main()
此次学到了基于sklearn的主成分分析代码实现,使用PCA类进行无监督数据降维,明显感觉到编码效率提升许多,并且会感受十分简单,前提须要学习理解PCA实现原理及步骤,接下来准备学习第二种降维技术LDA,大伙来一块儿学习,分享学习成果!
个人博客园:http://www.javashuo.com/article/p-pwnjctfl-ng.html
个人CSDN:基于sklearn的主成分分析(PCA)代码实现