Press "Enter" to skip to content

运用sklearn进行主成分分析(PCA)代码实现

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

运用sklearn进行主成分分析()代码实现

 

二、sklearn的PCA类介绍

 

三、分类结果区域可视化函数

 

四、10行代码完成葡萄酒数据集分类

 

一、前言及回顾

 

从上一篇 《PCA数据降维原理及python应用(葡萄酒案例分析)》 ,我们知道,主成分分析PCA是一种无监督数据压缩技术,上一篇逐步自行写代码能够让我更好地理解PCA内部实现机制,那知识熟悉以及技术成熟后我们可以运用什幺提高编码效率?

 

答案就是:基于sklearn的主成分分析代码实现,使用PCA类进行无监督数据降维,仍然以 葡萄酒数据集wine.data 为案例,本文将运用sklearn封装的PCA类来实现,提高编码效率,而且会感觉十分简单,前提需要学习理解PCA实现原理及步骤。

 

这里回顾: 《PCA数据降维原理及python应用(葡萄酒案例分析)》

 

二、sklearn的PCA类介绍

 

sklearn中的PCA类相当于一个转换器,首先用训练数据来拟合模型,以葡萄酒数据集为例,通过逻辑回归转化样本数据,实现了主成分分析以及特征提取,直接调用PCA类即可。

 

三、分类结果区域可视化函数

 

为了在分类结果区别决策区域并可视化表示,这里编写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行代码完成葡萄酒数据集分类

 

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 .linear_model import LogisticRegression
from .decomposition import PCA
from .preprocessing import StandardScaler
from .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,大伙来一起学习,分享学习成果!

 

我的博客园: https://www.cnblogs.com/chenzhenhong/p/13491526.html

 

我的CSDN: 基于sklearn的主成分分析(PCA)代码实现

 

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

 

本文链接: https://blog.csdn.net/Charzous/article/details/107958972

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注