python代码使用ID3算法生成决策树算法
时间: 2023-07-10 11:22:55 浏览: 75
以下是使用ID3算法生成决策树的Python代码示例:
```python
import math
def create_decision_tree(data, attributes, target_attribute):
"""
使用ID3算法生成决策树
data: 数据集
attributes: 属性列表
target_attribute: 目标属性名
"""
# 如果数据集为空,则返回None
if len(data) == 0:
return None
# 如果所有数据属于同一类别,则返回该类别
elif len(set(data[target_attribute])) == 1:
return data[target_attribute][0]
# 如果属性列表为空,则返回数据集中出现最多的类别
elif len(attributes) == 0:
return max(set(data[target_attribute]), key=data[target_attribute].count)
else:
# 选择最佳属性作为节点
best_attribute = get_best_attribute(data, attributes, target_attribute)
# 创建根节点
root = {best_attribute: {}}
# 删除已选属性
attributes.remove(best_attribute)
# 获取该属性的所有取值
attribute_values = set(data[best_attribute])
# 遍历每个取值,创建子节点
for value in attribute_values:
sub_data = get_sub_data(data, best_attribute, value)
sub_tree = create_decision_tree(sub_data, attributes[:], target_attribute)
root[best_attribute][value] = sub_tree
return root
def get_best_attribute(data, attributes, target_attribute):
"""
选择最佳属性
data: 数据集
attributes: 属性列表
target_attribute: 目标属性名
"""
# 计算信息增益
info_gains = []
for attribute in attributes:
info_gain = calculate_info_gain(data, attribute, target_attribute)
info_gains.append(info_gain)
# 返回信息增益最大的属性
return attributes[info_gains.index(max(info_gains))]
def calculate_info_gain(data, attribute, target_attribute):
"""
计算信息增益
data: 数据集
attribute: 属性名
target_attribute: 目标属性名
"""
# 计算原始熵
entropy = calculate_entropy(data, target_attribute)
# 计算按属性分类后的条件熵
attribute_values = set(data[attribute])
attribute_entropy = 0
for value in attribute_values:
sub_data = get_sub_data(data, attribute, value)
sub_entropy = calculate_entropy(sub_data, target_attribute)
attribute_entropy += (len(sub_data) / len(data)) * sub_entropy
# 计算信息增益
info_gain = entropy - attribute_entropy
return info_gain
def calculate_entropy(data, target_attribute):
"""
计算熵
data: 数据集
target_attribute: 目标属性名
"""
entropy = 0
target_attribute_values = set(data[target_attribute])
for value in target_attribute_values:
count = data[target_attribute].count(value)
p = count / len(data)
entropy += -p * math.log2(p)
return entropy
def get_sub_data(data, attribute, value):
"""
获取按属性取值分类后的子集
data: 数据集
attribute: 属性名
value: 属性取值
"""
sub_data = data[data[attribute] == value].reset_index(drop=True)
sub_data = sub_data.drop(attribute, axis=1)
return sub_data
```
使用示例:
```python
import pandas as pd
data = pd.read_csv('data.csv')
attributes = list(data.columns[:-1])
target_attribute = data.columns[-1]
tree = create_decision_tree(data, attributes, target_attribute)
print(tree)
```
其中,`data.csv`是包含训练数据的CSV文件,每行表示一个数据样本,最后一列是目标属性,其余列是特征属性。
阅读全文