機器學習實踐(五)—sklearn之特徵降維
阿新 • • 發佈:2018-11-25
一、特徵降維概述
-
什麼是降維
- 降維是指在某些限定條件下,降低隨機變數(特徵)個數,得到一組“不相關”主變數的過程
-
降維的作用
- 減少特徵數量
- 減少特徵相關性,去除相關性強的特徵,比如 相對溼度與降雨量
-
降維的兩種方式
- 特徵選擇
- 主成分分析(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)
- 反映特徵之間相關關係密切程度的統計指標
-
公式(瞭解)
上面是協方差,下面是各自的標準差
-
特點
- 相關係數的值介於 –1 與 +1 之間,即 。
- 當 時,表示兩變數正相關, 時,兩變數為負相關
- 當 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
- order_products__prior.csv:訂單與商品資訊
-
分析
- 合併表,使得user_id與aisle在一張表當中
- 進行交叉表變換
- 進行降維
-
完整程式碼
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