在机器学习课程中,我需要为一个具有两个类别(在本例中为0和1)的决策树计算Gini指数。我已经阅读了多个关于如何计算它的来源,但在自己的脚本中似乎无法正常工作。尝试了大约10种不同的计算方法后,我开始感到绝望。
数组如下:
Y_left = np.array([[1.],[0.],[0.],[1.],[1.],[1.],[1.]])Y_right = np.array([[1.],[0.],[0.],[0.],[1.],[0.],[0.],[1.],[0.]])
输出应为0.42857。
其中C是类别标签的集合(因此为2),S_L和S_R是由分割标准确定的两个分割部分。
我目前的代码如下:
def tree_gini_index(Y_left, Y_right, classes): """计算Gini指数。 # 参数 Y_left: 左侧数据集的类别标签 尺寸为`(n_objects, 1)`的np.array Y_right: 右侧数据集的类别标签 尺寸为`(n_objects, 1)`的np.array classes: 所有类别值的列表 # 输出 gini: 标量`float` """ gini = 0.0 total = len(Y_left) + len(Y_right) gini = sum((sum(Y_left) / total)**2, (sum(Y_right) / total)**2) return gini
如果有人能给我一些关于如何定义这个函数的指导,我将不胜感激。
回答:
这个函数为left
或right
标签数组计算Gini指数。probs
简单地存储每个类别根据您的公式的概率p_c
。
之后,这个函数计算它们的加权(按样本数量加权)平均值,以产生相应分割的最终Gini指数值。请注意,p_L
和p_R
在您的公式中担任|S_n|/|S|
的角色,其中n
是{left, right}
。
def tree_gini_index(Y_left, Y_right, classes): N = Y_left.shape[0] + Y_right.shape[0] p_L = Y_left.shape[0] / N p_R = Y_right.shape[0] / N return p_L * gini(Y_left, classes) + p_R * gini(Y_right, classes)
调用方式如下:
Y_left = np.array([[1.],[0.],[0.],[1.],[1.],[1.],[1.]])Y_right = np.array([[1.],[0.],[0.],[0.],[1.],[0.],[0.],[1.],[0.]])tree_gini_index(Y_left, Y_right, [0, 1])
输出:
0.4285714285714286