学习目标

  • 目标
    • 应用PCA实现特征的降维
  • 应用

    • 用户与物品类别之间主成分分析

      2.6.1 什么是主成分分析(PCA)

  • 定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量

  • 作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
  • 应用:回归分析或者聚类分析当中

    对于信息一词,在决策树中会进行介绍

那么更好的理解这个过程呢?我们来看一张图
image.png

1 计算案例理解(了解,无需记忆)

假设对于给定5个点,数据如下

  1. (-1,-2)
  2. (-1, 0)
  3. ( 0, 0)
  4. ( 2, 1)
  5. ( 0, 1)

image.png
要求:将这个二维的数据简化成一维? 并且损失少量的信息
image.png
这个过程如何计算的呢?找到一个合适的直线,通过一个矩阵运算得出主成分分析的结果(不需要理解)
image.png

2 API

  • sklearn.decomposition.PCA(n_components=None)

    • 将数据分解为较低维数空间
    • n_components:
      • 小数:表示保留百分之多少的信息
      • 整数:减少到多少特征
    • PCA.fit_transform(X) X:numpy array格式的数据[n_samples,n_features]
    • 返回值:转换后指定维度的array

      3 数据计算

      先拿个简单的数据计算一下
      1. [[2,8,4,5],
      2. [6,3,0,8],
      3. [5,4,9,1]]
      1. from sklearn.decomposition import PCA
      2. def pca_demo():
      3. """
      4. 对数据进行PCA降维
      5. :return: None
      6. """
      7. data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]
      8. # 1、实例化PCA, 小数——保留多少信息
      9. transfer = PCA(n_components=0.9)
      10. # 2、调用fit_transform
      11. data1 = transfer.fit_transform(data)
      12. print("保留90%的信息,降维结果为:\n", data1)
      13. # 1、实例化PCA, 整数——指定降维到的维数
      14. transfer2 = PCA(n_components=3)
      15. # 2、调用fit_transform
      16. data2 = transfer2.fit_transform(data)
      17. print("降维到3维的结果:\n", data2)
      18. return None
      返回结果:
      1. 保留90%的信息,降维结果为:
      2. [[ -3.13587302e-16 3.82970843e+00]
      3. [ -5.74456265e+00 -1.91485422e+00]
      4. [ 5.74456265e+00 -1.91485422e+00]]
      5. 降维到3维的结果:
      6. [[ -3.13587302e-16 3.82970843e+00 4.59544715e-16]
      7. [ -5.74456265e+00 -1.91485422e+00 4.59544715e-16]
      8. [ 5.74456265e+00 -1.91485422e+00 4.59544715e-16]]

      2.6.2 案例:探究用户对物品类别的喜好细分降维

      image.png
      数据如下:
  • 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_number,….
  • aisles.csv:商品所属具体物品类别

    • 字段: aisle_id, aisle

      1 需求

      image.png

      2 分析

  • 合并表,使得user_idaisle在一张表当中

  • 进行交叉表变换
  • 进行降维

    3 完整代码

    1. import pandas as pd
    2. from sklearn.decomposition import PCA
    3. # 1、获取数据集
    4. # ·商品信息- products.csv:
    5. # Fields:product_id, product_name, aisle_id, department_id
    6. # ·订单与商品信息- order_products__prior.csv:
    7. # Fields:order_id, product_id, add_to_cart_order, reordered
    8. # ·用户的订单信息- orders.csv:
    9. # Fields:order_id, user_id,eval_set, order_number,order_dow, order_hour_of_day, days_since_prior_order
    10. # ·商品所属具体物品类别- aisles.csv:
    11. # Fields:aisle_id, aisle
    12. products = pd.read_csv("./instacart/products.csv")
    13. order_products = pd.read_csv("./instacart/order_products__prior.csv")
    14. orders = pd.read_csv("./instacart/orders.csv")
    15. aisles = pd.read_csv("./instacart/aisles.csv")
    16. # 2、合并表,将user_id和aisle放在一张表上
    17. # 1)合并orders和order_products on=order_id tab1:order_id, product_id, user_id
    18. tab1 = pd.merge(orders, order_products, on=["order_id", "order_id"])
    19. # 2)合并tab1和products on=product_id tab2:aisle_id
    20. tab2 = pd.merge(tab1, products, on=["product_id", "product_id"])
    21. # 3)合并tab2和aisles on=aisle_id tab3:user_id, aisle
    22. tab3 = pd.merge(tab2, aisles, on=["aisle_id", "aisle_id"])
    23. # 3、交叉表处理,把user_id和aisle进行分组
    24. table = pd.crosstab(tab3["user_id"], tab3["aisle"])
    25. # 4、主成分分析的方法进行降维
    26. # 1)实例化一个转换器类PCA
    27. transfer = PCA(n_components=0.95)
    28. # 2)fit_transform
    29. data = transfer.fit_transform(table)
    30. data.shape
    返回结果:
    1. (206209, 44)