【背景】
首先我们先看一下,本期度词条对信息增益的广义定义:
其实,我们主要用到信息增益,还是在特征选择上。个人理解信息增益就是目标列(y)整体信息熵和特征列每一个类别分组下对应目标列信息熵期望的差值,所有在命名时会用到增益。整体来看是y值的整体分布和y值在不同特征类型别下分布累加的差距。依此来衡量变量对目标(y)列的区分度,或者叫纯度。但是信息增益评价指标会倾向于类别个数比较多的列。所以特征选择过程中会配合增益率一块使用,或者对特征列进行分分箱离散化时特征列类别个数相近,从而去除特征类别个数对评价指标的影响。
【原理】
【公式】
其中 Ent(D)是目标y列的信息熵,第二项是条件信息熵期望,即D列每个类别(D^v)对应y的信息熵的期望
【spark实现】
如下为计算每隔待选列的信息熵
object EntropyCalculator {
/**
* @desc 计算信息熵
* @param calCols 需要计算的列
* @param dfRowNum 当前数据集总行数
* @return
*/
def calculator(
df: DataFrame,
calCols: Array[String],
ycol: String,
dfRowNum: Double
): Map[String, Double] = {
if (df.storageLevel == StorageLevel.NONE) {
df.persist(StorageLevel.DISK_ONLY)
}
val result = if (dfRowNum == 0) {
calCols.m