监督学习:决策树

决策树是广泛用于分类和回归任务的模型。本质上,它从一层层的if/else 问题中进行学 习,并得出结论。学习决策树,就是学习一系列 if/else 问题,使我们能够以最快的速度得到正确答案。在机器 学习中,这些问题叫作测试(不要与测试集弄混,测试集是用来测试模型泛化性能的数据)或者你可以将每个测 试看成沿着一条轴对当前数据进行划分。这是一种将算法看作分层划分的观点。由于每个 测试仅关注一个特征,所以划分后的区域边界始终与坐标轴平行。对数据反复进行递归划分,直到划分后的每个区域(决策树的每个叶结点)只包含单一目 标值(单一类别或单一回归值)。如果树中某个叶结点所包含数据点的目标值都相同,那 么这个叶结点就是纯的。
决策树的一个主要缺点在于经常对训练数据过拟合。随机森林是解决这个 问题的一种方法。随机森林本质上是许多决策树的集合,其中每棵树都和其他树略有不 同。随机森林背后的思想是,每棵树的预测可能都相对较好,但可能对部分数据过拟合。 如果构造很多树,并且每棵树的预测都很好,但都以不同的方式过拟合,那么我们可以对 这些树的结果取平均值来降低过拟合。
想要构造一棵树,首先要对数据进行自助采样。也就是说,从 n_samples 个数据点中有放回地(即同一样本可以被多次抽取)重 复随机抽取一个样本,共抽取 n_samples 次。这样会创建一个与原数据集大小相同的数据 集,但有些数据点会缺失(大约三分之一),有些会重复。

import matplotlib.pyplot as plt
import mglearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_moons
x,y=make_moons(n_samples=100,noise=0.25,random_state=3)
xTrain,xTest,yTrain,yTest = train_test_split(x,y,stratify=y,random_state=42)
forest=RandomForestClassifier(n_estimators=5,random_state=5)
forest.fit(xTrain,yTrain)
fig,axes=plt.subplot(2,3,figsize=(20,10))
for i , (ax,tree) in enumerate(zip(axes.ravel(),forest.estimators_)):	
    ax.set_title("tree {}".format(i))
    mglearn.plots.plot_tree_partition(xTrain,yTrain,tree,ax=ax)
mglearn.plots.plot_2d_separator(forest,xTrain,fill=True,ax=axes[-1,-1],alpha=0.4)
axes[-1,-1].set_title("Random Forest")
mglearn.discrete_scatter(xTrain[:,0],xTrain[:,0],yTrain)

监督学习:决策树