在机器学习领域,特征的质量直接决定了模型的性能。我们经常会遇到一些数据,其本身并不是简单的数值或类别,而是以“分布”的形式存在。如何有效地将这些分布信息提取出来,并转化为机器学习模型能够理解和利用的特征,是一个非常重要且有趣的问题。这就像是我们要把一本厚厚的书,提炼出它的核心思想,然后用几个简洁的词语来概括一样。
为什么我们要将分布作为特征?
很多时候,我们观察到的现象并非孤立的个体,而是群体行为的体现。例如:
用户行为分析: 用户在APP里的点击路径、购买商品的种类和数量、观看视频的时长等等,这些不是单个行为,而是用户行为模式的集合。
图像识别: 一张图片的像素值分布、颜色分布、边缘分布,这些都蕴含着丰富的图像信息。
文本分析: 词语在文章中的出现频率、情感倾向的分布,这些都是文本的重要特征。
传感器数据: 某个设备在一段时间内的温度、压力、振动等数据的变化模式。
如果仅仅提取这些分布中的某个“平均值”或“最大值”,可能会丢失大量关键信息。比如,仅仅知道用户平均每天购买1.5件商品,远不如知道用户购买量是“大部分时候购买1件,偶尔购买35件”更能反映其消费习惯。因此,将分布本身的信息转化为特征,能让模型更深入地理解数据背后的规律。
如何将分布转化为机器学习特征?
将分布转化为特征,本质上就是从一个连续或离散的概率分布中提取出有意义的数值或向量,供机器学习模型使用。这个过程可以从多个维度进行:
一、基于统计量的特征提取
这是最直观也最常用的方法。我们可以从分布中计算出一系列经典的统计量,它们能够很好地概括分布的中心趋势、离散程度、形状等。
1. 中心趋势度量:
均值 (Mean): 最基本的衡量分布中心的位置。
中位数 (Median): 对异常值不敏感,更能反映分布的“典型”值。
众数 (Mode): 分布中出现频率最高的值。对于离散分布尤其重要。
2. 离散度/分散度度量:
方差 (Variance) / 标准差 (Standard Deviation): 衡量数据点相对于均值的离散程度。
四分位数范围 (Interquartile Range, IQR): 中间50%数据的范围,对异常值同样鲁棒。
变异系数 (Coefficient of Variation): 标准差与均值的比值,用于比较不同尺度数据的离散程度。
3. 形状度量:
偏度 (Skewness): 衡量分布的不对称性。正偏度表示分布的尾部偏向右侧,负偏度表示偏向左侧。
峰度 (Kurtosis): 衡量分布尾部的“厚度”或“尖锐程度”,以及分布中心的“尖锐”程度。高正峰度表示分布比正态分布更尖锐,尾部更厚(“瘦长”);负峰度则相反(“扁平”)。
4. 其他常用统计量:
最小值 (Min) / 最大值 (Max): 分布的极值。
分位数 (Quantiles): 如P10, P25, P50(中位数), P75, P90等,可以更细致地描述分布的形态。
能量 (Energy): 对于某些类型的分布,如概率密度函数,能量可能是一个有用的特征。
如何操作?
假设我们有一个用户购买金额的列表 `[10, 25, 5, 30, 15, 50, 20, 10, 35, 5]`。我们可以计算:
均值:(10+25+5+30+15+50+20+10+35+5) / 10 = 20.5
中位数:对数据排序后是 `[5, 5, 10, 10, 15, 20, 25, 30, 35, 50]`,中位数是 (15+20)/2 = 17.5
标准差:可以计算出来,例如 15.2
偏度、峰度:也可以通过统计库计算。
这些数值 `[20.5, 17.5, 15.2, skewness_value, kurtosis_value]` 就可以作为模型的一个样本的特征向量。
二、基于直方图的特征提取
直方图是一种将连续数据离散化的方法,它能直观地展示数据的分布情况。我们可以将直方图本身或其衍生的信息作为特征。
1. 直方图的bin值:
将数据分成若干个“桶”(bins),然后计算每个桶中数据的数量或比例。
例如,我们设定购买金额的bins为 `[010, 1020, 2030, 3040, 4050+]`。
根据上述数据 `[10, 25, 5, 30, 15, 50, 20, 10, 35, 5]`,可以得到类似 `[2 (5, 5), 3 (10, 10, 15), 2 (25, 20), 2 (30, 35), 1 (50)]` 的计数。
这些计数或比例 `[0.2, 0.3, 0.2, 0.2, 0.1]` 就可以构成一个特征向量。
2. 直方图特有的统计量:
直方图能量 (Histogram Energy): 所有bin值平方和的最小值。
直方图熵 (Histogram Entropy): 衡量直方图的随机性或不确定性。
直方图的统计矩: 类似于前面提到的均值、方差等,但作用于直方图的bin值上。
如何操作?
使用 `numpy.histogram` 或 `matplotlib.pyplot.hist` 等工具可以生成直方图。然后,我们可以直接使用每个bin的数量或概率作为特征。
重要考虑:
bin的数量和边界: 这是一个关键的超参数。太少可能丢失信息,太多可能引入噪声并使特征维度过高。可以通过经验、交叉验证或一些优化方法来选择。
归一化: 通常需要对bin值进行归一化(例如,转换为概率分布),以消除样本大小的影响。
三、基于核密度估计 (Kernel Density Estimation, KDE) 的特征提取
KDE 是一种非参数方法,用于平滑地估计概率密度函数。它相比直方图,通常能提供更连续、更平滑的分布估计。
1. KDE估计的数值:
在一些选定的点上评估KDE函数的值。这些点可以是等间隔的,也可以是根据数据分布特点选择的。
例如,我们可以用KDE在 `[0, 10, 20, 30, 40, 50]` 这几个点上评估其密度值,得到一个特征向量。
2. KDE的统计量:
KDE积分: 在某个区间内的KDE积分可以表示该区间内数据出现的概率。
KDE的峰值和位置: KDE估计出的密度峰值及其对应的x值,可以反映数据最集中的区域。
如何操作?
可以使用 `scipy.stats.gaussian_kde` 或 `sklearn.neighbors.KernelDensity` 来实现KDE。
重要考虑:
核函数 (Kernel Function): 如高斯核、Epanechnikov核等。
带宽 (Bandwidth): 这是KDE最关键的参数,它决定了平滑的程度。过大的带宽会过度平滑,丢失细节;过小的带宽则可能对噪声敏感。
四、基于分位数函数的特征提取
分位数函数 (Quantile Function, 或 Inverse Cumulative Distribution Function, ICDF) 描述了给定概率值对应的随机变量的值。
1. 常用分位数:
直接提取如P10, P25, P50, P75, P90等分位数的值。这比统计量的“平均分位数”更直接地描述了分布的形状。
2. 分位数回归 (Quantile Regression):
虽然分位数回归本身是一种建模方法,但其训练出的模型可以看作是分布特征的提炼。例如,我们可以训练一个模型来预测P90的值。
如何操作?
使用 `numpy.percentile` 或 `pandas.Series.quantile` 可以方便地计算分位数。
五、基于距离和相似度的特征提取
当我们需要比较两个分布之间的相似性时,可以计算它们之间的距离或相似度,并将这些度量作为特征。
1. 直方图距离:
卡方距离 (ChiSquared Distance): 衡量两个直方图的差异。
巴氏距离 (Bhattacharyya Distance): 衡量两个概率分布的相似性。
KL散度 (KullbackLeibler Divergence): 衡量一个概率分布相对于另一个概率分布的信息增益。
Wasserstein距离 (Earth Mover's Distance, EMD): 衡量将一个分布“转换”成另一个分布所需的最小“工作量”。
2. KDE距离:
类似地,也可以计算两个KDE估计的分布之间的距离。
如何操作?
这些距离度量通常在专门的库或统计工具中提供。例如,`scipy.stats.entropy` 可以计算KL散度。
应用场景举例:
用户画像:
分析用户“浏览商品数量”的分布,提取均值、中位数、标准差、偏度、峰度作为用户活跃度的特征。
分析用户“购买金额”的分布,提取P25, P50, P75作为用户消费能力和习惯的特征。
分析用户“使用时长”的分布,使用直方图bin值作为用户粘性的特征。
图像检索:
提取图像颜色通道(R, G, B)的直方图,将bin值作为图像的颜色特征。
提取图像梯度方向的直方图(Histogram of Oriented Gradients, HOG),这是图像形状和纹理的强大特征。
异常检测:
将正常样本的某个特征(如交易金额)的分布模式(如均值、方差、偏度)学习下来。
当遇到新的样本时,计算其对应特征的分布,并与正常模式的分布进行比较(如计算KL散度)。如果差异过大,则可能被判定为异常。
关键考量与最佳实践:
1. 数据预处理:
清洗: 去除异常值(或在提取统计量时考虑其影响)。
归一化/标准化: 确保不同分布的特征在模型中具有可比性,特别是当计算分布间的距离时。
对数变换: 对于具有严重偏斜的分布,对数变换可以使其更接近对称,便于统计量提取。
2. 特征选择:
领域知识: 结合对业务场景的理解,选择最能代表目标变量的分布特征。
交叉验证: 通过模型性能来评估不同特征的有效性,剔除冗余或低效的特征。
降维: 如果提取了大量基于直方图或KDE的特征,可能需要使用PCA、tSNE等方法进行降维。
3. 特征工程的迭代:
将分布作为特征并非一蹴而就,往往需要反复尝试不同的统计量、直方图bins、KDE带宽等,并通过模型表现来验证和优化。
4. 结合多种特征:
通常,将统计量、直方图信息、甚至分布间的距离度量组合起来,能够构建出更丰富、更具信息量的特征集。
总而言之,将分布作为特征是一个充满创造性的过程。它要求我们不仅理解数据的分布特性,还要将其与机器学习模型的需求相结合,找到最恰当的“语言”来描述这些分布。通过运用统计学、概率论的工具,并结合领域知识和实验验证,我们就能有效地挖掘出隐藏在数据分布中的宝贵信息,从而提升机器学习模型的预测能力。