iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
0
AI & Data

Machine Learning系列 第 10

Day-10 Feature Engineering -- 3. Variable transformation 變數轉換(2)

  • 分享至 

  • xImage
  •  

3.1 Logarithm transformation(對數轉換) - log(x)
3.2 Reciprocal transformation(倒數轉換) - 1 / x
3.3 Square root transformation(平方根轉換) - sqrt(x)
3.4 Exponential transformation(指數轉換) - exp(x)
3.5 Yeo-Johnson transformation
3.6 Box-Cox transformation

當我們使用數學公式轉換時,我們要注意資料的數值(values),例如對數轉換(logarithm transformation)和平方根轉換(square root transformation)只支援正數(positive values),而倒數轉換(reciprocal transformatio)則不能接受等於0的值。

3.4 Exponential transformation - exp(x)

train_data['Age_exp'] = train_data.Age**(1/1.2)
diagnostic_plots(train_data, 'Age_exp')

https://ithelp.ithome.com.tw/upload/images/20200910/20129584HfRBp9NnTG.png
這個方法轉換出來的結果是上述四種中最好的,單就長條圖和QQ圖來看,它也比原始資料更接近常態分布。

3.5 Yeo-Johnson transformation

Box-Cox和Yeo-Johnson轉換是由指數轉換(exponential transformations)演變而來的,這兩個方法轉換的資料更能達到我們預期的結果。這兩種方法都可以使用scipy.stats中的函數或scikit-learn的PowerTransformer功能來進行資料的轉換,這兩個套件(package)都會自動幫我們選擇能讓轉換後資料最像常態分佈的λ值。

和Box-Cox轉換不一樣,Yeo-Johnson轉換允許原始資料中有負數 。
https://ithelp.ithome.com.tw/upload/images/20200910/20129584dBCseJ1teh.png
使用scipy.stats中的yeojohnson來進行資料的轉換,只轉換"Age"欄位資料。

train_data['Age_yoejohnson'], param = stats.yeojohnson(train_data.Age)
print('Optimal : ', param)
diagnostic_plots(train_data, 'Age_yoejohnson')

Optimal : 0.7611616343881625
https://ithelp.ithome.com.tw/upload/images/20200910/20129584Palo7ta5w5.png

使用scikit-learn中的PowerTransformer來進行資料的轉換,轉換資料集中所有述值型的欄位資料。

from sklearn.preprocessing import PowerTransformer

pt = PowerTransformer(method='yeo-johnson')
pt.fit(train_data)
X_train_pt = pt.transform(train_data) 

3.6 Box-Cox transformation

https://ithelp.ithome.com.tw/upload/images/20200910/201295843gaVp1yTAl.png
λ是轉換參數,它介於-5到5之間。某些λ值會對應到其他的轉換方法,例如λ=1等於沒做轉換,λ=0是對數轉換,λ=0.5, 是平方根轉換,λ=-1倒數轉換。
要轉換的資料值必須是正數才能使用Box-Cox轉換。

使用scipy.stats中的boxcox來進行資料的轉換,只轉換"Age"欄位資料

train_data['Age_boxcox'], param = stats.boxcox(train_data.Age)
print('Optimal : ', param)
diagnostic_plots(train_data, 'Age_boxcox')

Optimal : 0.7648522500282625
https://ithelp.ithome.com.tw/upload/images/20200910/201295845kKcGtQItR.png

使用scikit-learn中的PowerTransformer來進行資料的轉換,轉換資料集中所有述值型的欄位資料。

from sklearn.preprocessing import PowerTransformer

pt = PowerTransformer(method='box-cox')
pt.fit(train_data)
X_train_pt = pt.transform(train_data) 

上一篇
Day-9 Feature Engineering -- 3. Variable transformation 變數轉換
下一篇
Day11 - Feature Engineering -- 4. 分隔方法(Discretization)
系列文
Machine Learning32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言