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的值。
train_data['Age_exp'] = train_data.Age**(1/1.2)
diagnostic_plots(train_data, 'Age_exp')
這個方法轉換出來的結果是上述四種中最好的,單就長條圖和QQ圖來看,它也比原始資料更接近常態分布。
Box-Cox和Yeo-Johnson轉換是由指數轉換(exponential transformations)演變而來的,這兩個方法轉換的資料更能達到我們預期的結果。這兩種方法都可以使用scipy.stats中的函數或scikit-learn的PowerTransformer功能來進行資料的轉換,這兩個套件(package)都會自動幫我們選擇能讓轉換後資料最像常態分佈的λ值。
和Box-Cox轉換不一樣,Yeo-Johnson轉換允許原始資料中有負數 。
使用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
使用scikit-learn中的PowerTransformer來進行資料的轉換,轉換資料集中所有述值型的欄位資料。
from sklearn.preprocessing import PowerTransformer
pt = PowerTransformer(method='yeo-johnson')
pt.fit(train_data)
X_train_pt = pt.transform(train_data)
λ是轉換參數,它介於-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
使用scikit-learn中的PowerTransformer來進行資料的轉換,轉換資料集中所有述值型的欄位資料。
from sklearn.preprocessing import PowerTransformer
pt = PowerTransformer(method='box-cox')
pt.fit(train_data)
X_train_pt = pt.transform(train_data)