1.部分代码实现
import numpy as np
from sklearn import datasets
from math import log
from collections import Counter
iris = datasets.load_iris()
X = iris.data[:,2:]
y = iris.target
from sklearn.tree import DecisionTreeClassifier
# criterion = "entropy" : 基于信息熵的方式
dt_clf = DecisionTreeClassifier(max_depth = 2,criterion = "entropy")
dt_clf.fit(X,y)
#模拟使用信息熵进行划分
#d:维度,value:阈值
#获得划分用的d(维度)和value(阈值)
def try_split(X,y):
#方法:通过多次尝试,使信息熵结果最低
best_entropy = float('inf') #用正无穷的值初始化best_entropy
best_d = -1
best_v = -1
#X的维度数:X.shape[1]
#阈值:d划分后的中间值,所以需要先对X的每一列的值进行排序
for d in range(X.shape[1]): #列扫描
sorted_index = np.argsort(X[:,d])
for i in range(1,len(X)): #行扫描
#防止相邻的两个数相等
if X[sorted_index[i - 1],d] != X[sorted_index[i],d]:
v = (X[sorted_index[i - 1],d] + X[sorted_index[i],d]) / 2
X_left,X_right,y_left,y_right = split(X,y,d,v)
#划分完可以求熵了!!!
e = entropy(y_left) + entropy(y_right) #划分得到的信息熵
if e < best_entropy :
#小于则更新熵和划分方式(d