数据集的分割点是关于输入中某个属性的分割。对数据集中某个样本而言,分割点会根据某阈值对该样本对应属性的值进行分类。他能根据训练集中出现的模式将数据分为两类。 基尼系数通过计算分割点创建的两个类别中数据类别的混杂程度,来表现分割点的好坏。一个完美的分割点对应的基尼系数为 0(译者注:即在一类中不会出现另一类的数据,每个类都是「纯」的),而最差的分割点的基尼系数则为 1.0(对于二分问题,每一类中出现另一类数据的比例都为 50%,也就是数据完全没能被根据类别不同区分开)。 下面我们通过一个具体的例子来说明如何计算基尼系数。 我们有两组数据,每组有两行。第一组数据中所有行都属于类别 0(Class 0),第二组数据中所有的行都属于类别 1(Class 1)。这是一个完美的分割点。 首先我们要按照下式计算每组数据中各类别数据的比例: proportion = count(class_value) / count(rows) 那么,对本例而言,相应的比例为: group_1_class_0 = 2 / 2 = 1 group_1_class_1 = 0 / 2 = 0 group_2_class_0 = 0 / 2 = 0 group_2_class_1 = 2 / 2 = 1 基尼系数按照如下公式计算: gini_index = sum(proportion * (1.0 - proportion)) 将本例中所有组、所有类数据的比例带入到上述公式: gini_index = (group_1_class_0 * (1.0 - group_1_class_0)) + (group_1_class_1 * (1.0 - group_1_class_1)) + (group_2_class_0 * (1.0 - group_2_class_0)) + (group_2_class_1 * (1.0 - group_2_class_1)) 化简,得: gini_index = 0 + 0 + 0 + 0 = 0 如下是一个叫做 gini_index() 的函数,它能够计算给定数据的基尼系数(组、类别都以列表(list)的形式给出)。其中有些算法鲁棒性检测,能够避免对空组除以 0 的情况。 # Calculate the Gini index for a split dataset def gini_index(groups, class_values): gini = 0.0 for class_value in class_values: for group in groups: size = len(group) if size == 0: continue proportion = [row[-1] for row in group].count(class_value) / float(size) gini += (proportion * (1.0 - proportion)) return gini 我们可以根据上例来测试该函数的运行情况,也可以测试最差分割点的情况。完整的代码如下: # Calculate the Gini index for a split dataset def gini_index(groups, class_values): gini = 0.0 for class_value in class_values: for group in groups: size = len(group) if size == 0: continue proportion = [row[-1] for row in group].count(class_value) / float(size) gini += (proportion * (1.0 - proportion)) return gini # test Gini values print(gini_index([[[1, 1], [1, 0]], [[1, 1], [1, 0]]], [0, 1])) print(gini_index([[[1, 0], [1, 0]], [[1, 1], [1, 1]]], [0, 1])) 运行该代码,将会打印两个基尼系数,其中第一个对应的是最差的情况为 1.0,第二个对应的是最好的情况为 0.0。 1.0 0.0 2.2 创建分割点 一个分割点由数据集中的一个属性和一个阈值构成。 我们可以将其总结为对给定的属性确定一个分割数据的阈值。这是一种行之有效的分类数据的方法。 创建分割点包括三个步骤,其中第一步已在计算基尼系数的部分讨论过。余下两部分分别为: 1. 分割数据集。 2. 评价所有(可行的)分割点。 我们具体看一下每个步骤。 2.2.1 分割数据集 分割数据集意味着我们给定数据集某属性(或其位于属性列表中的下表)及相应阈值的情况下,将数据集分为两个部分。 一旦数据被分为两部分,我们就可以使用基尼系数来评估该分割的成本函数。 (责任编辑:本港台直播) |