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()

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

相关推荐
算AI1 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
JavaEdge在掘金1 小时前
ssl.SSLCertVerificationError报错解决方案
python
我不会编程5552 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
老歌老听老掉牙2 小时前
平面旋转与交线投影夹角计算
python·线性代数·平面·sympy
满怀10152 小时前
Python入门(7):模块
python
无名之逆2 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
你觉得2052 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
大数据·人工智能·python·gpt·学习·机器学习·aigc
啊喜拔牙2 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
hyshhhh3 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
__lost3 小时前
Pysides6 Python3.10 Qt 画一个时钟
python·qt