决策树分类算法python代码实例
时间: 2023-11-15 14:59:33 浏览: 125
决策树分类算法的Python代码实例可以通过以下步骤实现:
1. 构建数据集:将样本数据转换为可用于决策树分类算法的格式。
2. 计算数据集信息熵:使用信息熵来衡量数据集的混乱程度。
3. 计算信息增益:通过计算每个属性的信息增益来确定最佳的分裂属性。
4. 构造决策树:使用递归的方式构造决策树。
5. 实例化构造决策树:使用构造好的决策树对新的数据进行分类。
以下是一个简单的决策树分类算法的Python代码实例:
```
# 导入必要的库
import pandas as pd
import numpy as np
# 构建数据集
data = {'Outlook': ['Sunny', 'Sunny', 'Overcast', 'Rainy', 'Rainy', 'Rainy', 'Overcast', 'Sunny', 'Sunny', 'Rainy', 'Sunny', 'Overcast', 'Overcast', 'Rainy'],
'Temperature': ['Hot', 'Hot', 'Hot', 'Mild', 'Cool', 'Cool', 'Cool', 'Mild', 'Cool', 'Mild', 'Mild', 'Mild', 'Hot', 'Mild'],
'Humidity': ['High', 'High', 'High', 'High', 'Normal', 'Normal', 'Normal', 'High', 'Normal', 'Normal', 'Normal', 'High', 'Normal', 'High'],
'Wind': ['Weak', 'Strong', 'Weak', 'Weak', 'Weak', 'Strong', 'Strong', 'Weak', 'Weak', 'Weak', 'Strong', 'Strong', 'Weak', 'Strong'],
'Play': ['No', 'No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'No']}
df = pd.DataFrame(data)
# 计算数据集信息熵
def entropy(target_col):
elements, counts = np.unique(target_col, return_counts=True)
entropy = np.sum([(-counts[i]/np.sum(counts)) * np.log2(counts[i]/np.sum(counts)) for i in range(len(elements))])
return entropy
# 计算信息增益
def InfoGain(data, split_attribute_name, target_name="Play"):
total_entropy = entropy(data[target_name])
vals, counts = np.unique(data[split_attribute_name], return_counts=True)
Weighted_Entropy = np.sum([(counts[i]/np.sum(counts)) * entropy(data.where(data[split_attribute_name]==vals[i]).dropna()[target_name]) for i in range(len(vals))])
Information_Gain = total_entropy - Weighted_Entropy
return Information_Gain
# 构造决策树
def ID3(data, originaldata, features, target_attribute_name="Play", parent_node_class=None):
# 如果所有目标值都相同,则返回该值
if len(np.unique(data[target_attribute_name])) <= 1:
return np.unique(data[target_attribute_name])[0]
# 如果数据集为空,则返回父节点中最常见的目标值
elif len(data) == 0:
return np.unique(originaldata[target_attribute_name])[np.argmax(np.unique(originaldata[target_attribute_name], return_counts=True)[1])]
# 如果特征集为空,则返回父节点中最常见的目标值
elif len(features) == 0:
return parent_node_class
# 如果以上情况都不满足,则继续构造决策树
else:
# 设置父节点的目标值
parent_node_class = np.unique(data[target_attribute_name])[np.argmax(np.unique(data[target_attribute_name], return_counts=True)[1])]
# 选择最佳分裂属性
item_values = [InfoGain(data, feature, target_attribute_name) for feature in features]
best_feature_index = np.argmax(item_values)
best_feature = features[best_feature_index]
# 构造决策树
tree = {best_feature:{}}
features = [i for i in features if i != best_feature]
for value in np.unique(data[best_feature]):
value = value
sub_data = data.where(data[best_feature] == value).dropna()
subtree = ID3(sub_data, originaldata, features, target_attribute_name, parent_node_class)
tree[best_feature][value] = subtree
return(tree)
# 实例化构造决策树
def predict(query, tree, default = 'Yes'):
for key in list(query.keys()):
if key in list(tree.keys()):
try:
result = tree[key][query[key]]
except:
return default
result = tree[key][query[key]]
if isinstance(result, dict):
return predict(query, result)
else:
return result
# 测试样本分类
data = {'Outlook': 'Sunny', 'Temperature': 'Cool', 'Humidity': 'High', 'Wind': 'Strong'}
tree = ID3(df, df, df.columns[:-1])
print(predict(data, tree))
```
阅读全文