高斯变换简介及Python示例

testxia 2019-06-06

高斯变换简介及Python示例

线性回归和逻辑回归等机器学习模型假设变量是正态分布的。如果一个变量不是正态分布,有时可以找到一个数学变换来把一个变量按照高斯分布进行变换。

遵循高斯分布的变量变换:

这些是一些数学方法来转换变量,使它们遵循高斯分布。没有一个比另一个好。它们主要取决于变量的原始分布。

  1. 对数变换
  2. 倒数变换
  3. 平方根变换
  4. 指数变换

在本文中,我们将使用比较著名的泰坦尼克号机器学习数据集(https://www.kaggle.com/c/titanic/data)的“Age”变量进行这些变换。

让我们从导入Python包并加载机器学习数据集开始

#Importing Packages
import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt
import pylab
import scipy.stats as stats
#Importing dataset
data = pd.read_csv("train.csv", usecols = ['Age'])

高斯变换简介及Python示例

然后让我们检查是否有任何缺失值并使用dropna方法删除它们

data.apply(lambda x: sum(x.isnull()),axis=0)

高斯变换简介及Python示例

'Age'中的Null值数

data = data.dropna()

原始分布:

让我们从Titanic机器学习数据集中可视化变量的分布开始,我们绘制直方图来可视化钟形图和Q-Q图(两者都用于可视化变量是否服从高斯分布)。记住,如果变量是正态分布的,我们应该看到在理论分位数上有一条45度的直线。也就是说,实际分位数应该与理论值完全一致。

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')

高斯变换简介及Python示例

在这里,我们创建一个函数diagnostic_plots来可视化变量是否遵循高斯分布。它将data frame和目标变量作为输入参数。函数的第一部分是直方图,第二部分是Q-Q图。我们在变量'Age'上调用函数。

高斯变换简介及Python示例

原始分布

该变量遵循近似高斯分布。它略微偏斜,这解释了与下端的45度线(红线)的偏差。

现在让我们应用Age变量的所有上述变换并评估结果。

对数变换:

让我们应用Numpy中的log函数并绘制诊断图。

data['Age_log'] = np.log(data.Age)
diagnostic_plots(data, 'Age_log')

高斯变换简介及Python示例

对数变换

我们可以看到这个变换并没有使Age服从高斯分布。记住log0没有定义。因此,如果您的数据包含0 -给它一个偏移量或使用另一种变换方法。

倒数变换:

data['Age_reciprocal'] = 1 / data.Age
diagnostic_plots(data, 'Age_reciprocal')

高斯变换简介及Python示例

倒数变换

我们可以看到这种变换也没有帮助。

平方根变换:

接下来,我们将尝试平方根变换。

data['Age_sqrt'] = data.Age**(1/2)
diagnostic_plots(data, 'Age_sqrt')

高斯变换简介及Python示例

平方根变换

结果比其他好一点,但仍然不是高斯。开始和结束都有一些偏差。最后,让我们尝试指数变换。

指数变换:

在这里,我们可以尝试任何我们想要的指数。我选择了1.2作为指数。但是你可以尝试不同的指数,看看分布如何变化。

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

高斯变换简介及Python示例

指数变换

正如你在直方图中看到的那样,这种变换使得“Age”变量遵循几乎高斯分布。直方图中的峰值更加居中,并且Q-Q图中的下端值附近仅有一些偏差。因此,在这种特殊情况下,我们可以看到指数变换效果最好。

应该对变量进行变换吗?

这取决于你的最终目标。在业务环境中,最好使用变量的原始分布来训练机器学习模型,因为在使用机器学习模型进行预测时,模型更容易解释,将来可能出现的问题也更少。另一方面,在竞赛的情况下,最好选择一个表现最好的变量。

相关推荐