python实现ID3
具体的决策树原理在此就不再赘述,可自行百度或者看我之前写的:https://blog.youkuaiyun.com/weixin_38273255/article/details/88752468
在这里主要列出我使用的代码,和一些学习时候的心得。
心得
代码在网上其实都有一大片一大片的,但是自己觉得不太符合自己想要的要求,所以就找了网上的代码,并做了一些修改。很多地方肯定会有毛病,还望见谅。
我想要的是能够对连续型数据做处理,但是ID3是对离散型数据做处理,网上的示例代码也是如此,之前在学习原理的时候看到说可以对连续数据做离散处理:
- 对连续数据排序
- 将排好的序列等分(让每个区间落入的数据量基本一致)
- 重新对区间赋值
- 离散化完成
可能这个也存在问题,但是就这么实现了。
代码
- 导入数据
- 对数据离散化
- 创建决策树
- 绘制决策树图像
- 输入测试集测试
下下面就列出我的代码,代码主要是对iris数据集做出了处理,其他数据集可自行修改。
main.py
# -*- coding: utf-8 -*-
import creat as ct
import draw as dr
import yanzheng as yz
from sklearn import datasets
import numpy as np
import lisanhua as lsh
import random
#加载iris数据集
iris = datasets.load_iris()
all_data = iris.data[:,:]
all_target = iris.target[:]
labels = iris.feature_names[:]
#常量定义
n = 150#数据集总数
m = int(n*2/3)#创建用的数据量
q = 4#数据维度
l = 7#离散化个数
#对数据离散化
a = []
all_data,a = lsh.lsh(all_data,l)
#将target和数据合并
all_data = all_data.tolist()
all_target = all_target.tolist()
for i in range(len(all_target)):
all_data[i].append(all_target[i])
#将数据打乱
random.shuffle(all_data)
#创建决策树数据集
cj_data = all_data[:m]
#创建决策树
myTree=ct.createTree(cj_data,labels)
#创建验证数据集
all_data = np.array(all_data)#转化为numpy
yz_target = np.array(all_data[m:n,q:q+1])
yz_data = np.array(all_data[m:n,:q])
yz_labels = np.array(iris.feature_names[:])
#验证决策树正确率
yz_shu = yz.yanzheng(myTree,yz_data,yz_labels,yz_target)
yz_bfb = float(yz_shu)/(n-m)
#结果反馈
print(myTree