本章主要涉及的知识点:
1、决策树的基本原理和构造
2、决策树的优势和不足
3、随机森林的基本原理和构造
4、随机森林的优势和不足
一、决策树的基本原理
#导入numpy
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
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.fit(X_train,Y_train)
#定义图像中分区的颜色和散点的颜色
cmap_light=ListedColormap(['#FFAAAA','#FFAAAA','#FFAAAA'])
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()
取不同的深度:
#导入numpy
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
wine=datasets.load_wine()
#只选取数据集的前两个特征
X=wine.data[:,:2]
Y=wine.target
#将数据集拆分为训练集和测试集
X_train,X_test,Y_train,Y_test=train_test_split(X,Y)
#设定决策树分类器最大深度为3
clf2=tree.DecisionTreeClassifier(max_depth=3)
#拟合训练数据集
clf2.fit(X_train,Y_train)
#定义图像中分区的颜色和散点的颜色
cmap_light=ListedColormap(['#FFAAAA','#FFAAAA','#FFAAAA'])
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()
安装库graphviz,帮助我们演示决策树的工作过程,对于读着来书,安装它并不是必须的(pip install graphviz)
#导入工具graphviz工具
import graphviz
#导入决策树中输出graphviz的接口
from sklearn.tree import export_graphviz
#选择最大深度为3的分类模型
export_graphviz(clf3, out_file="wine.dot", class_names=wine.target_names, feature_names=wine.feature_names[:2], impurity=False, filled=True)
#打开这个文件
with open("wine.dot") as f:
dot_graph=f.read()
#显示dot文件中的图形
graphviz.Source(dot_graph)
决策树的不足之处,即使在建模的时候可以使用类似max_depth或是max_leaf_nodes等参数来对决策树进行预剪枝处理,但它还是不可避免会出现过拟合的问题,为了避免这种问题,可以使用集合学习的方法,即随机森林算法。
二、随机森林
不要为了一棵树放弃一篇森林,我们可以让很多的树组成团队来工作,也就是—随机森林。
随机森林有的时候也被称为是随机决策森林,是一种集合的学习方法,即可以用于分类,也可以用于回归。而所谓集合学习算法,就是把很多算法集合到一起,制造出一个更大模型的意思。目前机器学习有很多的集合算法,比较广泛的随机森林(Random Forests)和梯度上升决策树(Gradient Boosted Decision Tree)。
(1)为什么随机森林可以解决过拟合的问题?
1、由于随机随机森林是把不同的几棵决策树打包到一起,每棵树的参数都不相同,然后我们把每棵树预测的结果取平均值。
2、Bootstrap sample生成的数据集和原始数据集在数据量上完全是一样的,但由于进行了重复采样,因此其中有一些数据点会丢失。
#导入随机森林模型
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.fit(X_train,y_train)
#定义图像中分区的颜色和散点的颜色
cmap_light=ListedColormap(['#FFAAAA','#FFAAAA','#FFAAAA'])
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()
总结:随机森林的优势和不足
优势:无论是分类还是回归,随机森林都是应用最广泛的算法之一,随机森林算法不要求对数据进行预处理。
不足:随机森林算法支持并行处理,比较耗时。对超高纬数据集、稀疏数据集来说不太好。但我们可以使用多进程并行处理的方式来解决这个问题,实现方式调节随机森林的n_jobs参数。