sklearn入门——分类树及其剪枝参数调优
# 1.sklearn.datasets里面包含大量的数据和数据集,load_wine就是其中的一个数据集 # 2.sklearn.model_selction包含训练集测试集划分的函数train_test_split # 3.criterion:确定不纯度的计算方法 # 4.random_state,splitter确定模型的随机性,前者的值可以随便写,后者值为best和random # 5.max_depth:确定树最大的层数 # 6.min_samples_leaf:当其值为10时,父节点下的每一个子节点的值都要满足10, # 否则该父节点下的所有子节点将被剪掉,但sklearn会自动调整,使其满足条件而不被剪掉 # 7.min_samples_split:当其值设为20时,只有当节点的值满足20才会分支 # 8.fit:训练接口,对训练数据进行训练 # 9.score:对测试数据进行测试并得出测试结果 # 9.import graphviz:用来画图的包 # 10.fiiled:把划分的书的节点填充颜色 # 11.rounded:使节点的外部轮廓为半圆形 #分类树:导入相关包 from sklearn import tree from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split wine=load_wine() #train_test_split #建立模型 Xtrain,Xtest,Ytrain,Ytest=train_test_split(wine.data,wine.target,test_size=0.3) clf=tree.DecisionTreeClassifier(criterion="entropy" ,random_state=30 #,splitter="random" #,max_depth=5 # ,min_samples_leaf=20 #,min_samples_split=29
) clf=clf.fit(Xtrain,Ytrain) score=clf.score(Xtest,Ytest) score #画一棵树 import graphviz feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚' ,'类黄酮','非黄烷类酚类','花青素','颜 色强度','色调','稀释葡萄酒','脯氨酸'] dot_data=tree.export_graphviz(clf ,out_file=None ,feature_names=feature_name ,class_names=["琴酒","雪莉","贝尔摩德"] ,filled=True ,rounded=True ) graph=graphviz.Source(dot_data) graph
生成的决策树:
1.查看wine数据
2.查看数据:wine.data
3.查看wine的target数据
4.导入pandas,把数据data和target连接成一个表
import pandas as pd
pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)
5.查看标签的名字:wine.target_names
6.查看特征的名字:wine.feature_names
7.查看数据data的大小,维度:178行13列
wine.data.shape
8.查看target_names的结构
9.查看特征名:wine.feature_names
10.导入feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚'
,'类黄酮','非黄烷类酚类','花青素','颜 色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
11.查看每一个节点在树的划分中起到的重要性
12.把用到的节点与其重要性连接起来
13.查看训练和测试的得分:
#确定最优的剪枝参数:使用超参数曲线 #确定最优的剪枝参数:使用超参数曲线 #确定最优的剪枝参数:使用超参数曲线 #确定最优的剪枝参数:使用超参数曲线 #pyplot:用来画图 #plt.legend():显示图列 ---max_depth #plt.show:显示图片 import matplotlib.pyplot as plt test=[] for i in range(10): clf=tree.DecisionTreeClassifier(criterion="entropy" ,max_depth=i+1 ,random_state=30 ,splitter="random") clf=clf.fit(Xtrain,Ytrain) score=clf.score(Xtest,Ytest) test.append(score) plt.plot(range(1,11),test,color="red",label="max_depth") plt.legend() plt.show()
apply返回每个测试样本所在的叶子节点的索引
predict返回每个测试样本的分类/回归结果