特徵工程(3)特徵增強:數據清洗——歸一化/標準化

上一篇介紹瞭如何將缺失值如何處理

代碼及數據集

鏈接:https://pan.baidu.com/s/1tEz3gkTfmZjD-0JaC-nhVQ 密碼:l16a
數據清洗知識脈絡
缺失值識別
缺失值處理
歸一化

歸一化

  • 由於機器學習模型收到scale的影響很大,如果有極端離羣值可能對某些機器學習算法影響非常大

受尺度影響的算法

  • KNN --因爲依賴歐幾里得距離
  • K均值聚類 – 和KNN一樣
  • 邏輯迴歸、SVM、神經網絡(如果使用梯度下降來學習權重)
  • 主成分分析–特徵向量將偏向較大的列

歸一化

  • 將所有定量列轉化爲同一個靜態範圍內的值
  • 或者使用數據規則:所有列的均值和標準差必須相同

標準化

  • 通過確保所有行和列在機器學習中得到平等的對待,讓數據的處理保持一致

方法

  • Z分數標準化
  • min-max標準化
  • 行歸一化

數據集說明

  • 數據集:皮馬印第安人糖尿病預測數據集
  • 數據來源:https://www.kaggle.com/uciml/pima-indians-diabetes-database
    • 數據9列,768行
    • 該數據希望通過體檢結果細節,預測21歲以上的女性5年內會否會換上糖尿病

數據含義

  • 懷孕次數
  • 口服葡萄糖耐量試驗中的2小時血漿葡萄糖濃度
  • 舒張壓(mmHg)
  • 三頭肌皮褶厚度(mm)
  • 體重指數[BMI]
  • 2小時血清胰島素濃度(uU/ml)
  • 糖尿病家族函數
  • 年齡
  • 類變量(0/1,代表是否患有糖尿病)

在這裏插入圖片描述

pima = pd.read_csv('data/pima.data',  names=pima_colunmn_names)
# 使用前一章講的填充方法使用均值填充
impute = Imputer(strategy='mean')

pima_imputed_mean = pd.DataFrame(impute.fit_transform(pima),
                                columns=pima_colunmn_names)
# 對數據進行可視化,畫出直方圖
pima_imputed_mean.hist(figsize=(15,15))
# 通過數據表查看具體數值
pima_imputed_mean.describe().T![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200410092348921.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NhbXBiZWxsMDAx,size_16,color_FFFFFF,t_70)

在這裏插入圖片描述

  • 可以看出每列的均值,最小最大值和標準差差別都很大
    在這裏插入圖片描述
  • 此表也可看出數據不平衡
  • 因爲一些機器學習模型接受尺度(scale) 的影響很大
    • 例如 BloodPressure 在24-122之間 但是Insulin在14-846之間,這樣對模型的影響很大
# 共享x軸進行可視化
pima_imputed_mean.hist(figsize=(15, 15), sharex=True)

在這裏插入圖片描述

  • 如圖可以看到當數據不進行歸一化處理時,由於每個特徵的尺度不同可能會導致一些特徵的權重被動的減小。
  • 例如Insulin的數據尺度比較大,相較於該列在機器學習模型中形成的影響,Pregnaci的影響就變小了非常多。

Z分數標準化

Z-score–標準數

  • Z分數標準化的輸出會被重新縮放,使均值爲0,標準差爲1
  • 通過縮放特徵、統一化均值和方差,可以使KNN達到最優化,而不會傾向於較大比例的特徵
    z=xμσz = \frac{x-\mu}{\sigma}
    • z:z:新的值
    • x:x:原值
    • μ:\mu :該列均值
    • σ:\sigma :該列標準差

公式法

  • 通過以上公式對數據進行標準化
mu = pima['Glucose'].mean()
sigma = pima['Glucose'].std()
((pima['Glucose'] - mu)/sigma)

使用scikit-learn進行z分數標準化

from sklearn.preprocessing import StandardScaler

print(pima['Glucose'].mean(),
    pima['Glucose'].std())

# 均值:120.89453125 標準差:31.97261819513622
# 對標準化前進行可視化
ax = pima['Glucose'].hist()
ax.set_title('Distribution of Glucose')
# 實例化
scaler = StandardScaler()
Glucose_z_score = scaler.fit_transform(pima[['Glucose']])
# 使用雙方括號因爲轉換需要一個dataframe

print(Glucose_z_score.mean(), Glucose_z_score.std())
# 此時均值爲-9.25185853854297e-18 標準差爲1.0
# 標準化之後可視化
ax = pd.Series(Glucose_z_score.reshape(-1, )).hist()
ax.set_title('Distributiopn of Glucose after Z score Scaling')

在這裏插入圖片描述在這裏插入圖片描述

  • 數據形狀不會發生變化 但是x軸發生了變化
  • 對所有數據進行一個z分數標準化

對所有列進行標準化

scale = StandardScaler()

pima_imputed_mean_scaled = pd.DataFrame(scale.fit_transform(pima_imputed_mean), columns=pima_colunmn_names)
pima_imputed_mean_scaled.hist(figsize=(15, 15), sharex=True)

在這裏插入圖片描述

min-max 標準化

m=(xxmin)(xmaxxmin) m = \frac{(x - x_{min})}{(x_{max} - x_{min})}
m : 新值
x : 原值
xmin : 該列最小值
xmax : 該列最大值

** 所有值都會被縮放到0-1這個區間**

from sklearn.preprocessing import MinMaxScaler
min_max = MinMaxScaler()

pima_min_max = MinMaxScaler()

# 使用min-max scaler
pima_min_maxed = pd.DataFrame(min_max.fit_transform(pima_imputed), columns=pima_colunmn_names)

pima_min_maxed.describe().T

在這裏插入圖片描述

  • minmaxscaler對異常值非常敏感,因爲是以最大最小值進行縮放的,異常值權重被降低了

行歸一化

不是計算每列的統計值,而是保證每行有單位範數,意味着每行的向量長度相同

  • n維空間中每行都有一個向量範數
  • 認爲每一行都是空間內的一個向量:
    x=(x1,x2,...xn) x = (x_1, x_2,...x_n)
  • 該數據集中n爲8,響應特徵不算,該範數計算方法爲:
    x=(x12+x22+...+xn2) ||x||= \sqrt{(x_1^2+x_2^2+...+x_n^2)}
    這裏爲L2範數

讓每行有相同的範數,在使用文本數據或聚類算法是,非常方便

# 計算矩陣的平均範數
np.sqrt((pima_imputed**2).sum(axis=1)).mean()
# 223.36222025823747
# 進行行歸一化
from sklearn.preprocessing import Normalizer
normalize = Normalizer()
pima_normalized = pd.DataFrame(normalize.fit_transform(pima_imputed),
                             columns=pima_colunmn_names)

np.sqrt((pima_normalized**2).sum(axis=1).mean())
# 行歸一化後的平均範數爲1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章