学习目标
- 目标
o 应用PCA实现特征的降维 - 应用
o 用户与物品类别之间主成分分析
2.6.1 什么是主成分分析(PCA)
- 定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
- 作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
- 应用:回归分析或者聚类分析当中
对于信息一词,在决策树中会进行介绍
那么更好的理解这个过程呢?我们来看一张图
如果更好的对一个立体的物体二维表示?
可以看出第四张二维图片更能还原水壶信息,损失的信息是最少的
1. 计算案例理解(了解,不记忆)
假设对于给定5个点,数据如下
(-1,-2)
(-1, 0)
( 0, 0)
( 2, 1)
( 0, 1)
要求:将这个二维的数据简化成一维? 并且损失少量的信息
- 如果以横轴为基准,其他不在横轴的点做投影,那么五个点最后变成三个点,损失信息,而我们想要的是原来五个点,最后还是五个点
- 我们采用斜线为基准,进行投影,保留了五个点的全部信息
可以看出上图斜线变换角度也可以保留五个点的信息,且距离和最小,那么这个过程如何计算的呢?找到一个合适的直线,通过一个矩阵运算得出主成分分析的结果(不需要理解)
2. API
sklearn.decomposition.PCA(n_components=None)
- 将数据分解为较低维数空间
- n_components:
小数:表示保留百分之多少的信息
整数:减少到多少特征 - PCA.fit_transform(X) X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后指定维度的array
3. 数据计算
先拿个简单的数据计算一下
[[2,8,4,5],
[6,3,0,8],
[5,4,9,1]]
- 整数降维
from sklearn.decomposition import PCA
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)
输出:
降低到两个特征,降维结果为:
[[ 1.28620952e-15 3.82970843e+00]
[ 5.74456265e+00 -1.91485422e+00]
[-5.74456265e+00 -1.91485422e+00]]
- 小数降维
data =[[2,8,4,5],[6,3,0,8],[5,4,9,1]]
# 1.实例化一个转换器类,小数——保留95%的信息
transfer = PCA(n_components=0.95)
# 2.调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n",data_new)
输出结果
保留95%的信息,降维结果为:
[[ 1.28620952e-15 3.82970843e+00]
[ 5.74456265e+00 -1.91485422e+00]
[-5.74456265e+00 -1.91485422e+00]]
2.6.2 案例:探究用户对物品列别的喜好细分降维
数据如下:
- order_products__prior.csv:订单与商品信息
o 字段:order_id, product_id, add_to_cart_order, reordered - products.csv:商品信息
o 字段:product_id, product_name, aisle_id, department_id - orders.csv:用户的订单信息
o 字段:order_id,user_id,eval_set,order_number,…. - aisles.csv:商品所属具体物品类别
o 字段: aisle_id, aisle
需求
用户和物品类别的关系
user_id aisle
1. 获取数据集
import pandas as pd
order_products = pd.read_csv("./machine_learning/instacart/order_products__prior.csv")
products = pd.read_csv("./machine_learning/instacart/products.csv")
orders = pd.read_csv("./machine_learning/instacart/orders.csv")
aisles = pd.read_csv("./machine_learning/instacart/aisles.csv")
2. 合并表
# 合并aisle和products--->product_id和aisle在一起
# 按索引进行合并
tab1 = pd.merge(aisles,products,on=["aisle_id","aisle_id"])
# 合并tab1和order_products--->order_id和aisle在一起
tab2 = pd.merge(tab1,order_products,on=["product_id","product_id"]
# 合并tab2和orders--->user_id和aisle在一起
tab3 = pd.merge(tab2,orders,on=["order_id","order_id"])
tab3
tab3输出:
3. 交叉表,找到user_id和aisle的关系
# 3、交叉表处理,把user_id和aisle进行分组
table = pd.crosstab(tab3["user_id"], tab3["aisle"])
# 数据量太大了,运行时间太久,为了后续简单,我们减少数据量到10000
data = table[:10000]
data
data输出:
4. PCA降维
# 4、pca降维
from sklearn.decomposition import PCA
# 1)实例化一个转换器类PCA
transfer = PCA(n_components=0.95)
# 2)调用fit_transform
data_new = transfer.fit_transform(data)
data_new.shape
(10000, 42)
# 保留95的信息,从134个特征减少到42个特征