编写代码计算信息增益
时间: 2023-10-09 11:12:04 浏览: 129
信息增益(information gain)是决策树算法中用于选择最佳分裂属性的指标。计算信息增益需要用到熵(entropy)的概念。下面是 Python 代码实现信息增益的计算:
```python
import math
def calc_entropy(data):
"""
计算数据集的熵值
:param data: 数据集,每个样本的最后一列为标签
:return: 熵值
"""
label_counts = {}
for feat_vec in data:
current_label = feat_vec[-1]
if current_label not in label_counts:
label_counts[current_label] = 0
label_counts[current_label] += 1
num_entries = len(data)
entropy = 0.0
for key in label_counts:
prob = float(label_counts[key]) / num_entries
entropy -= prob * math.log(prob, 2)
return entropy
def split_data(data, axis, value):
"""
根据给定特征划分数据集
:param data: 待划分的数据集
:param axis: 划分数据集的特征
:param value: 特征的值
:return: 划分结果
"""
ret_data = []
for feat_vec in data:
if feat_vec[axis] == value:
reduced_feat_vec = feat_vec[:axis]
reduced_feat_vec.extend(feat_vec[axis + 1:])
ret_data.append(reduced_feat_vec)
return ret_data
def choose_best_feature(data):
"""
选择最佳划分特征
:param data: 数据集
:return: 最佳划分特征的下标
"""
num_features = len(data[0]) - 1
base_entropy = calc_entropy(data)
best_info_gain = 0.0
best_feature = -1
for i in range(num_features):
feat_list = [example[i] for example in data]
unique_vals = set(feat_list)
new_entropy = 0.0
for value in unique_vals:
sub_data = split_data(data, i, value)
prob = len(sub_data) / float(len(data))
new_entropy += prob * calc_entropy(sub_data)
info_gain = base_entropy - new_entropy
if info_gain > best_info_gain:
best_info_gain = info_gain
best_feature = i
return best_feature
```
以上代码中,`calc_entropy` 函数用于计算数据集的熵值,`split_data` 函数用于根据指定特征划分数据集,`choose_best_feature` 函数用于选择最佳划分特征。其中,最佳划分特征的选择是基于信息增益的,信息增益越大,说明使用该特征划分数据集可以得到更好的决策树模型。
阅读全文