機器學習sklearn數據預處理:歸一化-標準化/區間縮放-調整尺度/正態化

在sklean的預處理方法中主要有三種,每一種都有函數方法類方法兩種使用方法:
歸一化-標準化:normalize()函數/Normalizer()類
區間縮放-調整尺度: minmax_scale函數/MinMaxScaler()類
正態化:scale()函數/StandardScaler()類

歸一化/標準化處理

將每一行數據的向量模長(歐氏距離)處理成1.
方法一:normalize()函數

from sklearn.datasets import load_boston
from sklearn.preprocessing import normalize
from numpy import set_printoptions
import numpy as np

set_printoptions(precision=3)
boston = load_boston()
data, target = boston.data, boston.target
print('-' * 20 + '預處理前' + '-' * 20)
print('前三個數據(前三行數據)的模長:', np.linalg.norm(data, ord=None, axis=1)[:3])
new_data = normalize(data)
print('-' * 20 + '預處理後' + '-' * 20)
print('前三個數據(前三行數據)的模長:', np.linalg.norm(new_data, ord=None, axis=1)[:3])
輸出:
--------------------預處理前--------------------
前三個數據(前三行數據)的模長: [500.046 472.059 465.914]
--------------------預處理後--------------------
前三個數據(前三行數據)的模長: [1. 1. 1.]

方法二:Normalizer()類

from sklearn.datasets import load_boston
from sklearn.preprocessing import Normalizer
from numpy import set_printoptions
import numpy as np

set_printoptions(precision=3)
boston = load_boston()
data, target = boston.data, boston.target
print('-' * 20 + '預處理前' + '-' * 20)
print('前三個數據(前三行數據)的模長:', np.linalg.norm(data, ord=None, axis=1)[:3])
new_data = Normalizer().fit_transform(data)
# 也可以分開寫成:
# my_normalize = Normalizer()
# new_data = my_normalize.fit_transform(data)
print('-' * 20 + '預處理後' + '-' * 20)
print('前三個數據(前三行數據)的模長:', np.linalg.norm(new_data, ord=None, axis=1)[:3])

輸出:

--------------------預處理前--------------------
前三個數據(前三行數據)的模長: [500.046 472.059 465.914]
--------------------預處理後--------------------
前三個數據(前三行數據)的模長: [1. 1. 1.]

這裏求得模長是歐氏距離,也是L2範數,可參照博客:
python求向量模長-L1範數/L2範數/無窮範數

縮放處理/調整數據尺度

將不同計量單位的數據統一成相同的尺度單位,將數據最大值和最小值調整到一個統一的範圍內:
例如:以boston數據集爲例
方法一:minmax_scale函數

from sklearn.datasets import load_boston
from sklearn.preprocessing import minmax_scale
from numpy import set_printoptions

set_printoptions(precision=3)
boston = load_boston()
data, target = boston.data, boston.target
print('-' * 20 + '預處理前' + '-' * 20)
print('前三個特徵的最大值:', data[:, :3].max(axis=0))
print('前三個特徵的最小值:', data[:, :3].min(axis=0))
new_data = minmax_scale(data, feature_range=(0, 1))  # 默認(0, 1)
print('-' * 20 + '預處理後' + '-' * 20)
print('前三個特徵的最大值:', new_data[:, :3].max(axis=0))
print('前三個特徵的最小值:', new_data[:, :3].min(axis=0))

輸出:

--------------------預處理前--------------------
前三個特徵的最大值: [88.976  100.    27.74 ]
前三個特徵的最小值: [0.006   0.    0.46 ]
--------------------預處理後--------------------
前三個特徵的最大值: [1. 1. 1.]
前三個特徵的最小值: [0. 0. 0.]

方法二:MinMaxScaler()類

from sklearn.datasets import load_boston
from sklearn.preprocessing import MinMaxScaler
from numpy import set_printoptions

set_printoptions(precision=3)
boston = load_boston()
data, target = boston.data, boston.target
print('-' * 20 + '預處理前' + '-' * 20)
print('前三個特徵的最大值:', data[:, :3].max(axis=0))
print('前三個特徵的最小值:', data[:, :3].min(axis=0))
transform = MinMaxScaler(feature_range=(0, 1))  # 默認(0, 1)
new_data = transform.fit_transform(data)
print('-' * 20 + '預處理後' + '-' * 20)
print('前三個特徵的最大值:', new_data[:, :3].max(axis=0))
print('前三個特徵的最小值:', new_data[:, :3].min(axis=0))

輸出:

--------------------預處理前--------------------
前三個特徵的最大值: [88.976  100.   27.74 ]
前三個特徵的最小值: [0.006   0.   0.46 ]
--------------------預處理後--------------------
前三個特徵的最大值: [1. 1. 1.]
前三個特徵的最小值: [0. 0. 0.]

正態化處理

將數據處理爲高斯分佈,處理後的數據滿足均值爲0,方差爲1.
第一種方法:scale()函數

from sklearn.datasets import load_boston
from sklearn.preprocessing import scale
from numpy import set_printoptions

set_printoptions(precision=3)
boston = load_boston()
data, target = boston.data, boston.target
print('-' * 20 + '預處理前' + '-' * 20)
print('前三個特徵的均值:', data[:, :3].mean(axis=0))
print('前三個特徵的方差:', data[:, :3].std(axis=0))
new_data = scale(data)
print('-' * 20 + '預處理後' + '-' * 20)
print('前三個特徵的均值:', new_data[:, :3].mean(axis=0))
print('前三個特徵的方差:', new_data[:, :3].std(axis=0))

輸出:

--------------------預處理前--------------------
前三個特徵的均值: [ 3.594 11.364 11.137]
前三個特徵的方差: [ 8.588 23.299  6.854]
--------------------預處理後--------------------
前三個特徵的均值: [ 6.341e-17 -6.343e-16 -2.683e-15]
前三個特徵的方差: [1. 1. 1.]

第二種方法:StandardScaler()類

from sklearn.datasets import load_boston
from sklearn.preprocessing import StandardScaler
from numpy import set_printoptions

set_printoptions(precision=3)
boston = load_boston()
data, target = boston.data, boston.target
print('-' * 20 + '預處理前' + '-' * 20)
print('前三個特徵的均值:', data[:, :3].mean(axis=0))
print('前三個特徵的方差:', data[:, :3].std(axis=0))
my_scale = StandardScaler()
new_data = my_scale.fit_transform(data)
print('-' * 20 + '預處理後' + '-' * 20)
print('前三個特徵的均值:', new_data[:, :3].mean(axis=0))
print('前三個特徵的方差:', new_data[:, :3].std(axis=0))

輸出:

--------------------預處理前--------------------
前三個特徵的均值: [ 3.594 11.364 11.137]
前三個特徵的方差: [ 8.588 23.299  6.854]
--------------------預處理後--------------------
前三個特徵的均值: [ 6.341e-17 -6.343e-16 -2.683e-15]
前三個特徵的方差: [1. 1. 1.]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章