首先,计算出整个数据集的基尼系数:

$$\ Gini(D) = 1 - \sum_{k=1}^{K}p_k^2\ $$

其中,$K$为类别数,对于本题目中的二分类问题,$K=2$,$p_k$为样本属于第$k$类别的概率。

则整个数据集的基尼系数为:

$$\ Gini(D) = 1 - (\frac{10}{25})^2 - (\frac{15}{25})^2 = 0.48\ $$

然后,计算按'有无支票账户'进行划分后的总基尼系数:

$$\ Gini(D,A) = \sum_{i=1}^{n}\frac{|D_i|}{|D|}Gini(D_i)\ $$

其中,$n$为划分后的子集数,$D_i$为第$i$个子集,$|D_i|$为第$i$个子集的样本数,$|D|$为整个数据集的样本数。

按'有无支票账户'进行划分后,得到两个子集,分别为'无支票账户'和'有支票账户',样本数分别为$10$和$15$。

对于'无支票账户'子集,高风险样本数为$8$,低风险样本数为$2$,则该子集的基尼系数为:

$$\ Gini(D_{无}) = 1 - (\frac{8}{10})^2 - (\frac{2}{10})^2 = 0.32\ $$

对于'有支票账户'子集,高风险样本数为$2$,低风险样本数为$13$,则该子集的基尼系数为:

$$\ Gini(D_{有}) = 1 - (\frac{2}{15})^2 - (\frac{13}{15})^2 = 0.26\ $$

因此,按'有无支票账户'进行划分后的总基尼系数为:

$$\ Gini(D,A) = \frac{10}{25} \times 0.32 + \frac{15}{25} \times 0.26 = 0.288\ $$

因此,按'有无支票账户'划分后的数据集的总基尼系数为$0.288$。Python代码如下:

import numpy as np

# 计算基尼系数
def calc_gini(y):
    labels = np.unique(y)
    p = np.array([np.sum(y == label) / len(y) for label in labels])
    gini = 1 - np.sum(p ** 2)
    return gini

# 按某个特征进行数据集划分,计算总基尼系数
def calc_total_gini(X, y, feature):
    values = np.unique(X[:, feature])
    subsets = []
    for value in values:
        subset = X[X[:, feature] == value]
        subsets.append(subset)
    total_gini = 0
    for subset in subsets:
        y_subset = y[X[:, feature] == subset[0, feature]]
        gini = calc_gini(y_subset)
        total_gini += len(subset) / len(X) * gini
    return total_gini

# 构造数据集
X = np.array([[0, 5000], [0, 10000], [0, 20000], [0, 30000], [0, 40000], [1, 1000], [1, 2000], [1, 3000], [1, 4000], [1, 5000], [1, 10000], [1, 20000], [1, 30000], [1, 40000], [1, 50000], [1, 60000], [1, 70000], [1, 80000], [1, 90000], [1, 100000], [1, 200000], [1, 300000], [1, 400000], [1, 500000], [1, 600000]])
y = np.array([1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
# 按'有无支票账户'特征计算总基尼系数
total_gini = calc_total_gini(X, y, 0)
print(total_gini)
决策树模型 - 基尼系数计算:按'有无支票账户'特征划分数据集

原文地址: https://www.cveoy.top/t/topic/okJM 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录