織夢網(wǎng)站制作教程海洋seo
文章目錄
- 前言
- Z-Score標準化
- Z-Score應(yīng)用示例
- Min-Max歸一化
- Min-Max應(yīng)用示例
- 總結(jié)
前言
第五天是我們的numpy學(xué)習(xí)計劃中的最后一天。
在數(shù)據(jù)處理和數(shù)據(jù)分析中,數(shù)據(jù)預(yù)處理是非常重要的一步。我們不可能完全靠肉眼來分析數(shù)據(jù),總會有用到各種算法模型的時候,例如使用聚類、回歸分析。
如果原來的數(shù)據(jù)非?!绑a臟”,不規(guī)整,我們將會得到一個不可靠的糟糕結(jié)果,此時我們需要用兩種十分常用的數(shù)據(jù)預(yù)處理手段來清洗我們的數(shù)據(jù)。
今天僅僅包括如下兩個內(nèi)容:
- Z-Score標準化
- Min-Max歸一化
Z-Score標準化
Z-Score標準化
是一種常見的數(shù)據(jù)標準化方法,它通過對原始數(shù)據(jù)進行均值和標準差的線性變換,將數(shù)據(jù)變換為均值為0、標準差為1的分布。
Z-Score標準化后的數(shù)據(jù),通常在機器學(xué)習(xí)模型上表現(xiàn)更好,并且,我們可以根據(jù)Z-Score標準化后的數(shù)據(jù)來去除異常值。
具體的標準化公式如下:
X standardized = X ? X ˉ σ X_{\text{standardized}} = \frac{{X - \bar{X}}}{{\sigma}} Xstandardized?=σX?Xˉ?
其中, X s t a n d a r d i z e d X_{standardized} Xstandardized?表示標準化后的數(shù)據(jù), X X X表示原始數(shù)據(jù), X m e a n X_{mean} Xmean?表示原始數(shù)據(jù)的均值, X s t d X_{std} Xstd?表示原始數(shù)據(jù)的標準差。
關(guān)于Z分數(shù)(Z-Score):
其實Z-Score標準化
,就是數(shù)據(jù)計算成對應(yīng)的Z分數(shù)
,我們可以利用Z分數(shù)進行異常值處理
,如果Z分數(shù)大于某一個閾值(通常 ± 2),則認為它是異常值,進行丟棄。
使用Z分數(shù)處理異常值需要滿足正態(tài)分布的假設(shè)。Z分數(shù)越大
,就代表它越接近正態(tài)分布的右側(cè)
,Z分數(shù)越小
,就代表它越接近正態(tài)分布的左側(cè)
,對于那些及其右側(cè)或者及其左側(cè)的數(shù)據(jù),因為很可能是錯誤的數(shù)據(jù)
,所以視為異常值。
Z = X ? X ˉ σ Z = \frac{{X - \bar{X}}}{{\sigma}} Z=σX?Xˉ?
下面是使用Numpy實現(xiàn)Z-Score標準化的代碼示例:
import numpy as npdef z_score(X):X_mean = np.mean(X)X_std = np.std(X)X_standardized = (X - X_mean) / X_stdreturn X_standardized
Z-Score應(yīng)用示例
在運行過上面的Z-Score標準化
的實現(xiàn)代碼后,我們可以運行下面的代碼。
假設(shè)我們現(xiàn)在有一批大學(xué)生的身高數(shù)據(jù):
- 我們知道,正常成年人的身高一般都是在
[150, 190]
之間 - 而我們在下面的數(shù)據(jù)中添加了一個身高為
300
的異常數(shù)據(jù)
讓我們來看看它的Z分數(shù)
是多少,并找出300
這個異常身高。
# 身高數(shù)據(jù)
arr = np.array([160, 170, 180, 165, 155, 163, 183, 188, 300])# 計算arr中的元素的z分數(shù)
std_data = z_score(arr)# np.abs()可以計算絕對值
abs_zc = np.abs(std_data)print('原數(shù)據(jù):')
print(arr)
print()print('Z分數(shù)的絕對值:')
print(abs_zc)
print()# 大于號“>”也是一個運算符,運算結(jié)果是True和False
compare = abs_zc > 2
print('比較結(jié)果:')
print(compare)
print()# compare和arr的形狀相同,區(qū)別是arr里面的是真正的數(shù)據(jù),compare對應(yīng)每個元素的比較結(jié)果
# 只有對應(yīng)在compare里面為True的元素會被篩選出來
outlier = arr[compare]print('異常值:')
print(outlier)
輸出結(jié)果
從下面的輸出結(jié)果中,我們可以看到,正常的身高的Z分數(shù)的絕對值都位于[0, 1]
之間,而身高為300
的那個異常數(shù)據(jù)的Z分數(shù)為2.73893945
,顯然,這已經(jīng)遠遠大于了2
這個閾值(這個閾值的設(shè)定并沒有嚴格限定,我只能告訴你,閾值的絕對值越高,去除的數(shù)據(jù)越少,反之越多,這對應(yīng)了正態(tài)分布的左右兩端都只有少量數(shù)據(jù)的特點,通過設(shè)定Z分數(shù)的閾值,我們只保留正態(tài)分布中間的那些常見數(shù)據(jù)),我們應(yīng)該將它視為異常值去除。
原數(shù)據(jù):
[160 170 180 165 155 163 183 188 300]Z分數(shù)的絕對值:
[0.59220312 0.35426437 0.11632561 0.47323375 0.7111725 0.52082150.04494399 0.07402539 2.73893945]比較結(jié)果:
[False False False False False False False False True]異常值:
[300]
Min-Max歸一化
Min-Max歸一化
是一種線性變換方法,將數(shù)據(jù)縮放到指定的范圍內(nèi)。它通過對原始數(shù)據(jù)進行線性變換,將數(shù)據(jù)映射到[0, 1]的范圍內(nèi)。
有時候原始數(shù)據(jù)的尺度
相差太大,不滿足我們的算法模型的假設(shè)
(假設(shè)不同數(shù)據(jù)的尺度都是一致的),可能會讓我們得到了錯誤的結(jié)果,此時我們就應(yīng)該使用Min-Max歸一化
,將數(shù)據(jù)歸一化到[0, 1]
之間。
具體的歸一化公式如下:
X normalized = X ? X min X max ? X min X_{\text{normalized}} = \frac{{X - X_{\text{min}}}}{{X_{\text{max}} - X_{\text{min}}}} Xnormalized?=Xmax??Xmin?X?Xmin??
其中, X n o r m a l i z e d X_{normalized} Xnormalized?表示歸一化后的數(shù)據(jù), X X X表示原始數(shù)據(jù), X m i n X_{min} Xmin?表示原始數(shù)據(jù)的最小值, X m a x X_{max} Xmax?表示原始數(shù)據(jù)的最大值。
下面是使用Numpy實現(xiàn)Min-Max歸一化的代碼示例:
import numpy as npdef min_max(X):X_min = np.min(X)X_max = np.max(X)X_normalized = (X - X_min) / (X_max - X_min)return X_normalized
關(guān)于Min-Max其它小內(nèi)容
其實不一定是歸一化到[0, 1]
這個區(qū)間中,有些特殊情況會需要歸一化到[-1, 1]
或者別的區(qū)間,但是大部分時候都是[0, 1]
區(qū)間。
Min-Max應(yīng)用示例
在運行過上面的Min-Max歸一化
的實現(xiàn)代碼后,我們可以運行下面的代碼。
假設(shè)我們現(xiàn)在有兩批醫(yī)學(xué)數(shù)據(jù):
大尺度
的是患者平均的每日步數(shù)小尺度
的是患者的體脂百分比。
這兩批數(shù)據(jù)的尺度非常巨大,如果算法模型更偏向大數(shù)值的數(shù)據(jù),那么毫無疑問會偏向患者的平均每日步數(shù)這一邊,這并不是我們想要的結(jié)果,因此我們需要進行Min-Max歸一化
。
具體看下面的代碼:
# 創(chuàng)建兩列尺度差距很大的數(shù)據(jù)
col1 = np.array([55000, 45000, 35000, 25000, 15000]) # 較大數(shù)值的數(shù)據(jù)列
col2 = np.array([15, 25, 35, 45, 55]) # 較小數(shù)值的數(shù)據(jù)列# 分別應(yīng)用Min-Max規(guī)約
normalized_col1 = min_max(col1)
normalized_col2 = min_max(col2)# 輸出原始數(shù)據(jù)和歸一化后的數(shù)據(jù)
print("原始數(shù)據(jù) - 較大數(shù)值的列:")
print(col1)
# \n 代表換行符,僅僅寫print()的時候,輸出的就是\n這個換行符
print("\n歸一化后 - 較大數(shù)值的列:")
print(normalized_col1)print("\n原始數(shù)據(jù) - 較小數(shù)值的列:")
print(col2)
print("\n歸一化后 - 較小數(shù)值的列:")
print(normalized_col2)
總結(jié)
本文介紹了使用Numpy實現(xiàn)Min-Max歸一化和Z-Score標準化算法的方法。歸一化和標準化是數(shù)據(jù)預(yù)處理中常用的技術(shù),能夠有效地提高數(shù)據(jù)的可處理性和模型的性能。在實際應(yīng)用中,根據(jù)具體的數(shù)據(jù)情況選擇合適的預(yù)處理方法是非常重要的。希望本文能對讀者在使用Numpy進行數(shù)據(jù)預(yù)處理時有所幫助。