给定一个二维数据集,每行是一个样本,最后一列为标签。要对每个特征计算基尼指数,选择基尼值最小的特征。基尼指数常用于决策树(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)