数据降维——主成分分析

PCA 实战 任务


1、基于 iris_data.csv 数据,建立 KNN 模型实现数据分类(n_neighbors=3)
2、对数据进行标准化处理,选取一个维度可视化处理后的效果
3、进行与原数据等维度 PCA,查看各主成分的方差比例
4、保留合适的主成分,可视化降维后的数据
5、基于降维后数据建立 KNN 模型,与原数据表现进行对比

参考资料

视频资料

23.26 主成分分析_哔哩哔哩_bilibili

26.30 实战(3)_哔哩哔哩_bilibili

 博文:机器学习-监督学习之降维算法(PCA) - 周文豪 - 博客园

数据准备

数据集名称:iris_data.csv

点我转到百度网盘获取数据集 提取码: 8497 

建立 KNN 模型实现数据分类

加载数据

#load data
import pandas as pd
import numpy as np
data = pd.read_csv('iris_data.csv')
data.head()

X = data.drop(['target','label'], axis = 1)#去掉两列
y = data.loc[:, 'label']# 只需要标签列
# X.head()
# y.head()

 建立KNN模型实现数据分类(n_neighbors=3)

#establish knn model and calculate the accuracy
from sklearn.neighbors import KNeighborsClassifier
KNN = KNeighborsClassifier(n_neighbors = 3)#选用最近的3个点来预测新的点属于哪一类
KNN.fit(X,y)
y_predict = KNN.predict(X)
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y, y_predict)
print(accuracy) #0.96

 数据准化,选取一个维度可视化

 标准化

#对数据进行标准化处理,选取一个维度可视化处理后的效果
#使用数据预处理工具包
from sklearn.preprocessing import StandardScaler
X_norm = StandardScaler().fit_transform(X) #进行数据标准化处理
print(X_norm)

 选取一个维度(sepal length)计算均值和方差

#calculate the mean and sigma
x1_mean = X.loc[:,'sepal length'].mean()
x1_norm_mean = X_norm[:,0].mean()
x1_sigma = X.loc[:,'sepal length'].std()
x1_norm_sigma = X_norm[:,0].std()
print(x1_mean, x1_sigma, x1_norm_mean, x1_norm_sigma) 
#5.843333333333334 0.828066127977863 -4.736951571734001e-16 1.0

 选取一个维度,可视化处理后的效果

%matplotlib inline
from matplotlib import pyplot as plt
fig1 = plt.figure(figsize = (20,5))
plt.subplot(121)
plt.hist(X.loc[:,'sepal length'], bins = 100) # 只取其中一个维度的数据

plt.subplot(122)
plt.hist(X_norm[:,0], bins = 100) #标准化后的数据集的第一列
plt.show()

 

进行与原数据等维度 PCA,查看各主成分的方差比例

等维度PCA

#进行与原数据等维度 PCA,查看各主成分的方差比例
# pca analysis
from sklearn.decomposition import PCA
pca = PCA(n_components = 4) # 同等维度(维度 为 4)
X_pca = pca.fit_transform(X_norm) #参数为标准化之后的数据

 查看各主成分方差比

#calculate the variance ration of each principle components
var_ratio = pca.explained_variance_ratio_ #各个维度的方差
print(var_ratio) # [0.72770452 0.23030523 0.03683832 0.00515193]

可视化方差比例 

#可视化方差比例
fig2 = plt.figure(figsize = (20,5))
plt.bar([1,2,3,4],var_ratio)#四个主成份(维度)
plt.xticks([1,2,3,4],['PC1','PC2','PC3','PC4'])
plt.ylabel('variance ratio of each PC')
plt.show()
#从下图可以直观看到,后面两项方差比例很小,数据的相关度非常高,很多信息是重复的
#所以可以舍弃掉,选择前面两项作为主成分

 保留合适的主成分,可视化降维后的数据

保留主成分

pca = PCA(n_components = 2) # 维度设置成 2 了, 只需要保留前面两个成分 即开始降维
X_pca = pca.fit_transform(X_norm) # 降维后的数据,参数为标准化之后的数据
X_pca.shape#(150, 2)
print(type(X_pca)) #<class 'numpy.ndarray'>

可视化降维后的数据

#visualize the PCA result
fig3 = plt.figure(figsize = (8,8))
setosa = plt.scatter(X_pca[:,0][y==0], X_pca[:,1][y==0])
versicolor = plt.scatter(X_pca[:,0][y==1], X_pca[:,1][y==1])
virginica = plt.scatter(X_pca[:,0][y==2], X_pca[:,1][y==2])
plt.legend((setosa, versicolor, virginica),('setosa', 'versicolor', 'virginica'))
plt.show()
#原来四维是没办法进行可视化的,现在二维,能可视化,效果也很好

基于降维后数据建立 KNN 模型,与原数据表现进行对比

#再建立一次KNN模型,看准确率怎么样
KNN = KNeighborsClassifier(n_neighbors = 3)
KNN.fit(X_pca,y) # X_pca=============================
y_predict = KNN.predict(X_pca)
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y, y_predict)
print(accuracy) #0.9466666666666667  原来四个维度的:0.96

 原来是0.96,下降了一点,说明效果其实还挺不错的。

PCA 实战总结


1、通过计算数据对应的主成分(principle components),可在减少数据维度同时尽可能保留主要信息;
2、为确定合适的主成分维度,可先对数据进行与原数据相同维度的 PCA 处理,再根据各个成分的数据方差确认主成分维度;
3、核心算法参考链接:https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html?highlight=pca#sklearn.decomposition.PCA

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值