线性回归和逻辑回归等机器学习模型假设变量是正态分布的。如果一个变量不是正态分布,有时可以找到一个数学变换来把一个变量按照高斯分布进行变换。 遵循高斯分布的变量变换:这些是一些数学方法来转换变量,使它们遵循高斯分布。没有一个比另一个好。它们主要取决于变量的原始分布。
在本文中,我们将使用比较著名的泰坦尼克号机器学习数据集(https://www./c/titanic/data)的“Age”变量进行这些变换。 让我们从导入Python包并加载机器学习数据集开始 #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值数 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.Agediagnostic_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图中的下端值附近仅有一些偏差。因此,在这种特殊情况下,我们可以看到指数变换效果最好。 应该对变量进行变换吗?这取决于你的最终目标。在业务环境中,最好使用变量的原始分布来训练机器学习模型,因为在使用机器学习模型进行预测时,模型更容易解释,将来可能出现的问题也更少。另一方面,在竞赛的情况下,最好选择一个表现最好的变量。 |
|
来自: taotao_2016 > 《AI》