id3算法python实现
时间: 2023-09-29 08:03:01 浏览: 45
ID3算法是一种分类算法,它基于信息增益选择最优特征来构建决策树。下面是一个简单的Python实现:
```python
import math
def calc_entropy(data):
"""
计算数据集的熵
"""
size = len(data)
classes = {}
for item in data:
label = item[-1]
if label not in classes:
classes[label] = 0
classes[label] += 1
entropy = 0.0
for key in classes:
prob = float(classes[key]) / size
entropy -= prob * math.log(prob, 2)
return entropy
def split_data(data, axis, value):
"""
划分数据集
"""
ret_data = []
for item in data:
if item[axis] == value:
reduced_item = item[:axis]
reduced_item.extend(item[axis+1:])
ret_data.append(reduced_item)
return ret_data
def choose_feature(data):
"""
选择最优特征
"""
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
def create_tree(data, labels):
"""
构建决策树
"""
class_list = [example[-1] for example in data]
if class_list.count(class_list[0]) == len(class_list):
return class_list[0]
if len(data[0]) == 1:
return max(set(class_list), key=class_list.count)
best_feat = choose_feature(data)
best_feat_label = labels[best_feat]
my_tree = {best_feat_label: {}}
del(labels[best_feat])
feat_values = [example[best_feat] for example in data]
unique_vals = set(feat_values)
for value in unique_vals:
sub_labels = labels[:]
my_tree[best_feat_label][value] = create_tree(split_data(data, best_feat, value), sub_labels)
return my_tree
```
以上是一个简单的ID3算法的Python实现,其中calc_entropy函数计算数据集的熵,split_data函数用于划分数据集,choose_feature函数选择最优特征,create_tree函数递归地构建决策树。