我们(原作者)提出了一种新颖的特征转换方法,类似于标准化。 该方法来自Michael Jahrer,他最近赢得了另一场比赛,并随后分享了他使用的方法。
对于神经网络,Jahrer提出了一种非标准方法,该方法显然比标准化或标准化效果更好。 他称之为RankGauss:
基于梯度的模型(如神经网络)的输入规范化非常重要。 对于lightgbm / xgb无关紧要。 我在过去发现的最棒的作品是“RankGauss”。 它基于等级转换。 第一步是为-1到1的排序特征指定一个空间,然后应用误差函数ErfInv的倒数来像高斯那样对它们进行整形,然后减去平均值。 二进制功能没有与这个trafo(例如,一个热门的)联系在一起。 这通常比标准的mean / std scaler或min / max好得多。
为了实现它,首先我们计算给定列(argsort)中每个值的等级。 然后我们将等级归一化到-1到1.然后我们应用神秘的erfinv函数。 这样做的目的是使变换后的行列高斯分布。
import numpy as np import matplotlib.pyplot as plt from scipy.special import erfinv # simulating normalized ranks from -0.99 to 0.99 x = np.arange( -0.99, 1, 0.01 ) y = erfinv( x ) plt.hist( y )
减去平均值并不是真的必要,因为它非常接近零。
In [33]: y.mean() Out[33]: 1.7495775905650709e-15
实践
要了解它如何工作,我们在kin8nm数据集上测试了该方法。 数据集中的特征共有八个,或多或少均匀分布。 这是训练集中前两个的直方图:
相反,目标变量:
我们为GaussRank实现了fit_predict()方法,因为它比编写单独的fit()和predict()方法容易得多。 使用它从培训和测试集合中获取特征的方式,然后共同适应/转换。 没关系,因为我们没有使用任何标签。
转换后前两个特征的直方图:
对于神经网络,我们使用Keras并使用Hyperband进行超参数搜索,以获得两个版本的数据集:有和没有GaussRank。
我们用原始版本获得的最好成绩是8.14%RMSE,这与我们之前使用PyBrain所取得的成绩相近。 对于转换后的版本,它是10.86%。 因此,我们得出结论,GaussRank不适用于这个数据集。
为了比较,我们还用随机投影转换了数据,保持相同的维度。 请注意,此方法整体转换X矩阵,而不是GaussRank的逐列方案。
这个版本产生了更不显着的13.27%RMSE。 这并不奇怪,因为无监督随机投影一般不会导致更好的监督学习表示。
实验代码在这https://github.com/zygmuntz/gaussrank
文章来自http://fastml.com/preparing-continuous-features-for-neural-networks-with-rankgauss/
翻译基本来自google翻译,写的目的就是提醒自己有这种方法,相当于记个笔记~