代码行数230,由于每次执行代码选取的训练集不同,所以每次执行得到的正确率也不同,最好的情况是正确率达到83%。
特征值离散化的思路:
既然最终的分类是分成三种,那我猜测每个特征的取值也可以分成三个区间,那也就是求两个分割值。求分割值用双层for循环找使得信息熵最小的下标i和j。
代码整体思路:
1 . 先处理数据,shuffle函数随机抽取80%样本做训练集。
2 . 特征值离散化
3 . 用信息熵来递归地构造树
4 . 用构造好的树来判断剩下20%的测试集,求算法做分类的正确率
# coding: utf-8 # In[1]: from sklearn import datasets import math import numpy as np # In[69]: def getInformationEntropy(arr,leng): #print("length = ",leng) return -(arr[0]/leng*math.log(arr[0]/leng if arr[0]>0 else 1)+ arr[1]/leng*math.log(arr[1]/leng if arr[1]>0 else 1)+ arr[2]/leng*math.log(arr[2]/leng if arr[2]>0 else 1)) #informationEntropy = getInformationEntropy(num,length) #print(informationEntropy) # In[105]: #离散化特征一的值 def discretization(index): feature1 = np.array([iris.data[:,index],iris.target]).T feature1 = feature1[feature1[:,0].argsort()] counter1 = np.array([0,0,0]) counter2 = np.array([0,0,0]) resEntropy = 100000 for i in range(len(feature1[:,0])): counter1[int(feature1[i,1])] = counter1[int(feature1[i,1])] + 1 counter2 = np.copy(counter1) for j in range(i+1,len(feature1[:,0])): counter2[int(feature1[j,1])] = counter2[int(feature1[j,1])] + 1 #print(