iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
0
AI & Data

Machine Learning系列 第 15

Day15 - Feature Engineering -- 5. 異常值 (Outlier)(2)

  • 分享至 

  • xImage
  •  

5. 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(異常值偵測和移除)

異常值偵測和移除 - 使用Percentile(百分位數)
這個方法端視要解決的問題和資料集來決定上下邊界,並沒有固定的標準。
使用Kaggle的房價預測資料集,設定"售價"(SalePrice)上下邊界值分為95%和5%

df = pd.read_csv("../input/house-prices-advanced-regression-techniques/train.csv")
df.head()

/|Id| MSSubClass| MSZoning| LotFrontage| LotArea| Street| Alley| LotShape| LandContour| Utilities| ...| PoolArea| PoolQC| Fence| MiscFeature| MiscVal| MoSold| YrSold| SaleType| SaleCondition| SalePrice
------------- | -------------
0| 1| 60| RL| 65.0| 8450| Pave| NaN| Reg| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 2| 2008| WD| Normal| 208500
1| 2| 20| RL| 80.0| 9600| Pave| NaN|Reg| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 5| 2007| WD| Normal| 181500
2| 3| 60| RL| 68.0| 11250| Pave| NaN| IR1| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 9| 2008| WD| Normal| 223500
3| 4| 70| RL| 60.0| 9550| Pave| NaN| IR1| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 2| 2006| WD| Abnorml| 140000
4| 5| 60| RL| 84.0| 14260| Pave| NaN| IR1| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 12| 2008| WD| Normal| 250000
5 rows × 81 columns

upper_threshold = df['SalePrice'].quantile(0.95)
upper_threshold

326099.99999999994

lower_threshold = df['SalePrice'].quantile(0.05)
lower_threshold

88000.0
找出異常值

df[(df.SalePrice<lower_threshold)|(df.SalePrice>upper_threshold)]

/|Id| MSSubClass| MSZoning| LotFrontage| LotArea| Street| Alley| LotShape| LandContour| Utilities| ...| PoolArea| PoolQC| Fence| MiscFeature| MiscVal| MoSold| YrSold| SaleType| SaleCondition| SalePrice
------------- | -------------
11| 12| 60| RL| 85.0| 11924| Pave| NaN |IR1| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 7| 2006| New Partial| 345000
29| 30| 30| RM| 60.0| 6324| Pave| NaN| IR1| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 5| 2008| WD| Normal| 68500
30| 31| 70| C (all)| 50.0| 8500| Pave| Pave| Reg| Lvl| AllPub| ...| 0| NaN| MnPrv| NaN| 0| 7| 2008| WD| Normal| 40000
39| 40| 90| RL |65.0| 6040| Pave| NaN| Reg| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 6| 2008| WD| AdjLand| 82000
53| 54| 20| RL| 68.0| 50271| Pave| NaN| IR1| Low| AllPub|...| 0| NaN| NaN| NaN| 0 |11| 2006| WD| Normal| 385000
...| ...| ...| ...| ...| ...| ...| ...| ... |...| ...| ...| ...| ...| ... |...| ... |...| ...| ... |...| ...
1388| 1389| 20| RL| 42.0| 14892| Pave| NaN| IR1| HLS| AllPub| ...| 0| NaN| NaN|NaN| 0| 10| 2009| WD| Normal| 377500
1417| 1418| 60| RL| NaN| 16545| Pave| NaN| IR1| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 5| 2009| WD| Normal| 340000
1432| 1433| 30| RL| 60.0| 10800| Pave| Grvl| Reg| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 8| 2007| WD| Normal |64500
1437| 1438| 20| RL| 96.0| 12444| Pave| NaN| Reg| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 11| 2008| New| Partial| 394617
1453| 1454| 20| RL| 90.0| 17217| Pave| NaN| Reg| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 7| 2006| WD| Abnorml| 84500
144 rows × 81 columns
我們找到144筆異常值,我們可以移除這些異常值,假如我們設定的上下邊界是合理的。
移除異常值

data_with_no_outlier_percentile_approach = df[(df.SalePrice>lower_threshold)&(df.SalePrice<upper_threshold)]
data_with_no_outlier_percentile_approach

/|Id| MSSubClass| MSZoning| LotFrontage| LotArea| Street| Alley| LotShape| LandContour| Utilities| ...| PoolArea| PoolQC| Fence| MiscFeature| MiscVal| MoSold| YrSold| SaleType| SaleCondition| SalePrice
------------- | -------------
0| 1| 60| RL| 65.0| 8450| Pave| NaN| Reg| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 2| 2008| WD| Normal| 208500
1| 2| 20| RL| 80.0| 9600| Pave| NaN|Reg| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 5| 2007| WD| Normal| 181500
2| 3| 60| RL| 68.0| 11250| Pave| NaN| IR1| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 9| 2008| WD| Normal| 223500
3| 4| 70| RL| 60.0| 9550| Pave| NaN| IR1| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 2| 2006| WD| Abnorml| 140000
4| 5| 60| RL| 84.0| 14260| Pave| NaN| IR1| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 12| 2008| WD| Normal| 250000
...| ...| ...| ...| ...| ...| ...| ...| ... |...| ...| ...| ...| ...| ... |...| ... |...| ...| ... |...| ...
1455| 1456| 60| RL| 62.0| 7917| Pave| NaN| Reg| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 8| 2007| WD| Normal| 175000
1456| 1457| 20| RL| 85.0| 13175| Pave| NaN| Reg| Lvl| AllPub| ...| 0| NaN| MnPrv| NaN| 0| 2| 2010| WD|Normal| 210000
1457| 1458| 70| RL| 66.0| 9042| Pave| NaN| Reg |Lvl| AllPub| ...| 0| NaN| GdPrv| Shed| 2500| 5| 2010| WD| Normal| 266500
1458| 1459| 20| RL| 68.0| 9717| Pave| NaN| Reg| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0 |4| 2010| WD| Normal| 142125
1459| 1460| 20| RL| 75.0| 9937| Pave| NaN| Reg| Lvl| AllPub| ...| 0| NaN| NaN| NaN| 0| 6| 2008| WD| Normal| 147500
1312 rows × 81 columns

異常值偵測和移除 - 使用z score(Z-分數或標準化值)
以標準差為單位,計算資料點和平均值之間的距離。
https://ithelp.ithome.com.tw/upload/images/20200915/20129584M6nPaAOlyE.jpg
以 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
計算年齡變數的平均值和標準差。

data = pd.read_csv('../input/titanic/train.csv')
data.Age.mean(),data.Age.std()

(29.69911764705882, 14.526497332334044)

平均值是29.69和標準差是14.52 接著根據上述公式計算每一筆資料年齡的z score

data['zscore'] = ( data.Age - data.Age.mean() ) / data.Age.std()
data.head(5)

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

找出z score大於或小於3的資料,也就是大於或小於3個標準差的資料。

data[(data.zscore>3) | (data.zscore<-3)]

/|PassengerId|Survived|Pclass| Name| Sex|Age|SibSp| Parch| Ticket| Fare| Cabin| Embarked|zscore
------------- | -------------
630| 631| 1| 1| Barkworth, Mr. Algernon Henry Wilson| male| 80.0| 0| 0| 27042| 30.000| A23| S |3.462699
851| 852| 0| 3| Svensson, Mr. Johan| male| 74.0| 0| 0| 347060| 7.775| NaN| S| 3.049660

移除這些異常值。

df_no_outliers_zscore = data[(data.zscore>-3) & (data.zscore<3)]
df_no_outliers_zscore.shape

(712, 13)

異常值偵測和移除 - 使用Scatter plots(散布圖)
https://ithelp.ithome.com.tw/upload/images/20200915/201295843xSSGL8bwd.png
圖片來源:https://www.learnbyexample.org/r-scatter-plot-base-graph/
Scatter plots(散布圖)是使用笛卡爾(Cartesian)坐標系上的點表示資料中二個變數分布方式的圖。

import seaborn as sns
train = pd.read_csv("../input/house-prices-advanced-regression-techniques/train.csv")

(1460, 81)
繪製SalePrice(售價)和GrLivArea的散布圖

fig, ax = plt.subplots(figsize=(14,8))
GrLivArea_scatter_plot = pd.concat([train['SalePrice'],train['GrLivArea']],axis = 1)
sns.regplot(x='GrLivArea',y = 'SalePrice',data = GrLivArea_scatter_plot,scatter= True, fit_reg=True, ax=ax)

https://ithelp.ithome.com.tw/upload/images/20200915/20129584ojzZeyGRcQ.png
從圖中可看出大部分的資料點都集中在左下方,但也有幾個資料點遠離群體,零星散布於右上角落。

移除GrLivArea變數中大於4000的異常值

df_no_outliers = train[(train.GrLivArea<4000)]
df_no_outliers.shape

(1456, 81)


上一篇
Day14 - Feature Engineering -- 5. 異常值 (Outlier)(1)
下一篇
Day16 - Feature Engineering -- 5. 異常值 (Outlier)(3)
系列文
Machine Learning32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言