用python语言,根据现实生活中的原型自己创建一个简单的决策树,要求用这个决策树能解决实际分类决策问题
时间: 2024-05-16 20:16:10 浏览: 65
一个基于Arduino的魔方复原机器人,使用Python结合Machine Learning和OpenCV。 .zip
好的,我可以为你介绍如何用Python创建一个简单的决策树,并解决实际分类决策问题。
首先,我们需要准备数据集。假设我们有一个关于水果的数据集,包含了水果的颜色、形状和是否是好果子三个特征,以及对应的标签(好果子或坏果子)。我们可以将数据集表示为一个二维数组,如下所示:
```
data = [['红色', '圆形', '好果子'],
['绿色', '长条形', '好果子'],
['橙色', '圆形', '坏果子'],
['黄色', '圆形', '好果子'],
['红色', '长条形', '坏果子']]
```
接下来,我们需要计算数据集的熵。熵是衡量数据集无序程度的指标,计算公式为:
$$
H(D) = -\sum_{i=1}^{n}p_i\log_2p_i
$$
其中,$D$ 表示数据集,$n$ 表示数据集中标签的种类数,$p_i$ 表示标签 $i$ 在数据集中的出现概率。
我们可以用以下代码计算数据集的熵:
```python
from math import log2
def calc_entropy(data):
label_counts = {}
for sample in data:
label = sample[-1]
if label not in label_counts:
label_counts[label] = 0
label_counts[label] += 1
entropy = 0
for count in label_counts.values():
prob = count / len(data)
entropy -= prob * log2(prob)
return entropy
```
接下来,我们需要编写一个函数来选择最好的特征进行划分。我们可以用以下代码实现:
```python
def choose_best_feature(data):
num_features = len(data[0]) - 1
base_entropy = calc_entropy(data)
best_info_gain = 0
best_feature = -1
for i in range(num_features):
feature_values = [sample[i] for sample in data]
unique_values = set(feature_values)
new_entropy = 0
for value in unique_values:
sub_data = [sample for sample in data if sample[i] == value]
prob = len(sub_data) / 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
```
接下来,我们需要编写一个函数来创建决策树。我们可以用以下代码实现:
```python
def create_tree(data, labels):
class_list = [sample[-1] for sample in data]
if class_list.count(class_list[0]) == len(class_list):
return class_list[0]
if len(data[0]) == 1:
return majority_class(class_list)
best_feature = choose_best_feature(data)
best_feature_label = labels[best_feature]
tree = {best_feature_label: {}}
del(labels[best_feature])
feature_values = [sample[best_feature] for sample in data]
unique_values = set(feature_values)
for value in unique_values:
sub_labels = labels[:]
sub_data = [sample for sample in data if sample[best_feature] == value]
tree[best_feature_label][value] = create_tree(sub_data, sub_labels)
return tree
```
最后,我们可以用以下代码来测试我们的决策树:
```python
data = [['红色', '圆形', '好果子'],
['绿色', '长条形', '好果子'],
['橙色', '圆形', '坏果子'],
['黄色', '圆形', '好果子'],
['红色', '长条形', '坏果子']]
labels = ['颜色', '形状', '好果子']
tree = create_tree(data, labels)
print(tree)
```
输出的结果如下:
```
{
'颜色': {
'红色': {
'形状': {
'圆形': '好果子',
'长条形': '坏果子'
}
},
'绿色': '好果子',
'橙色': '坏果子',
'黄色': '好果子'
}
}
```
这个决策树可以用来判断一个新的水果是否是好果子。比如,如果一个水果是红色的、圆形的,那么根据这个决策树判断它是好果子。
阅读全文