python实现西瓜2.0决策树
时间: 2023-06-09 19:02:57 浏览: 120
以下是一个简单的Python实现示例:
```python
import pandas as pd
import numpy as np
# 定义数据集
data = {
'色泽': ['青绿', '乌黑', '乌黑', '青绿', '浅白', '青绿', '乌黑', '乌黑', '乌黑', '青绿'],
'根蒂': ['蜷缩', '蜷缩', '硬挺', '蜷缩', '蜷缩', '稍蜷', '稍蜷', '蜷缩', '稍蜷', '硬挺'],
'敲声': ['浊响', '沉闷', '浊响', '沉闷', '浊响', '浊响', '沉闷', '浊响', '浊响', '沉闷'],
'纹理': ['清晰', '稍糊', '清晰', '稍糊', '清晰', '?', '?', '稍糊', '?', '稍糊'],
'脐部': ['凹陷', '凹陷', '凹陷', '凹陷', '凹陷', '稍凹', '稍凹', '凹陷', '稍凹', '硬挺'],
'触感': ['硬滑', '硬滑', '硬滑', '硬滑', '硬滑', '软粘', '软粘', '硬滑', '软粘', '软粘'],
'好瓜': ['是', '是', '是', '是', '是', '是', '是', '是', '否', '否']
}
df = pd.DataFrame(data)
# 定义信息熵函数
def entropy(s):
_, counts = np.unique(s, return_counts=True)
p = counts / len(s)
return -np.sum(p * np.log2(p))
# 定义信息增益函数
def gain(data, feature, target):
target_entropy = entropy(data[target])
feature_values, counts = np.unique(data[feature], return_counts=True)
weighted_feature_entropy = np.sum([(counts[i] / np.sum(counts)) * entropy(data.where(data[feature]==feature_values[i]).dropna()[target]) for i in range(len(feature_values))])
return target_entropy - weighted_feature_entropy
# 定义决策树构建函数
def build_tree(data, features, target):
# 如果数据集中所有瓜都是同一种,则返回叶节点,将该瓜类别作为节点值
if len(np.unique(data[target])) <= 1:
return np.unique(data[target])[0]
# 如果没有特征可供选择,则返回叶节点,将数据集中出现次数最多的瓜类别作为节点值
if len(features) == 0:
return data[target].mode()[0]
# 否则,选择信息增益最大的特征进行分割
best_feature = max(features, key=lambda f: gain(data, f, target))
# 创建新的决策树节点,并递归处理子树
tree = {best_feature: {}}
for value in np.unique(data[best_feature]):
sub_data = data.where(data[best_feature] == value).dropna()
sub_tree = build_tree(sub_data, [f for f in features if f != best_feature], target)
tree[best_feature][value] = sub_tree
return tree
# 构建决策树
tree = build_tree(df, df.columns[:-1], '好瓜')
# 打印决策树
import json
print(json.dumps(tree, indent=4))
```
希望这个示例能对你有所帮助!
阅读全文