高斯变换简介及Python示例
线性回归和逻辑回归等机器学习模型假设变量是正态分布的。如果一个变量不是正态分布,有时可以找到一个数学变换来把一个变量按照高斯分布进行变换。
遵循高斯分布的变量变换:
这些是一些数学方法来转换变量,使它们遵循高斯分布。没有一个比另一个好。它们主要取决于变量的原始分布。
- 对数变换
- 倒数变换
- 平方根变换
- 指数变换
在本文中,我们将使用比较著名的泰坦尼克号机器学习数据集(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'])
然后让我们检查是否有任何缺失值并使用dropna方法删除它们
data.apply(lambda x: sum(x.isnull()),axis=0)
'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')
在这里,我们创建一个函数diagnostic_plots来可视化变量是否遵循高斯分布。它将data frame和目标变量作为输入参数。函数的第一部分是直方图,第二部分是Q-Q图。我们在变量'Age'上调用函数。
原始分布
该变量遵循近似高斯分布。它略微偏斜,这解释了与下端的45度线(红线)的偏差。
现在让我们应用Age变量的所有上述变换并评估结果。
对数变换:
让我们应用Numpy中的log函数并绘制诊断图。
data['Age_log'] = np.log(data.Age) diagnostic_plots(data, 'Age_log')
对数变换
我们可以看到这个变换并没有使Age服从高斯分布。记住log0没有定义。因此,如果您的数据包含0 -给它一个偏移量或使用另一种变换方法。
倒数变换:
data['Age_reciprocal'] = 1 / data.Age diagnostic_plots(data, 'Age_reciprocal')
倒数变换
我们可以看到这种变换也没有帮助。
平方根变换:
接下来,我们将尝试平方根变换。
data['Age_sqrt'] = data.Age**(1/2) diagnostic_plots(data, 'Age_sqrt')
平方根变换
结果比其他好一点,但仍然不是高斯。开始和结束都有一些偏差。最后,让我们尝试指数变换。
指数变换:
在这里,我们可以尝试任何我们想要的指数。我选择了1.2作为指数。但是你可以尝试不同的指数,看看分布如何变化。
data['Age_exp'] = data.Age**(1/1.2) diagnostic_plots(data, 'Age_exp')
指数变换
正如你在直方图中看到的那样,这种变换使得“Age”变量遵循几乎高斯分布。直方图中的峰值更加居中,并且Q-Q图中的下端值附近仅有一些偏差。因此,在这种特殊情况下,我们可以看到指数变换效果最好。
应该对变量进行变换吗?
这取决于你的最终目标。在业务环境中,最好使用变量的原始分布来训练机器学习模型,因为在使用机器学习模型进行预测时,模型更容易解释,将来可能出现的问题也更少。另一方面,在竞赛的情况下,最好选择一个表现最好的变量。