1. 程式人生 > 其它 >4 特徵工程-特徵預處理

4 特徵工程-特徵預處理

1 什麼是特徵預處理

1.1 特徵預處理定義

scikit-learn的解釋

provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators.

翻譯過來:通過一些轉換函式將特徵資料轉換成更加適合演算法模型的特徵資料過程

為什麼我們要進行歸一化/標準化?

  • 特徵的單位或者大小相差較大,或者某特徵的方差相比其他的特徵要大出幾個數量級,容易影響(支配)目標結果,使得一些演算法無法學習到其它的特徵

1.2 包含內容(數值型資料的無量綱化)

  • 歸一化
  • 標準化

1.3 特徵預處理API

sklearn.preprocessing

2 歸一化

2.1 定義

通過對原始資料進行變換把資料對映到(預設為[0,1])之間

2.2 公式

作用於每一列,max為一列的最大值,min為一列的最小值,那麼X’’為最終結果,mx,mi分別為指定區間值預設mx為1,mi為0

那麼怎麼理解這個過程呢?我們通過一個例子

2.3 API

  • sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
    • MinMaxScalar.fit_transform(X)
      • X:numpy array格式的資料[n_samples,n_features]
    • 返回值:轉換後的形狀相同的array

2.4 資料計算

  • 分析

1、例項化MinMaxScalar

2、通過fit_transform轉換

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

def minmax_demo():
    """
    歸一化演示
    :return: None
    """
    data = pd.read_csv("dating.txt")
    print(data)
    # 1、例項化一個轉換器類
    transfer = MinMaxScaler(feature_range=(2, 3))
    
# 2、呼叫fit_transform data = transfer.fit_transform(data[['milage','Liters','Consumtime']]) print("最小值最大值歸一化處理的結果:\n", data) return None

2.5 歸一化總結

注意最大值最小值是變化的,另外,最大值與最小值非常容易受異常點影響,所以這種方法魯棒性較差,只適合傳統精確小資料場景。

3 標準化

3.1 定義

通過對原始資料進行變換把資料變換到均值為0,標準差為1範圍內

3.2 公式

作用於每一列,mean為平均值,σ為標準差

所以回到剛才異常點的地方,我們再來看看標準化

  • 對於歸一化來說:如果出現異常點,影響了最大值和最小值,那麼結果顯然會發生改變
  • 對於標準化來說:如果出現異常點,由於具有一定資料量,少量的異常點對於平均值的影響並不大,從而方差改變較小。

3.3 API

  • sklearn.preprocessing.StandardScaler( )
    • 處理之後每列來說所有資料都聚集在均值0附近標準差差為1
    • StandardScaler.fit_transform(X)
      • X:numpy array格式的資料[n_samples,n_features]
    • 返回值:轉換後的形狀相同的array

3.4 資料計算

同樣對上面的資料進行處理

  • 分析

1、例項化StandardScaler

2、通過fit_transform轉換

import pandas as pd
from sklearn.preprocessing import StandardScaler

def stand_demo():
    """
    標準化演示
    :return: None
    """
    data = pd.read_csv("dating.txt")
    print(data)
    # 1、例項化一個轉換器類
    transfer = StandardScaler()
    # 2、呼叫fit_transform
    data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
    print("標準化的結果:\n", data)
    print("每一列特徵的平均值:\n", transfer.mean_)
    print("每一列特徵的方差:\n", transfer.var_)

    return None

返回結果

     milage     Liters  Consumtime  target
0     40920   8.326976    0.953952       3
1     14488   7.153469    1.673904       2
2     26052   1.441871    0.805124       1
..      ...        ...         ...     ...
997   26575  10.650102    0.866627       3
998   48111   9.134528    0.728045       3
999   43757   7.882601    1.332446       3

[1000 rows x 4 columns]
標準化的結果:
 [[ 0.33193158  0.41660188  0.24523407]
 [-0.87247784  0.13992897  1.69385734]
 [-0.34554872 -1.20667094 -0.05422437]
 ..., 
 [-0.32171752  0.96431572  0.06952649]
 [ 0.65959911  0.60699509 -0.20931587]
 [ 0.46120328  0.31183342  1.00680598]]
每一列特徵的平均值:
 [  3.36354210e+04   6.55996083e+00   8.32072997e-01]
每一列特徵的方差:
 [  4.81628039e+08   1.79902874e+01   2.46999554e-01]

3.5 標準化總結

在已有樣本足夠多的情況下比較穩定,適合現代嘈雜大資料場景。