線性回歸和邏輯回歸等機(jī)器學(xué)習(xí)模型假設(shè)變量是正態(tài)分布的。如果一個變量不是正態(tài)分布,有時可以找到一個數(shù)學(xué)變換來把一個變量按照高斯分布進(jìn)行變換。 遵循高斯分布的變量變換:這些是一些數(shù)學(xué)方法來轉(zhuǎn)換變量,使它們遵循高斯分布。沒有一個比另一個好。它們主要取決于變量的原始分布。
在本文中,我們將使用比較著名的泰坦尼克號機(jī)器學(xué)習(xí)數(shù)據(jù)集(https://www./c/titanic/data)的“Age”變量進(jìn)行這些變換。 讓我們從導(dǎo)入Python包并加載機(jī)器學(xué)習(xí)數(shù)據(jù)集開始 #Importing Packagesimport numpy as np import pandas as pdimport matplotlib.pyplot as pltimport pylabimport scipy.stats as stats#Importing datasetdata = pd.read_csv('train.csv', usecols = ['Age']) 然后讓我們檢查是否有任何缺失值并使用dropna方法刪除它們 data.apply(lambda x: sum(x.isnull()),axis=0) 'Age'中的Null值數(shù) data = data.dropna() 原始分布:讓我們從Titanic機(jī)器學(xué)習(xí)數(shù)據(jù)集中可視化變量的分布開始,我們繪制直方圖來可視化鐘形圖和Q-Q圖(兩者都用于可視化變量是否服從高斯分布)。記住,如果變量是正態(tài)分布的,我們應(yīng)該看到在理論分位數(shù)上有一條45度的直線。也就是說,實際分位數(shù)應(yīng)該與理論值完全一致。 def diagnostic_plots(df, variable): plt.figure(figsize=(15,6)) plt.subplot(1,2,1) df[variable].hist() #plt.xlim((0, 100)) plt.subplot(1,2,2) stats.probplot(df[variable], dist='norm', plot = pylab) plt.show() diagnostic_plots(data, 'Age') 在這里,我們創(chuàng)建一個函數(shù)diagnostic_plots來可視化變量是否遵循高斯分布。它將data frame和目標(biāo)變量作為輸入?yún)?shù)。函數(shù)的第一部分是直方圖,第二部分是Q-Q圖。我們在變量'Age'上調(diào)用函數(shù)。 原始分布 該變量遵循近似高斯分布。它略微偏斜,這解釋了與下端的45度線(紅線)的偏差。 現(xiàn)在讓我們應(yīng)用Age變量的所有上述變換并評估結(jié)果。 對數(shù)變換:讓我們應(yīng)用Numpy中的log函數(shù)并繪制診斷圖。 data['Age_log'] = np.log(data.Age)diagnostic_plots(data, 'Age_log') 對數(shù)變換 我們可以看到這個變換并沒有使Age服從高斯分布。記住log0沒有定義。因此,如果您的數(shù)據(jù)包含0 -給它一個偏移量或使用另一種變換方法。 倒數(shù)變換:data['Age_reciprocal'] = 1 / data.Agediagnostic_plots(data, 'Age_reciprocal') 倒數(shù)變換 我們可以看到這種變換也沒有幫助。 平方根變換:接下來,我們將嘗試平方根變換。 data['Age_sqrt'] = data.Age**(1/2)diagnostic_plots(data, 'Age_sqrt') 平方根變換 結(jié)果比其他好一點,但仍然不是高斯。開始和結(jié)束都有一些偏差。最后,讓我們嘗試指數(shù)變換。 指數(shù)變換:在這里,我們可以嘗試任何我們想要的指數(shù)。我選擇了1.2作為指數(shù)。但是你可以嘗試不同的指數(shù),看看分布如何變化。 data['Age_exp'] = data.Age**(1/1.2)diagnostic_plots(data, 'Age_exp') 指數(shù)變換 正如你在直方圖中看到的那樣,這種變換使得“Age”變量遵循幾乎高斯分布。直方圖中的峰值更加居中,并且Q-Q圖中的下端值附近僅有一些偏差。因此,在這種特殊情況下,我們可以看到指數(shù)變換效果最好。 應(yīng)該對變量進(jìn)行變換嗎?這取決于你的最終目標(biāo)。在業(yè)務(wù)環(huán)境中,最好使用變量的原始分布來訓(xùn)練機(jī)器學(xué)習(xí)模型,因為在使用機(jī)器學(xué)習(xí)模型進(jìn)行預(yù)測時,模型更容易解釋,將來可能出現(xiàn)的問題也更少。另一方面,在競賽的情況下,最好選擇一個表現(xiàn)最好的變量。 |
|
來自: taotao_2016 > 《AI》