PYTHON基础:决策树与随机森林算法

决策树与随机森林算法

决策树和随机森林都是用于分类和回归的的算法。决策树的原理是通过一系列的问题进行if、else的推导。随机森林是集合学习算法,即把很多的机器学习算法综合在一起组成一个更大的模型。

决策树的优劣势:处理容易,不需要对数据进行转化、预处理。但容易出现过拟合。

随机森林的优劣势:最广泛的使用算法之一,不需要对数据进行预处理,不需要对参数调节,可以并行处理。集成了决策树所有的优点并且弥补了决策树的不足。但是在处理超高维度数据集、稀疏数据集效果非常差

我们通过倒入数据库中下载好的数据来演示算法的过程,我们把数据导入然后做成训练集和数据集。

javascript 复制代码
#导入numpy
import numpy as np 
#画图
import matplotlib.pyplot as plt 
from matplotlib.colors import ListedColormap
#导入树和数据集
from sklearn import tree,datasets
#拆分工具
from sklearn.model_selection import train_test_split 
wine=datasets.load_wine()
#选取前两个特征
X=wine.data[:,:2]
y=wine.target
#拆分训练和测试集
X_train,X_test,y_train,y_test=train_test_split(X,y)

数据集准备好,现在用分类器进行分类

javascript 复制代码
#设定决策树分类器最大深度为1
clf=tree.DecisionTreeClassifier(max_depth=1)
#拟合训练数据集
clf.fit(X_train,y_train)

这个运行的结果,反应了一个很重要的参数max_depth,这个是指决策树的深度,我们问题数量越多,决策树的深度越深,模拟的越好。

DecisionTreeClassifier(max_depth=1)

javascript 复制代码
#定义图像的分区颜色和点的颜色
cmap_light=ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF'])
cmap_bold=ListedColormap(['#FF0000','#00FF00','#0000FF'])
#分别用样本的两个特证值创建了横轴和纵轴
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()

图片运行出来后如下图。这个时候大多数的点没有得到分类,效果不太好,这个可以通过提高深度让效果更好。

javascript 复制代码
clf2=tree.DecisionTreeClassifier(max_depth=3)
clf2.fit(X_train,y_train)

运行的结果的确是深度是3

DecisionTreeClassifier(max_depth=3)

这里用的代码和上面是一样的,功能是用于画图,后面就不反复打注释了。

javascript 复制代码
cmap_light=ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF'])
cmap_bold=ListedColormap(['#FF0000','#00FF00','#0000FF'])
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=clf2.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=3)")
plt.show()

现在已经到三个深度了,分类可以进行3个分类的识别,还是有小部分没有正确分类

javascript 复制代码
clf3=tree.DecisionTreeClassifier(max_depth=5)
clf3.fit(X_train,y_train)

DecisionTreeClassifier(max_depth=5)

javascript 复制代码
cmap_light=ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF'])
cmap_bold=ListedColormap(['#FF0000','#00FF00','#0000FF'])
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=clf3.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=5)")
plt.show()

在深度为5的时候确实从图像中看出分类器的表现更好了。

随机森林

这里我们使用一些库中带来的数据,这里我们使用红酒的数据来演示算法

javascript 复制代码
#导入随机森林模型
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)
#设定随机森林中有六颗树
forest=RandomForestClassifier(n_estimators=6,random_state=3)
#拟合
forest.fit(X_train,y_train)

RandomForestClassifier(n_estimators=6, random_state=3)

javascript 复制代码
cmap_light=ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF'])
cmap_bold=ListedColormap(['#FF0000','#00FF00','#0000FF'])
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:RandomForest")
plt.show()

根据我们画出的结果可以看出,这次拟合的效果要更好更加细腻

相关推荐
wwww.bo8 分钟前
机器学习(决策树)
算法·决策树·机器学习
倔强青铜三8 分钟前
苦练Python第39天:海象操作符 := 的入门、实战与避坑指南
人工智能·python·面试
辞--忧13 分钟前
深入浅出决策树
算法·决策树·机器学习
Y2003091613 分钟前
决策树总结
算法·决策树·机器学习
lynn8570_blog13 分钟前
低端设备加载webp ANR
前端·算法
图灵学术计算机论文辅导1 小时前
论文推荐|迁移学习+多模态特征融合
论文阅读·人工智能·深度学习·计算机网络·算法·计算机视觉·目标跟踪
一百天成为python专家1 小时前
Python循环语句 从入门到精通
开发语言·人工智能·python·opencv·支持向量机·计算机视觉
Sunhen_Qiletian1 小时前
朝花夕拾(五)--------Python 中函数、库及接口的详解
开发语言·python
threejs源码翻译官2 小时前
显微镜图像处理【优化】- 使用图像风格迁移技术放大图像细节
算法
三年呀2 小时前
标题:移动端安全加固:发散创新,筑牢安全防线引言:随着移动互联网
网络·python·安全