2021年10月11日 星期一

機器學習筆記 : 用 scikit-learn 做資料前處理 (一) : 數值資料

今天繼續來測試學習 scikit-learn 的資料前處理 (preprocessing) 功能, 據統計這部分占了資料科學/機器學習任務絕大部分時間. 本系列之前的文章參考 : 

 
機器學習中的資料前處理包含資料清洗 (data wrangling/cleansing) 與資料轉換, 通常先使用 Pandas 套件來做資料清洗, 將原始資料轉成乾淨且格式整齊的結構化資料, 再視任務需要用 scikit-learn 做資料轉換, 然後才能送入機器學習演算法進行運算. 

Scikit-learn 套件定義了用於監督式與非監督式機器學習的類別, 這些類別統稱為估計器 (estimator), 它可分為兩類 : 
  • 轉換器 (transformers) : 用來做資料預處理 (preprocessing)
  • 預測器 (predictors) : 用來透過訓練資料來生成規則
其中轉換器 (transformer) 類別, 都放在 preprocessing 模組內, 且都具有下列三種一致的 API 介面 :
  • fit() : 
  • transform() :
  • fit_transform() : 將 fit() 與 transform() 合而為一.
使用前須先匯入 preprocessing 模組, 然後建立預處理類別之物件, 再呼叫 fit (), transform(), 或 fit_transform() 方法進行處理. 例如要進行最小最大縮放需用到 MinMaxScaler 類別, 呼叫同名建構子即可建立物件 :

from sklearn import preprocessing    
minmaxscaler=preprocessing.MinMaxScaler()      

也可以從 sklearn.preprocessing 模組直接匯入 MinMaxScaler 類別, 這樣使用時就不需要用 preprocessing 去指涉了 :

from sklearn.preprocessing inport MinMaxScaler    
minmaxscaler=MinMaxScaler()       

以下測試主要是針對原始資料中的數值資料 :


1. 資料縮放 (data scalling) :     

有許多演算法假設所有的輸入特徵要比例縮放到 [-1, 1] 或 [0, 1] 的數值區間, 比較常用的縮放方式有兩種 :
  • 最小最大縮放 (min-max-scalling) : 
    以所有樣本最大值與最小值之間距為分母, 計算樣本與最小值之差與間距之比, sklearn 的預處理 preprocessing 模組提供了 MinMaxScaler 類別來處理這種轉換 :



  • 常態分佈標準化 :
    將所有特徵轉換成平均值為0, 標準差為 1 的近似標準常態分布, sklearn 的預處理 preprocessing 模組提供了 StndardScaler 類別來處理這種轉換 :



數學式繪製參考 :



1. 用 MinMaxScaler 類別進行比例縮放 : 

此類別的介面如下 : 

MinMaxScaler(feature_range)

參數 feature_range 為一個表示目標範圍的 tuple 或 list, 呼叫此類別建構子建立 MinMaxScaler 物件後, 再呼叫此物件的 fit_transform() 方法, 並將特徵當參數傳進去即可, 注意, 傳入之特徵必須是 2D 陣列, 否則會出現錯誤訊息, 若特徵不是浮點數會被強制轉換, 例如 :

>>> import numpy as np     
>>> from sklearn.preprocessing import MinMaxScaler     
>>> minmax_scaler=MinMaxScaler(feature_range=(0,1))     
>>> feature=np.array([[100.5], [200.3], [0.0], [80.6], [65.0]])   # 原始特徵 (2D 浮點數)
>>> scaled_feature=minmax_scaler.fit_transform(feature)     # 縮放後的特徵
>>> scaled_feature    
array([[0.50174738],
       [1.        ],
       [0.        ],
       [0.40239641],
       [0.32451323]])

可見每一個特徵都被縮放到 [0, 1] 之間. 也可以縮放到 [-1, 1] 之間, 例如 : 

>>> minmax_scaler=MinMaxScaler(feature_range=(-1,1))   
>>> feature=np.array([[100.5], [200.3], [0.0], [80.6], [65.0]])   # 原始特徵 (2D 浮點數)
>>> scaled_feature=minmax_scaler.fit_transform(feature)     # 縮放後的特徵
>>> scaled_feature    
array([[ 0.00349476],
       [ 1.        ],
       [-1.        ],
       [-0.19520719],
       [-0.35097354]])



2. 用 StandardScaler 類別進行標準常態分佈縮放 : 

此類別的介面如下 : 

StandardScaler()

呼叫此類別建構子建立 StandardScaler 物件後, 再呼叫此物件的 fit_transform() 方法, 並將特徵當參數傳進去即可, 注意, 傳入之特徵必須是 2D 陣列, 否則會出現錯誤訊息, 若特徵不是浮點數會被強制轉換, 例如 :

>>> import numpy as np   
>>> from sklearn.preprocessing import StandardScaler    
>>> standard_scaler=StandardScaler()      
>>> scaled_feature=standard_scaler.fit_transform(feature)      
>>> scaled_feature      
array([[ 0.1727704 ],
       [ 1.70953389],
       [-1.37477198],
       [-0.13365839],
       [-0.37387392]])
>>> np.mean(scaled_feature)        # 平均值近乎 0
-1.1102230246251566e-17
>>> np.std(scaled_feature)             # 標轉差近乎 1
0.9999999999999998

可見轉換後的平均值約是 0, 標準差約 1. 

沒有留言 :