🐖上次学习了sklearn中的线性回归API有兴趣的同学可以查看下面的链接👇:

🌌今天我们要学习的内容是决策树,决策树是概率模型,主要有ID3、C4.5和CART树,sklearn中只有ID3和CART树,决策树是很非常重要的分类和回归算法,以及衍生出来的集成算法都是很重要的算法。

1.决策树的API

首先介绍决策树的API,树的种类由criterion参数决定

from sklearn.tree import DecisionTreeClassifier

有关的参数可以参考文章
决策树的参数: 决策树API详解.

2.决策树实例

我们使用sklearn中红酒数据集来进行决策树的分类任务。说明一下,红酒数据集有13个特征,178行数据,3类数据。
导入数据

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
#导入tree模型和数据集加载工具
from sklearn import tree,datasets
#导入数据拆分工具
from sklearn.model_selection import train_test_split
#d导入数据集
wine=datasets.load_wine()
#只读取数据集的前两个特征
x=wine.data[:,:2]
y=wine.target
#将数据拆分成训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(x,y)

决策树模型

#设置决策树分类器最大深度为1
clf=tree.DecisionTreeClassifier(max_depth=1)
#拟合数据
clf=clf.fit(x_train,y_train)

结果展示了该模型的参数:
在这里插入图片描述
看看分类效果

cmap_light=ListedColormap(["#FFAAAA","#AAFFAA","#AAAAFF"])
cmap_bold=ListedColormap(["#FF0000","#00FF00","#0000FF"])
#用X的两个特征作为X,Y轴画图
x_min,x_max=x_train[:,0].min()-1,x_train[:,0].max()+1
y_min,y_max=x_train[:,1].min()-1,x_train[:,1].max()+1
xx,yy=np.meshgrid(np.arange(x_min,x_max,.02),np.arange(y_min,y_max,.02))
z=clf.predict(np.c_[xx.ravel(),yy.ravel()])
#给每个分类中的样本分配不同的颜色
z=z.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx,yy,z,cmap=cmap_light)
#用散点图把样本画出来
plt.scatter(x[:,0],x[:,1],c=y,cmap=cmap_bold,edgecolor="k",s=20)
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title("Classifier:(max_depth=1)")
plt.show()

一层深度的决策树效果很差:大家可以设置max_depth参数决定决策树的深度。
在这里插入图片描述

3.保存决策树模型

使用graphviz包可以保存决策树模型

import graphviz
#导入接口
from sklearn.tree import export_graphviz
#选择最大深度3的分类模型
export_graphviz(clf,out_file="C:\\Users\\Administrator\\Desktop\\资料\\wine.dot",class_names=wine.target_names,feature_names=wine.feature_names[:2],impurity=False,filled=True)
#打开一个dot文件
with open("C:\\Users\\Administrator\\Desktop\\资料\\wine.dot") as f:
  dot_graph=f.read()
#显示dot文件图像
graphviz.Source(dot_graph)

4.随机森林

决策树的API

#随机森林
from sklearn.ensemble import RandomForestClassifier

随机森林在红酒上的分类

#随机森林
from sklearn.ensemble import RandomForestClassifier
#导入红酒数据集
wine=datasets.load_wine()
#选择前两个特征
#只读取数据集的前两个特征
x=wine.data[:,:2]
y=wine.target
#将数据拆分成训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(x,y)
#构建模型6棵树
forest=RandomForestClassifier(n_estimators=6,random_state=3)
#使用模型拟合数据
forest=forest.fit(x_train,y_train)
forest

结果如下:bootstrap代表有放回抽样
在这里插入图片描述
看看分类效果

cmap_light=ListedColormap(["#FFAAAA","#AAFFAA","#AAAAFF"])
cmap_bold=ListedColormap(["#FF0000","#00FF00","#0000FF"])
#用X的两个特征作为X,Y轴画图
x_min,x_max=x_train[:,0].min()-1,x_train[:,0].max()+1
y_min,y_max=x_train[:,1].min()-1,x_train[:,1].max()+1
xx,yy=np.meshgrid(np.arange(x_min,x_max,.02),np.arange(y_min,y_max,.02))
z=forest.predict(np.c_[xx.ravel(),yy.ravel()])
#给每个分类中的样本分配不同的颜色
z=z.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx,yy,z,cmap=cmap_light)
#用散点图把样本画出来
plt.scatter(x[:,0],x[:,1],c=y,cmap=cmap_bold,edgecolor="k",s=20)
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title("Classifier:(max_depth=1)")
plt.show()

在这里插入图片描述

参考资料

《深入浅出python机器学习》
《统计学习方法》

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐