选择最好的数据集划分方式
# 选择使分割后信息增益最大的特征,即对应的列
def chooseBestFeatureToSplit(dataSet):
# 获取特征的数目,从0开始,dataSet[0]是一条数据
numFeatures = len(dataSet[0]) - 1
# 计算数据集当前的信息熵
baseEntropy = CalcShannonEnt(dataSet)
# 定义最大的信息增益
bestInfoGain = 0.0
# 定义分割后信息增益最大的特征
bestFeature = -1
# 遍历特征,即所有的列,计算每一列分割后的信息增益,找出信息增益最大的列
for i in range(numFeatures):
# 取出第i列特征赋给featList
featList = [example[i] for example in dataSet]
# 将特征对应的值放到一个集合中,使得特征列的数据具有唯一性
uniqueVals = set(featList)
# 定义分割后的信息熵
newEntropy = 0.0
# 遍历特征列的所有值(值是唯一的,重复值已经合并),分割并计算信息增益
for value in uniqueVals:
# 按照特征列的每个值进行数据集分割
subDataSet = splitDataSet(dataSet, i, value)
# 计算分割后的每个子集的概率(频率)
prob = len(subDataSet) / float(len(dataSet))
# 计算分割后的子集的信息熵并相加,得到分割后的整个数据集的信息熵
newEntropy +=prob * CalcShannonEnt(subDataSet)
# 计算分割后的信息增益
infoGain = baseEntropy - newEntropy
# 如果分割后信息增益大于最好的信息增益
if(infoGain > bestInfoGain):
# 将当前的分割的信息增益赋值为最好信息增益
bestInfoGain = infoGain
# 分割的最好特征列赋为i
bestFeature = i
# 返回分割后信息增益最大的特征列
return bestFeature