给定一个二维数据集,每行是一个样本,最后一列为标签。要对每个特征计算基尼指数,选择基尼值最小的特征。基尼指数常用于决策树(CART)算法的划分标准。
def best_feature(data):
    # data: 二维列表,每行末尾是标签
    n = len(data)
    m = len(data[0]) - 1  # 特征数
    best_idx, best_g = 0, float('inf')
    for j in range(m):
        # 按 data[i][j] 分组,存各组的标签列表
        groups = {}
        for row in data:
            v = row[j]
            groups.setdefault(v, []).append(row[-1])
        # 计算特征 j 的基尼指数
        g_j = 0.0
        for labels in groups.values():
            size = len(labels)
            # 统计每个类别的数量
            cnt = {}
            for lbl in labels:
                cnt[lbl] = cnt.get(lbl, 0) + 1
            # 计算子集基尼
            score = 1.0
            for c in cnt.values():
                p = c / size
                score -= p * p
            g_j += size / n * score
        # 更新最小基尼
        if g_j < best_g:
            best_g, best_idx = g_j, j
    # 保留一位小数
    return best_idx, round(best_g, 1)
data = eval(input())
print(best_feature(data))  # 输出
        给定一个数据集,其中每一行代表一个样本,每一列代表一个特征,最后一列是样本的标签。请你计算每个特征的基尼指数,并输出基尼指数最小的特征的索引和对应的基尼指数。 基尼指数的计算公式:对于一个特征,其基尼指数定义为:
Gini(D,A)=∑v∈VD∣Dv∣Gini(Dv)
其中,D是数据集,A是特征,V是特征A得所有可能的取值,DV是在特征A取值为v的情况下的数据集,∣D∣是数据集的样本数量,∣Dv∣是在特征A取之为v的情况的样本数量,Gini(Dv)是在特征A取值为v的情况下的数据集的基尼值,其计算公式为:
Gini(D)=1−∑k=1k(pk)2
其中,K是标签的所有可能取值,Pk是在数据集D中标签取值为k的样本比例。
一个二维列表,其中每一个子列表代表一个样本,每个样本包含一些特征值和一个标签值。所有的特征值都是数值型的,标签值是字符串。你可以假设输入的数据集至少包含一个样本,并且每个样本至少包含一个特征和一个标签。
一个元组,第一个元素是基尼指数最小的特征的索引,第二个元素是该特征的基尼指数(保留1位小数)。如果有多个特征的基尼指数相同,输出索引最小的那个。
输入
[[1.0, 'yes'], [1.0, 'no'], [2.0, 'yes'], [2.0, 'no']]
输出
(0, 0.5)