决策树的使用及原理
决策树——鸢尾花分类
附:解释决策树每层分类的信息增益计算及选择按顺序如何选择特征分类顺序
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn import tree
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
#criterion:"entropy","gini"; max_Depth:树的深度
#min_sample_split:分裂一个内部节点(非叶子几点)需要的最少样本数
#max_leaf_nodes:制定了每个叶子几点包含的最少样本数
#min_samples_leaf:
#数据读取
iris=datasets.load_iris()
x=iris["data"]
y=iris["target"]
names=iris.feature_names
print(names)
#训练集分割
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=1)
#建立决策树,对于max_depth,叶节点不算在深度内,深度越深计算时间越长
clf=DecisionTreeClassifier(criterion="gini",max_depth=5)
#输入特征值,目标值
clf.fit(x_train,y_train)
# #对于连续的特征数据,给与阈值,threshold
# print(x_train.std(axis=0)) #标准差越大的特征向量波动越大,越容易区分
# #第一次划分
# print(np.sort(x_train[:,2])) #(1.9+3.3)/2=2.6
# #第二次划分
# # print (x_train[y_train!=0].std(axis=0))
# a=np.sort(x_train[:,3])
# x_train2=x_train[y_train!=0]
# x_train3=x_train2[:,3]
# # print(a)
# # print(np.median(a))
#
# #查看对于每一个特征给定一个阈值是不是可以将数据更好的分开
# index=np.argsort(x_train2[:,3])
# print(np.sort(x_train2[:,3]))
# print("--------------------------------")
# print("1.7出现的位置:",np.argwhere(x_train3==1.7))
# c=np.argwhere(x_train3==1.7)
# print("--------------------------------")
# y_train2=y_train[y_train!=0]
# print("1.7的索引对应的目标值:",y_train2[c])
# print(y_train2[index])
#预测
y_hat=clf.predict(x_test)
print(np.mean((y_hat==y_test)))
print(accuracy_score(y_test,y_hat))
#画图&存储
plt.figure(figsize=(18,12))
pic=tree.plot_tree(clf,filled=True,feature_names=names)
plt.savefig("./treegini.jpg")
#对于基尼系数的计算
#39,37,44,totalgini=39/120(1-39/120)+37/120(1-37/1