iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
1
AI & Data

Machine Learning系列 第 14

Day14 - Feature Engineering -- 5. 異常值 (Outlier)(1)

  • 分享至 

  • xImage
  •  

5. Outlier

由於資料收集測量方法的變異、人為的疏失或是實驗誤差,在資料集中一個數值與其他數值相比差異非常大,我們稱這個數值為異常值(Outlier)。異常值在統計分析上會引起各種問題,可能對期望值和標準差產生顯著的影響。

處理離群值得方法:
5.1 Outlier detection and removal(異常值偵測和移除)
5.2 Treating outliers as missing values
5.3 Top / bottom / zero coding
5.4 Discretisation

5.1 Outlier detection and removal(異常值偵測和移除)

異常值偵測和移除是指移除資料集內的異常值,本質上,異常值個數不會很多,所以這個程序應該不會顯著的破壞資料的完整性,但是假如異常值橫跨多個欄位,那我們可能會移除一大部分的資料。

以下列方法找出異常值(Outlier):

  • IQR interquantile range(四分位數間距)
  • Percentile(百分位數)
  • z score
  • Scatter plots
  • Box plot

異常值偵測和移除 - 使用IQR interquantile range(四分位數間距)
https://ithelp.ithome.com.tw/upload/images/20200913/20129584wCkyg5WiQa.png

一組數值由小到大排序後,再將這數列分成四等份,而處於三個分割點位置的數值就是四分位數,我們稱這三個分割點為第一、第二、第三分位數,以Q1、Q2和Q3表示。其中第三四分位數與第一四分位數之間的差,稱為四分位數間距。

以 Kaggle 的 Titanic 資料集中的"年齡"變數來說明:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
pd.set_option('display.max_columns', None)

data = pd.read_csv('../input/titanic/train.csv')
data.head()

/|PassengerId|Survived|Pclass| Name| Sex|Age|SibSp| Parch| Ticket| Fare| Cabin| Embarked
------------- | -------------
0| 1| 0| 3| Braund, Mr. Owen Harris| male| 22.0| 1| 0| A/5 21171| 7.2500|NaN |S
1| 2| 1| 1| Cumings, Mrs. John Bradley (Florence Briggs Th... |female| 38.0| 1| 0| PC 17599| 71.2833| C85| C
2|| 3| 1| 3| Heikkinen, Miss. Laina| female| 26.0| 0| 0| STON/O2.3101282| 7.9250| NaN| S
3| 4| 1| 1| Futrelle, Mrs. Jacques Heath (Lily May Peel)|female|35.0|1 |0| 113803 |53.1000 |C123| S
4| 5| 0| 3| Allen, Mr. William Henry|male| 35.0| 0| 0| 373450| 8.0500| NaN| S

查看Age欄位的中位數(median)和分位數(quantiles),下列數據 25%、50%和75%表示第一四分位數、中位數、第三四分位數分割點。

data.Age.describe()
count 714.000000
mean 29.699118
std 14.526497
min 0.420000
25% 20.125000
50% 28.000000
75% 38.000000
max 80.000000
Name: Age, dtype: float64

假設資料是常態分布,以3個標準差原則,找出上下邊界值,超出這個範圍的資料就是異常值。

Upper_boundary_limit = data.Age.mean() + 3* data.Age.std()
Lower_boundary_limit = data.Age.mean() - 3* data.Age.std()

Upper_boundary_limit, Lower_boundary_limit

(73.27860964406095, -13.88037434994331)
Age的上邊界是73-74,至於下邊界是負數,在這裡並沒有意義,因為年齡不可能為負數;會出現這種情形是因為資料不是常態分布。

使用IQR(Inter Quantile Range)計算上下邊界值
IQR = https://chart.googleapis.com/chart?cht=tx&chl=Q3%20-%20Q1
下邊界 = https://chart.googleapis.com/chart?cht=tx&chl=Q1%20-%201.5%20*%20(Q3-Q1)
上邊界 = https://chart.googleapis.com/chart?cht=tx&chl=Q3%20%2B%201.5%20*%20(Q3-Q1)

IQR = data.Age.quantile(0.75) - data.Age.quantile(0.25)

Lower_quantile_lower = data.Age.quantile(0.25) - (IQR * 1.5)
Upper_quantile_lower = data.Age.quantile(0.75) + (IQR * 1.5)

Upper_quantile_lower, Lower_quantile_lower, IQR

(64.8125, -6.6875, 17.875)
使用1.5倍IQR計算出的上下邊界和前例(使用3個標準差)差不多。

讓我們看一個較極端的例子。

IQR = data.Age.quantile(0.75) - data.Age.quantile(0.25)

Lower_quantile = data.Age.quantile(0.25) - (IQR * 3)
Upper_quantile = data.Age.quantile(0.75) + (IQR * 3)

Upper_quantile, Lower_quantile, IQR

(91.625, -33.5, 17.875)
使用3倍IQR計算出的上下邊界則高出人類平均壽命值。

現在我們可以根據上述邊界值,找出超出邊界的異常值。

移除missing data
data = data.dropna(subset=['Age'])
查看乘客數目
total_passengers = np.float(data.shape[0])

print('大於73歲乘客人數占全體百分比 (常態分布方法): {}'.format(data[data.Age > 73].shape[0] / total_passengers))
print('大於65歲乘客人數占全體百分比 (1.5倍IQR): {}'.format(data[data.Age > 65].shape[0] / total_passengers))
print('大於91歲乘客人數占全體百分比 (3倍IQR): {}'.format(data[data.Age >= 91].shape[0] / total_passengers))

大於73歲乘客人數占全體百分比 (常態分布方法): 0.0028011204481792717
大於65歲乘客人數占全體百分比 (1.5倍IQR): 0.011204481792717087
大於91歲乘客人數占全體百分比 (3倍IQR): 0.0

年紀很大的乘客大約占0-2個百分比。

使用1.5倍IQR計算出來的異常值,他們的詳細資料如下:

data[(data.Age<Lower_quantile_lower)|(data.Age>Upper_quantile_lower)]

/ |PassengerId| Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket |Fare | Cabin | Embarked
------------- | -------------
33 | 34 | 0| 2| Wheadon, Mr. Edward H| male| 66.0| 0| 0| C.A. 24579| 10.5000| NaN| S
54 | 55| 0| 1| Ostby, Mr. Engelhart Cornelius| male| 65.0| 0| 1| 113509| 61.9792| B30| C
96 | 97| 0| 1| Goldschmidt, Mr. George B| male| 71.0| 0| 0| PC 17754| 34.6542 |A5| C
116 | 117| 0| 3| Connors, Mr. Patrick| male| 70.5| 0| 0| 370369| 7.7500| NaN| Q
280 | 281| 0| 3| Duane, Mr. Frank| male| 65.0| 0| 0| 336439| 7.7500| NaN| Q
456 | 457| 0| 1| Millet, Mr. Francis Davis| male| 65.0| 0| 0| 13509| 26.5500| E38| S
493 | 494| 0| 1| Artagaveytia, Mr. Ramon| male| 71.0| 0| 0| PC 17609 |49.5042 |NaN| C
630 | 631| 1| 1| Barkworth, Mr. Algernon Henry Wilson| male| 80.0| 0| 0| 27042 |30.0000 |A23 |S
672 | 673| 0| 2| Mitchell, Mr. Henry Michael| male| 70.0| 0| 0| C.A. 24580 |10.5000| NaN| S
745 | 746| 0| 1| Crosby, Capt. Edward Gifford| male| 70.0| 1| 1| WE/P 5735 |71.0000 |B22| S
851| 852| 0| 3| Svensson, Mr. Johan| male| 74.0| 0| 0| 347060 |7.7750| NaN| S
從上面資料可得知,屬於異常值的乘客大部分都沒存活下來。

現在讓我們移除這些異常值

data_with_no_outlier = data[(data.Age>Lower_quantile_lower)&(data.Age<Upper_quantile_lower)]
data_with_no_outlier

/|PassengerId| Survived| Pclass| Name| Sex| Age| SibSp| Parch| Ticket| Fare| Cabin| Embarked
------------- | -------------
0| 1| 0| 3 |Braund, Mr. Owen Harris| male| 22.0| 1| 0| A/5 21171 |7.2500|NaN| S
1| 2| 1| 1| Cumings, Mrs. John Bradley (Florence Briggs Th...| female| 38.0| 1| 0|PC 17599| 71.2833 |C85 |C
2| 3| 1 |3 |Heikkinen, Miss. Laina |female| 26.0| 0 |0 |STON/O2. 3101282|7.9250| NaN| S
3| 4| 1 |1| Futrelle, Mrs. Jacques Heath (Lily May Peel)| female| 35.0| 1| 0| 113803 |53.1000 |C123| S
4| 5| 0|3 |Allen, Mr. William Henry| male| 35.0| 0| 0| 373450| 8.0500| NaN| S
...| ...| ...| ...| ...| ...| ...| ... |...| ... |...| ...| ...
885| 886 |0 |3 |Rice, Mrs. William (Margaret Norton) |female| 39.0| 0| 5|382652| 29.1250| NaN| Q
886| 887| 0 |2| Montvila, Rev. Juozas| male| 27.0| 0| 0 |211536| 13.0000| NaN |S
887| 888| 1| 1| Graham, Miss. Margaret Edith| female| 19.0| 0| 0 |112053| 30.0000| B42| S
889| 890| 1 |1| Behr, Mr. Karl Howell |male| 26.0| 0| 0| 111369| 30.0000 |C148| C
890 |891| 0| 3 |Dooley, Mr. Patrick| male| 32.0| 0| 0| 370376| 7.7500| NaN| Q|
703 rows × 12 columns


上一篇
Day13 - Feature Engineering -- 4. 分隔方法(Discretization)(3)
下一篇
Day15 - Feature Engineering -- 5. 異常值 (Outlier)(2)
系列文
Machine Learning32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言