數據規范化


數據規范化就是消除量綱的影響,這點很重要。

 

對算法的作用

在以梯度和矩陣為核心的算法中,譬如邏輯回歸、神經網絡、svm,規范化能加快求解速度,

在以距離計算為核心的算法中,譬如KNN、Kmeans,規范化能提高模型的精度,

在樹模型中,無需規范化。

 

概述

數據規范化有很多種方法,總體可以分為線性的和非線性的,線性的規范化包括中心化處理和縮放處理中心化是把數據減去某個值, 以平移到某個位置,縮放是把數據除以某個值,把數據固定在某個范圍。取log也是一種縮放處理。

常用的數據規范化方法有歸一化、標准化、極差標准化、log等

 

歸一化

x-min/max-min,把數據規范在(0, 1)之間,當然也可以是其他范圍

歸一化容易受到異常值的影響,所以一般不是首選,如果標准化效果不好時,可以試試歸一化

在不涉及梯度、矩陣、距離的算法中,可以先試試歸一化,如圖像處理

 

示例代碼

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler


np.set_printoptions(2)
np.random.seed(10)

data = np.random.uniform(-5, 5, size=(100, 1))        # 注意數據必須是2維的
data = np.random.normal(-5, 5, size=(100, 1))
print(data.T)
plt.plot(data, '.')

# 歸一化
scaler = MinMaxScaler()
scaler = scaler.fit(data)
data2 = scaler.transform(data)
print(data2.T)
plt.plot(data2, 'ro')

# 數據還原
old_data = scaler.inverse_transform(data2)           # 逆操作
print(old_data.T)

# 歸一化到指定范圍
scaler2 = MinMaxScaler(feature_range=[2, 4])        # 歸一到指定范圍內
scaler2.fit(old_data)
data3 = scaler2.transform(old_data)
plt.plot(data3, 'y*')

plt.show()


# 當特征很多時,fit會報錯,表示計算不了,此時用 partial_fit
scaler3 = MinMaxScaler()
scaler3.partial_fit(data)
data4 = scaler3.transform(data)
print(data4.T)

MinMaxScaler  fit  transform  fit_transform  inverse_transform  partial_fit

 

標准化

通常說的標准化是指標准差標准化,即 x-mean/std

std在一定程度上代表了數據的"跨度",可以理解為取值范圍,也可以理解為量綱,除以標准差就是消除量綱

也可以做一些其他嘗試,比如 x-min/std,這叫正規化

x-mean/max-min,這叫極差標准化    

 

示例代碼

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler


np.set_printoptions(precision=2)
np.random.seed(10)

data = np.random.uniform(-5, 5, size=(100, 1))
print(data.T)
plt.plot(data, '.')

scaler = StandardScaler()
scaler.fit(data)
print(scaler.mean_)     # [-0.15]
print(scaler.var_)      # [7.56]

data = scaler.transform(data)
print(data.mean())      # -1.97064586871e-17    0
print(data.var())       # 1

old_data = scaler.inverse_transform(data)
print(old_data.T)
plt.plot(data, 'ro')

plt.show()

 

另一個函數實現標准化

import numpy as np
from sklearn.preprocessing import MinMaxScaler, StandardScaler, scale


data = np.random.uniform(-5, 5, size=(20, 1))

data1 = MinMaxScaler().fit_transform(data)
print(data1.T)
data2 = StandardScaler().fit_transform(data)
print(data2.T)
data3 = scale(data)
print(data3.T)      # ==data2

 

還有很多不太常用的,sklearn也提供了API


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM