人工智慧(三)之需要用到的關於資料處理的python程式碼
轉載人工智慧中需要用到的關於資料處理的python程式碼
資料歸一化問題是資料探勘中特徵向量表達時的重要問題,當不同的特徵成列在一起的時候,由於特徵本身表達方式的原因而導致在絕對數值上的小資料被大資料“吃掉”的情況,這個時候我們需要做的就是對抽取出來的features vector進行歸一化處理,以保證每個特徵被分類器平等對待。先前的文章中已經介紹了幾種常見的資料歸一化的方法,這裡對主要整理了如何將這些公式和方法轉化程Python程式碼。
min-max標準化(Min-Max Normalization)
也稱為離差標準化,是對原始資料的線性變換,使結果值對映到[0 – 1]之間。轉換函式如下:
\[{x}_{normalization}=\frac{x-Min}{Max-Min}\]
x_min表示樣本資料的最小值,x_max表示樣本資料的最大值。
Python程式碼實現:
def max_min_normalization(x, max, min):
return (x - min) / (max - min)
或:
def max_min_normalization(x):
return [(float(i)-min(x))/float(max(x)-min(x)) for i in x]
找大小的方法除了使用list自帶的max和min,推薦使用np.max和np.min,因為起功能更加強大。
>>> a = np.array([[0, 1, 6], [2, 4, 1]])
>>> np.max(a)
6
>>> np.max(a, axis=0) # max of each column
array([2, 4, 6])
如果想要將資料對映到[-1,1],則將公式換成:
\[{x}_{normalization}=\frac{x-x_{mean}}{Max-Min}\]
x_mean 表示平均值。
Python程式碼實現:
import numpy as np def normalization(x): return [(float(i)-np.mean(x))/(max(x)-min(x)) for i in x]
該標準化方法有一個缺點就是,如果資料中有一些偏離正常資料的異常點,就會導致標準化結果的不準確性。
z-score標準化
z-score標準化方法適用於屬性A的最大值和最小值未知的情況,或有超出取值範圍的離群資料的情況。這種方法給予原始資料的均值(mean)和標準差(standard deviation)進行資料的標準化。
經過處理的資料符合標準正態分佈,即均值為0,標準差為1,轉化函式為:
\[{x}_{normalization}=\frac{x-\mu }{\sigma }\]
其中μ為所有樣本資料的均值,σ為所有樣本資料的標準差。
Python實現:
def z_score_normalization(x,mu,sigma):
return (x - mu) / sigma
mu為均值,sigma為標註差,所以程式碼可以改寫為:
#定義陣列:x = numpy.array(x)
#獲取二維陣列列方向的均值:x.mean(axis = 0)
#獲取二維陣列列方向的標準差:x.std(axis = 0)
x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
x = numpy.array(x)
def z_score(x):
return (x - np.mean(x)) / np.std(x, ddof = 1)
z-score標準化方法同樣對於離群異常值的影響。改進的z-score標準化:將標準分公式中的均值改為中位數,將標準差改為絕對偏差。
\[{x}_{normalization}=\frac{x-{x}_{center} }{\sigma_1 }\]
中位數是指將所有資料進行排序,取中間的那個值,如資料量是偶數,則取中間兩個資料的平均值。
# 中位數 英文:median
# 對於有限的數集,可以通過把所有觀察值高低排序後找出正中間的一個作為中位數。
# 如果觀察值有偶數個,通常取最中間的兩個數值的平均數作為中位數。
def get_median(data):
data = sorted(data)
size = len(data)
if size % 2 == 0: # 判斷列表長度為偶數
median = (data[size/2]+data[size/2-1])/2
if size % 2 == 1: # 判斷列表長度為奇數
median = data[(size-1)//2]
return median
σ1為所有樣本資料的絕對偏差,其計算公式為:
\[\frac{1}{N} \sum_{1}^{n}|x_{i} - x_{center}|\]
Sigmoid函式
Sigmoid函式是一個具有S形曲線的函式,是良好的閾值函式,在(0, 0.5)處中心對稱,在(0, 0.5)附近有比較大的斜率,而當資料趨向於正無窮和負無窮的時候,映射出來的值就會無限趨向於1和0,是個人非常喜歡的“歸一化方法”,之所以打引號是因為我覺得Sigmoid函式在閾值分割上也有很不錯的表現,根據公式的改變,就可以改變分割閾值,這裡作為歸一化方法,我們只考慮(0, 0.5)作為分割閾值的點的情況:
\[{x}_{normalization}=\frac{1}{1+{e}^{-x}}\]
Python實現:
ef sigmoid(X,useStatus):
if useStatus:
return 1.0 / (1 + np.exp(-float(X)));
else:
return float(X);
這裡useStatus管理是否使用sigmoid的狀態,方便除錯使用。
sklearn中的歸一化
sklearn.preprocessing 提供了一些實用的函式 用來處理資料的維度,以供演算法使用。
1)均值-標準差縮放
即我們上邊對應的z-score標準化。
from sklearn import preprocessing
import numpy as np
x_train = np.array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
x_scaled = preprocessing.scale(x_train)
print(x_scaled)
# output:
# [[ 0. -1.22474487 1.33630621]
# [ 1.22474487 0. -0.26726124]
# [-1.22474487 1.22474487 -1.06904497]]
2)min-max標準化
from sklearn import preprocessing
import numpy as np
x_train = np.array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
min_max_scaler = preprocessing.MinMaxScaler()
x_train_minmax = min_max_scaler.fit_transform(x_train)
print(x_train_minmax)
# output:
# [[ 0.5 0. 1. ]
# [ 1. 0.5 0.33333333]
# [ 0. 1. 0. ]]
3)最大值標準化(每個數值/每個維度的最大數值)
from sklearn import preprocessing
import numpy as np
x_train = np.array([[1., -1., 2.],
[2., 0., 0.],
[0., 1., -1.]])
max_abs_scaler = preprocessing.MaxAbsScaler()
x_train_maxabs = max_abs_scaler.fit_transform(x_train)
print(x_train_maxabs)
# output:
# [[ 0.5 -1. 1. ]
# [ 1. 0. 0. ]
# [ 0. 1. -0.5]]
4)規範化
規範化是文字分類和聚類中向量空間模型的基礎。
from sklearn import preprocessing
import numpy as np
x_train = np.array([[1., -1., 2.],
[2., 0., 0.],
[0., 1., -1.]])
x_normalized = preprocessing.normalize(x_train, norm='l2')
print(x_normalized)
# output:
# [[ 0.40824829 -0.40824829 0.81649658]
# [ 1. 0. 0. ]
# [ 0. 0.70710678 -0.70710678]]
norm 該引數是可選的,預設值是l2(向量各元素的平方和然後求平方根),用來規範化每個非零向量,如果axis引數設定為0,則表示的是規範化每個非零的特徵維度。
具體請參考:範數規則化L0、L1與L2範數
5)二值化(將資料轉換到0和1)
from sklearn import preprocessing
import numpy as np
x_train = np.array([[1., -1., 2.],
[2., 0., 0.],
[0., 1., -1.]])
binarizer = preprocessing.Binarizer().fit(x_train)
print(binarizer)
print(binarizer.transform(x_train))
# output:
# Binarizer(copy=True, threshold=0.0)
# [[ 1. 0. 1.]
# [ 1. 0. 0.]
# [ 0. 1. 0.]]