数据说明
-
4个变量,分别为:
'feature_names': ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
-
分类类标有:
'setosa', 'versicolor', 'virginica'
三种花型import matplotlib.pyplot as plt import numpy as np from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier #载入数据 iris=load_iris()
-
如果下载的数据是txt文件存储的,类似如下图,需要对分类标签数值化,用到函数LabelEncoder进行标签编码:
import pandas as pd from sklearn.tree import DecisionTreeClassifier import sklearn.preprocessing as sp from sklearn.model_selection import train_test_split import numpy as np data=pd.read_table(r'G:\机器学习\书籍阅读\python爬虫\iris.txt',sep=',',header=None) #数据导入 category = pd.Categorical(data[4]) lab = sp.LabelEncoder() #标签编码器 type_d = lab.fit_transform(data[4]) #用标签编码器对样本编码 X=list(zip(data[0],data[1],data[2],data[3]))
数据划分
-
方法一
利用Numpy库中的concatenate()函数,对数据进行选择。#没有一一列举,举一个使用方法 train_data=np.concatenate((np.array(X)[0:40,:],np.array(X)[50:90,:],np.array(X)[100:140,:]),axis=0)
-
方法二
导入模块,随机选择多少比例from sklearn.model_selection import train_test_split X_tr,X1_te,type_tr,type1_te= train_test_split(X, type_d,test_size=0.2) #训练集占80%,测试集占20%
模型训练及评估
模型训练代码
clf=DecisionTreeClassifier()
clf.fit(X_tr, type_tr)
score=clf.score(X1_te,type1_te) #正确率
pre_data=clf.predict(X1_te) #对测试集数据,预测其类别标签
模型大致评估
-
检测数据与预测数据比较
方法一:cop=sum(type1_te==pre_data) #求出模型预测测试集正确个数
方法二:#使用循环结构求解模型预测测试集正确个数 for i in range(len(pre_data)): if pre_data[i]==type1_te[i]: a=1 compare.append(a) else: a=0 compare.append(a)
-
性能评估
#输出准确率,召回率,F特征值和支持度 from sklearn import metrics from sklearn.tree import export_graphviz # 导入的是一个函数 a=metrics.classification_report(type1_te,pre_data) b=metrics.confusion_matrix(type1_te,pre_data)
树状图绘制
Graphviz安装配置及入门
-
安装包下载:graphviz-2.38.msi
with open('G:/机器学习/书籍阅读/iris.dot', 'w', encoding='utf-8') as f: f = export_graphviz(clf, out_file=f,filled=True,rounded=True) #filled=True,rounded=True :前面一个设置是填充颜色,后面一个是圆形框
-
使用下面这个软件打开iris.dot文件
-
决策树的效果图
代码汇总
"决策树"
#分类及回归树(CART)、ID3算法、C4.5算法,随机森林算法,梯度推进机(GBM)
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
import sklearn.preprocessing as sp
from sklearn.model_selection import train_test_split
import numpy as np
data=pd.read_table(r'G:\机器学习\书籍阅读\python爬虫\iris.txt',sep=',',header=None)
category = pd.Categorical(data[4])
lab = sp.LabelEncoder() #标签编码器
type_d = lab.fit_transform(data[4]) #用标签编码器对样本编码
clf=DecisionTreeClassifier()
X=list(zip(data[0],data[1],data[2],data[3]))
#数据集划分 方法一
X_tr,X1_te,type_tr,type1_te= train_test_split(X, type_d,test_size=0.2)
#方法二划分数据集
train_data=np.concatenate((np.array(X)[0:40,:],np.array(X)[50:90,:],np.array(X)[100:140,:]),axis=0)
clf.fit(X_tr, type_tr)
score=clf.score(X1_te,type1_te)
pre_data=clf.predict(X1_te)
#检测数据与预测数据比较
#方法一
all=sum(type1_te==pre_data)
# 方法二
compare=[]
for i in range(len(pre_data)):
if pre_data[i]==type1_te[i]:
a=1
compare.append(a)
else:
a=0
compare.append(a)
#输出准确率,召回率,F特征值和支持度
from sklearn import metrics
from sklearn.tree import export_graphviz # 导入的是一个函数
a=metrics.classification_report(type1_te,pre_data)
b=metrics.confusion_matrix(type1_te,pre_data)
with open('G:/机器学习/书籍阅读/iris.dot', 'w', encoding='utf-8') as f:
f = export_graphviz(clf, out_file=f,filled=True,rounded=True)