主成分分析
1.什么是主成分分析
- 定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据,创造新的变量。
- 作用:是数据维度压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
- 应用:回归分析或者聚类分析当中。
通过这个例子加深理解:
假设遂于给定的5个点,数据如下:
(-1,-2),(-1,0),(0,0),(2,1),(0,1)
要求:将这个二维数据简化成一维?并且损失少量的信息
找到一个合适的直线,通过一个矩阵运算得出主成分分析的结果。
2.使用主成分分析进行降维
- API
sklearn.decomposition.PCA(n_components=None)
- 将数据分解维较低维数空间
- (n_components:小数:表示保留百分之多少的信息;整数:减少到多少特征
- PCA_fit_transfprm(X):X:numpy array 格式的数据[n_samples,n_features]
- 返回值:转换后指定维度的array
- 数据计算
先拿简单数据计算:[[2,8,4,5],[6,3,0,8],[5,4,9,1]]
(1)首先导入包
from sklearn.decomposition import PCA
(2)编写pca_demo()函数:
def pca_demo():
'''
PCA降维
:return:
'''
data = [[2,8,4,5],[6,3,0,8],[5,4,9,1]]
#1.实例化一个转换器类
transfer = PCA(n_components= 2)
#2.调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n",data_new)
return None
(3)在主函数中调用pca_demo()
(4)结果:从四个特征降为两个特征
如果将实例化转换器类代码改为transfer = PCA(n_components= 0.95)
即保留95%的数据。
结果:也是将四个特征降为两个特征
3.案例:探究用户对物品类别的喜好细分降维
数据如下:
- order_products_ prior.csv:订单与商品信息
字段:order_ id, product_ id, add_ to_ ,cart_ order, reordered - products.csv: 商品信息
字段:product_id, product_ name, aisle_ id, department_ id - orders.csv:用户的订单信息
字段:order_id,user_id,eval _set,order. _numer… - aisles.csv:商品所属具体物品类别
字段:aisle_ id, aisle
- 需求
(1)需要将user_id和aisle放在同一张表中。------合并
(2)找到user_id和aisle之间的关系。------透视表和交叉表
(3)特征冗余过多。------PCA降维 - 具体步骤:
(1)使用jupyter notebook:(python3安装jupyter)
打开cmd,进入python目录下的Scripts:
输入以下代码:
pip3 install --upgrade pip
pip3 install jupyter
安装成功后:
回车就可以进入jupyter notebook了。
卸载jupyter:
使用pip uninstall jupyter
是卸不掉jupyter的
pip install pip-autoremove
pip-autoremove jupyter -y
(2) 新建一个python文件:
重命名:
(3)编辑代码
# 1.获取数据
# 2.合并表
# 3.找到找到user_id和aisle之间的关系
# 4.PCA降维
import pandas as pd
# 1.获取数据
order_products = pd.read_csv("E:\Python37\my code\skearncode\instacart\order_products__prior.csv")
orders = pd.read_csv("E:\Python37\my code\skearncode\instacart\orders.csv")
products = pd.read_csv("E:\Python37\my code\skearncode\instacart\products.csv")
aisles = pd.read_csv("E:\Python37\my code\skearncode\instacart\\aisles.csv")
# 2.合并表 user_id和aisle
# order_products_ prior.csv:订单与商品信息
# 字段:order_ id, product_ id, add_ to_ ,cart_ order, reordered
# products.csv: 商品信息
# 字段:product_id, product_ name, aisle_ id, department_ id
# orders.csv:用户的订单信息
# 字段:order_id,user_id,eval_set,order. _numer.....
# aisles.csv:商品所属,具体物品类别
# 字段:aisle_ id, aisle
# 合并aisles表和products
tab1 = pd.merge(aisles,products,on=["aisle_id","aisle_id"])
tab2 = pd.merge(tab1,order_products,on=["product_id","product_id"])
tab3 = pd.merge(tab2,orders,on=["order_id","order_id"])
# 3.找到找到user_id和aisle之间的关系
table = pd.crosstab(tab3["user_id"],tab3["aisle"])
# 4.PCA降维
from sklearn.decomposition import PCA
# 1)实例化一个转换器类
transfer = PCA(n_components= 0.95)
# 2)调用fit_transform
data = transfer.fit_transform(table)
(4)结果:
data
array([[-24.21565874, 2.4294272 , -2.46636975, ..., -0.08877715,
-0.38087761, 0.21568831],
[ 6.46320806, 36.75111647, 8.38255336, ..., 1.912145 ,
1.79468946, -0.70142249],
[ -7.99030162, 2.40438257, -11.03006405, ..., -0.72188348,
-1.15719089, -0.23704277],
...,
[ 8.61143331, 7.70129866, 7.95240226, ..., 0.23971061,
-0.78590175, -2.65945606],
[ 84.08621987, 20.41873398, 8.05410372, ..., -1.66893212,
0.5042934 , 3.82546312],
[-13.95345619, 6.64621821, -5.23030367, ..., -1.64144758,
-3.39233648, -0.31410713]])
data.shape
(206209, 44)