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