分类结果:
缺点:如果把编号也作为样本特征的话,那么它的信息增益为0.758,大于所有其他特征的信息增益,说明特征值种类越多,信息增益趋向于越大。
通过增益率改良后的C4.5算法C4.5算法旨在消除这种由特征值种类差异所引起的“不平等待遇”。它引入了特征的“固有值”的概念,相当于对该特征的种类及数量计算信息熵。而这种“固有值”也拥有这种“不平等待遇”(种类越多,信息增益越大),所以两者相除,正好抵消了这种差异:
固有值的计算公式:
信息增益在C4.5算法下的计算公式:
由于C4.5与ID3的区别只是计算公式的不同,所以在获取最佳特征的函数get_best_feature()中稍作修改即可: def get_best_feature(self, dataset, E): feature_list = dataset[0, :-1] feature_gains = {} for i in range(len(feature_list)): # 分别统计在每个特征值划分下的信息增益 feature_values = np.unique(dataset[1:, i]) feature_sum = len(dataset[1:, i]) # 累加子集熵 sub_entropy_sum = 0 # 累加feature的固有值 intrinsic_value = 0 for value in feature_values: # 按值划分子集 subset = self.dataset_split(dataset, feature_list[i], value) subset_sum = len(subset) # 计算子集熵 sub_entropy = self.get_entropy(subset) # 权重 w = subset_sum/feature_sum # 汇总当前特征下的子集熵*个数权重 sub_entropy_sum += w*sub_entropy intrinsic_value += -1*(w*math.log2(w)) # 根据算法类型选择对应的公式计算信息增益 if self.type == 0: feature_gains[feature_list[i]] = E-sub_entropy_sum else: feature_gains[feature_list[i]] = (E-sub_entropy_sum)/intrinsic_value # 返回最大信息增益对应的特征及索引 max_gain = max(feature_gains.values()) for feature in feature_gains: if feature_gains[feature] == max_gain: index = list(feature_list).index(feature) return feature, index
得到的分类结果:
基尼系数和剪枝的内容待补充。。。