本文不讲原理,直接调库上代码。
个人建议先用jupyter逐步操作,了解每步代码的功能,更易理解。
import numpy as np import pandas as pd from sklearn.datasets import load_wine#导入红酒数据集 from sklearn import tree#后续决策树可视化 from sklearn.tree import DecisionTreeClassifier#引入决策树分类器 from sklearn.metrics import accuracy_score#引入决策树评分器 from sklearn.model_selection import train_test_split#数据集拆分 import matplotlib.pyplot as plt
wines = load_wine()#导入数据集 # wines #可查看该数据集中的所有内容
#后续需要用到的信息 wines_data = wines.data#数据集数据 wines_target = wines.target#数据集标签 wines_feature_names = wines.feature_names#数据集特征名称 wine_target_names = wines.target_names#数据集类别名
#将数据集中的特折与标签匹配,转为DataFrame结构 dataset = pd.DataFrame(wines_data,columns=wines_feature_names) dataset['class'] = wines_target dataset.shape
#拆分训练集和测试集,比例为7:3,随机种子为42 X = dataset.iloc[:,:-1] y = dataset.iloc[:,-1] Xtrain,Xtest,ytrain,ytest = train_test_split(X,y,random_state=42,test_size=0.3)
#初始化分类器,训练,括号中的为各类超参数,可自行调试 clf = DecisionTreeClassifier(criterion="entropy"#可以不用此参数,默认为基尼系数 ,random_state=30 ,max_depth = 3 # ,min_samples_split = 10 # ,min_samples_leaf = 5 ) clf.fit(Xtrain,ytrain) #测试分类器 clf.score(Xtest,ytest)
scores = [] for i in range(5): clf = DecisionTreeClassifier(criterion="entropy"#可以不用此参数,默认为基尼系数 ,random_state=30 ,max_depth = i+1 # ,min_samples_split = 10 # ,min_samples_leaf = 5 ) clf.fit(Xtrain,ytrain) #测试分类器 scores.append(clf.score(Xtest,ytest)) plt.plot(scores,c = "r",label = "max_depth") plt.legend() plt.show() print(scores)
#获取测试集预测指标,方便自己计算性能标准 clf.predict(Xtest)
#决策树绘制 plt.figure(figsize=(16,10)) tree.plot_tree(clf#输入决策树数据 ,node_ids = True#给节点编号 ,feature_names = wines_feature_names#设置特征名称 ,class_names = wine_target_names#设置分类名称 ,fontsize = 12#设置字体大小 ,rounded = True ,filled = True#填充颜色 ) # plt.savefig("红酒决策树.png") plt.show()
#了解各个特征对决策树结果的支持情况 [*zip(wines_feature_names,clf.feature_importances_)]
本文的最终分类得分:0.96296296296296291
该数据集经过合理拆分可以得到98%以上的分类成功率。
最终的决策树如图:
最后来一个完整的代码文件,但是用的是另一个数据集(iris)
import numpy as np import pandas as pd from matplotlib import pyplot as plt from math import log from sklearn.tree import DecisionTreeClassifier#导入决策树分类器 from sklearn import tree # 这里直接引入sklearn里的数据集,iris鸢尾花 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 切分数据集为训练集和测试集 from sklearn.metrics import accuracy_score # 计算分类预测的准确率 iris = load_iris() #data,target,feature_names # iris.feature_names dataset = pd.DataFrame(data=iris.data,columns=iris.feature_names) dataset['class'] = iris.target #特征名称 feature_names = iris.feature_names #数据集类别 target_names = iris.target_names # dataset X = dataset.iloc[:,:-1] y = dataset.iloc[:,-1] print(type(dataset)) #调用决策树进行训练 clf = DecisionTreeClassifier() # clf.fit(iris.data,iris.target) clf.fit(X,y) # clf.score(iris.data,iris.target) plt.figure(figsize=(16,8)) tree.plot_tree(clf,node_ids=True,feature_names=feature_names,class_names=target_names,fontsize=12) plt.savefig("决策树.png")#保存图片 plt.show()
结束啦!!!