C4.5算法只需对李航《统计学习方法》决策树ID3算法实现做些修改
def bestFeatureToSplit(dataset):
'''
input:数据集
output:最好的划分特征
describe:选择最好的数据集划分维度
'''
numFeatures = dataset.shape[1] - 1
ShannonEnt = calcShannonEnt(dataset)
bestInfoGain = 0.0
bestFeature = -1
cols = dataset.columns.tolist()
for i in range(numFeatures):
equalVals = set(dataset[cols[i]].tolist())
newEntropy = 0.0
for value in equalVals:
subDataSet = splitDataSet(dataset, cols[i], value)
prob = subDataSet.shape[0] / dataset.shape[0]
newEntropy += prob * calcShannonEnt(subDataSet)
#####计算特征熵#####
splitInfo += -prob * log(prob, 2)
###################
infoGain = ShannonEnt - newEntropy
print(cols[i],infoGain)
#####计算增益比#####
infoGainRatio = infoGain / splitInfo
###################
if infoGain > bestInfoGain:
bestInfoGain = infoGain
bestFeature = cols[i]
return bestFeature, bestInfoGain
对ID3算法中bestFeatureToSplit()函数进行了修改,计算增益比。
我们引入一个信息增益比的变量
,它是信息增益和特征熵的比值,表达式如下:
其中
为样本特征输出的集合,
为样本特征,对于特征熵
,表达式如下:
其中
为特征
的类别个数,
为特征
的第
个取值对应的样本个数。
为样本个数。特征数越多的特征对应的特征熵越大,它作为分母,可以校正信息增益容易偏向于取值较多的特征的问题。