1. 程式人生 > >機器學習實踐(五)—sklearn之特徵降維

機器學習實踐(五)—sklearn之特徵降維

一、特徵降維概述

  • 為什麼要對特徵進行降維處理

    • 如果特徵本身存在問題或者特徵之間相關性較強,對於演算法學習預測會影響較大
  • 什麼是降維

    • 降維是指在某些限定條件下,降低隨機變數(特徵)個數,得到一組“不相關”主變數的過程
  • 降維的作用

    • 減少特徵數量
    • 減少特徵相關性,去除相關性強的特徵,比如 相對溼度與降雨量
  • 降維的兩種方式

    • 特徵選擇
    • 主成分分析(PCA)

二、什麼是特徵選擇

  • 定義

    旨在從原有特徵中找出主要特徵,去除冗餘或無關特徵。

  • 方法

    • Filter(過濾式):主要探究特徵本身特點、特徵與特徵和目標值之間關聯。

      • 方差選擇法:低方差特徵過濾
      • 相關係數
    • Embedded (嵌入式):演算法自動選擇特徵(特徵與目標值之間的關聯)

      • 決策樹:資訊熵、資訊增益
      • 正則化:L1、L2
      • 深度學習:卷積

      Embedded方式,在講解演算法時再進行介紹

  • 模組

    sklearn.feature_selection
    

三、降維 - 特徵選擇 - 過濾式 - 方差選擇法

  • 低方差特徵過濾,刪除低方差的一些特徵,

    • 特徵方差小:在多個樣本中某個特徵的值會比較相近
    • 特徵方差大:在多個樣本中某個特徵的值是有些許差別的
  • API

    sklearn.feature_selection.VarianceThreshold(threshold = 0.0)

    • 刪除所有低方差特徵
    • Variance.fit_transform(X)
      • X:numpy array格式的資料
      • 返回值:訓練集方差 低於 threshold 的特徵將被刪除。預設值是保留所有非零方差特徵,即刪除所有樣本中具有相同值的特徵。
  • 示例程式碼

    import pandas as pd
    from sklearn.feature_selection import VarianceThreshold
    
    data = pd.read_csv('factor_returns.csv')
    
    print(data[data.columns[1:-2]].shape)
    
    # 1、例項化一個轉換器類
    transfer = VarianceThreshold(threshold=1)
    
    # 2、呼叫fit_transform
    new_data = transfer.fit_transform(data[data.columns[1:-2]])
    
    # 3、刪除低方差特徵的結果
    print(new_data.shape)
    

四、降維 - 特徵選擇 - 過濾式 - 相關係數

  • 皮爾遜相關係數(Pearson Correlation Coefficient)

    • 反映特徵之間相關關係密切程度的統計指標
  • 公式(瞭解)

    r = n x y x y n x 2 ( x ) 2 n y 2 ( y ) 2 r = \frac{n\sum{xy} - \sum{x}\sum{y}}{\sqrt{n\sum{x^2}-(\sum{x})^2}\sqrt{n\sum{y^2}-(\sum{y})^2}}

    上面是協方差,下面是各自的標準差

  • 特點

    • 相關係數的值介於 –1 與 +1 之間,即 1 r + 1 –1≤ r ≤+1
    • r > 0 r>0 時,表示兩變數正相關, r < 0 r<0 時,兩變數為負相關
    • 當 0<|r|<1 時,表示兩變數存在一定程度的相關。且|r|越接近1,兩變數間線性關係越密切;|r|越接近於0,表示兩變數的線性相關越弱
    • 當|r|=1時,表示兩變數為完全相關,當r=0時,表示兩變數間無相關關係。
    • 一般可按三級劃分:|r|<0.4為低度相關;0.4≤|r|<0.7為顯著性相關;0.7≤|r|<1為高度線性相關。
  • API

    from scipy.stats import pearsonr

  • 示例程式碼

    import pandas as pd
    from scipy.stats import pearsonr
    
    data = pd.read_csv('./data/factor_returns.csv')
    
    factor = ['pe_ratio', 'pb_ratio', 'market_cap', 'return_on_asset_net_profit', 'du_return_on_equity', 'ev',
                  'earnings_per_share', 'revenue', 'total_expense']
    
    datas = [(factor[i], factor[j + 1], pearsonr(data[factor[i]], data[factor[j + 1]])[0]) for i in range(len(factor)) for j in range(i, len(factor) - 1)]
    
    for data in datas:
        print("指標 {} 與指標 {} 之間的相關性大小為 {} ".format(*data))
    

五、降維 - 主成分分析(PCA)

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

    • 定義:高維資料轉化為低維資料的過程,在此過程中可能會捨棄原有資料、創造新的變數

    • 作用:是資料維數壓縮,儘可能降低原資料的維數(複雜度),損失少量資訊。

    • 應用:迴歸分析或者聚類分析當中

      在決策樹中’資訊’一詞會有清晰理解

  • API

    sklearn.decomposition.PCA(n_components=None)

    • 將資料分解為較低維數空間
    • n_components:
      • 小數:保留百分之多少的資訊
      • 整數:減少到具體的多少個特徵
    • PCA.fit_transform(X)
      • X:numpy array 格式的資料
      • return:轉換為指定維度後的 array
  • 示例程式碼

    from sklearn.decomposition import PCA
    
    data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]
    
    # 1、例項化PCA, 小數—保留百分之多少資訊
    transfer = PCA(n_components=0.9)
    # 2、呼叫fit_transform
    data1 = transfer.fit_transform(data)
    print("保留90%的資訊,降維結果為:\n", data1)
    
    # 1、例項化PCA, 整數——指定降維到的維數
    transfer2 = PCA(n_components=3)
    # 2、呼叫fit_transform
    data2 = transfer2.fit_transform(data)
    print("降維到3維的結果:\n", data2)
    

六、降維 - 案例

  • 目的

    探究使用者對物品類別的喜好細分降維

  • 現有資料

    • 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
  • 分析

    • 合併表,使得user_idaisle在一張表當中
    • 進行交叉表變換
    • 進行降維
  • 完整程式碼

    import pandas as pd
    from sklearn.decomposition import PCA
    
    # 1、獲取資料集 
    products = pd.read_csv("./data/instacart/products.csv")  # 商品資訊
    order_products = pd.read_csv("./data/instacart/order_products__prior.csv")  # 訂單與商品資訊
    orders = pd.read_csv("./data/instacart/orders.csv")  # 使用者的訂單資訊
    aisles = pd.read_csv("./data/instacart/aisles.csv")  # 商品所屬具體物品類別
    
    # 2、合併表,將user_id和aisle放在一張表上
    # 1)合併 orders 和 order_products 
    tab1 = pd.merge(aisles, products, on="aisle_id")
    # 2)合併 tab1 和 products
    tab2 = pd.merge(tab1, order_products, on="product_id")
    # 3)合併 tab2 和 aisles 
    tab3 = pd.merge(tab2, orders, on="order_id")
    
    # 3、交叉表處理,把 user_id 和 aisle 進行分組 
    table = pd.crosstab(tab3["user_id"], tab3["aisle"])
    
    # 4、主成分分析的方法進行降維
    # 1)例項化一個轉換器類PCA
    transfer = PCA(n_components=0.95)
    # 2)fit_transform
    data = transfer.fit_transform(table)
    
    # 檢視降維結果
    data.shape