天天看點

機器學習 - 主成分分析學習目标1 什麼是主成分分析(PCA)2 案例:探究使用者對物品類别的喜好細分降維

學習目标

  • 應用PCA實作特征的降維
  • 應用:使用者與物品類别之間主成分分析

1 什麼是主成分分析(PCA)

  • 定義:高維資料轉化為低維資料的過程,在此過程中可能會舍棄原有資料、創造新的變量
  • 作用:是資料維數壓縮,盡可能降低原資料的維數(複雜度),損失少量資訊。
  • 應用:回歸分析或者聚類分析當中

那麼更好的了解這個過程呢?我們來看一張圖

機器學習 - 主成分分析學習目标1 什麼是主成分分析(PCA)2 案例:探究使用者對物品類别的喜好細分降維

1.1 計算案例了解(了解,無需記憶)

假設對于給定5個點,資料如下

(-1,-2)
(-1, 0)
( 0, 0)
( 2, 1)
( 0, 1)
           
機器學習 - 主成分分析學習目标1 什麼是主成分分析(PCA)2 案例:探究使用者對物品類别的喜好細分降維

要求:将這個二維的資料簡化成一維? 并且損失少量的資訊

機器學習 - 主成分分析學習目标1 什麼是主成分分析(PCA)2 案例:探究使用者對物品類别的喜好細分降維

這個過程如何計算的呢?找到一個合适的直線,通過一個矩陣運算得出主成分分析的結果(不需要了解)

機器學習 - 主成分分析學習目标1 什麼是主成分分析(PCA)2 案例:探究使用者對物品類别的喜好細分降維

1.2 API

  • sklearn.decomposition.PCA(n_components=None)
    • 将資料分解為較低維數空間
    • n_components:
      • 小數:表示保留百分之多少的資訊
      • 整數:減少到多少特征
    • PCA.fit_transform(X) X:numpy array格式的資料[n_samples,n_features]
    • 傳回值:轉換後指定次元的array

1.3 資料計算

先拿個簡單的資料計算一下

[[2,8,4,5],
[6,3,0,8],
[5,4,9,1]]
           
def pca():
    """
    主成分分析進行降維
    :return:
    """
    # 資訊保留70%
    pca = PCA(n_components=0.7)
    data = pca.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
    print(data)

    return None
           

2 案例:探究使用者對物品類别的喜好細分降維

資料如下:

  • 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

2.1 需求

機器學習 - 主成分分析學習目标1 什麼是主成分分析(PCA)2 案例:探究使用者對物品類别的喜好細分降維
機器學習 - 主成分分析學習目标1 什麼是主成分分析(PCA)2 案例:探究使用者對物品類别的喜好細分降維

2.2 分析

  • 合并表,使得user_id與aisle在一張表當中
  • 進行交叉表變換
  • 進行降維

2.3 完整代碼

# 去讀四張表的資料
prior = pd.read_csv("./data/instacart/order_products__prior.csv")
products = pd.read_csv("./data/instacart/products.csv")
orders = pd.read_csv("./data/instacart/orders.csv")
aisles = pd.read_csv("./data/instacart/aisles.csv")

# 合并四張表
mt = pd.merge(prior, products, on=['product_id', 'product_id'])
mt1 = pd.merge(mt, orders, on=['order_id', 'order_id'])
mt2 = pd.merge(mt1, aisles, on=['aisle_id', 'aisle_id'])

# pd.crosstab 統計使用者與物品之間的次數關系(統計次數)
cross = pd.crosstab(mt2['user_id'], mt2['aisle'])

# PCA進行主成分分析
pc = PCA(n_components=0.95)
data = pc.fit_transform(cross)
           

繼續閱讀