机器学习测试笔记(14)——决策树与随机森林(上)

简介: 机器学习测试笔记(14)——决策树与随机森林(上)

1决策树模型


1.1基本概念

决策树类似于我们玩的读心游戏,一个人问问题,另一个人只能回答yes或no。比如:

问:这是个人吗?回答:是

问:是女生吗?回答:不是

问:他戴眼镜吗?回答:是

一直猜出回答者的正确答案。如下图所示。

 

image.png


1.2 信息增益与基尼不纯度

在介绍决策树之前我们先来介绍下信息熵,信息熵是约翰·香农根据热力学第二定律,在 1948《通信的数学原理》一书中提出,主要思想是:一个问题不确定性越大,需要获取的信息就越多,信息熵就越大;一个问题不确定性越小,需要获取的信息就越少,信息熵就越小。比如“小张今天会不会在9:00之前到公司”的信息熵就比“小张今天会不会吃早饭”的信息熵要高,因为小张长久以来没有不吃早饭的习惯。


信息熵是这样定义的:假设集合D中第k类样本的比率为pk,(k=1,2,…|y|)

Ent(D)=

image.png


在决策树中有两个概念:信息增益(Information Gain)和基尼不纯度(Gini impurity)。

信息增益(Information Gain):划分数据前后数据信息熵的差值。

信息增益纯度越高,纯度提升越大;信息增益纯度越低,纯度提升越小。

信息增益使用的是ID3算法(改进后为C4.5算法)。决策树在选取节点的时候,计算每个特征值划分后的信息增益,选取信息增益最大的节点。

基尼不纯度:反映从集合D中随机取两个样本后,其类别不一致性的概率。

 image.png


基尼不纯度使用的是CART算法。决策树在集合中要选取基尼不纯度最小的那个节点。


1.3 Sklearn中的决策树构建

Sklearn中使用sklearn.tree.DecisionTreeClassifier构建决策树分类;from sklearn.tree import DecisionTreeRegressor构建决策树回归。 


import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import tree,datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
def base_of_decision_tree(max_depth):
        wine = datasets.load_wine()
# 仅选前两个特征
        X = wine.data[:,:2]
        y = wine.target
        X_train,X_test,y_train,y_test = train_test_split(X, y)
        clf = DecisionTreeClassifier(max_depth=max_depth)
        clf.fit(X_train,y_train)
#定义图像中分区的颜色和散点的颜色,允许用户使用十六进制颜色码来定义自己所需的颜色库                
        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))
#给每个样本分配不同的颜色, predict:训练后返回预测结果,显示标签值
        Z = clf.predict(np.c_[xx.ravel(),yy.ravel()])
        Z = Z.reshape(xx.shape)
        plt.figure()
# plt.pcolormesh的作用在于能够直观表现出分类边界
        plt.pcolormesh(xx,yy,Z,cmap=cmap_light,shading='auto')
#用散点把样本表示出来
        plt.scatter(X[:,0],X[:,1],c=y,cmap=cmap_bold,s=20,edgecolors='k')
        plt.xlim(xx.min(),xx.max()) 
        plt.ylim(yy.min(),yy.max())
        plt.title("Classifier:(max_depth="+str(max_depth)+")")
        print("红酒数据训练集(max_depth="+str(max_depth)+"):{:.2f}".format(clf.score(X_train,y_train)))
        print("红酒数据测试集(max_depth="+str(max_depth)+"):{:.2f}".format(clf.score(X_test,y_test)))
        plt.show()


 输出

红酒数据训练集(max_depth=1):0.68
红酒数据测试集(max_depth=1):0.69
红酒数据训练集(max_depth=3):0.88
红酒数据测试集(max_depth=3):0.76
红酒数据训练集(max_depth=5):0.90
红酒数据测试集(max_depth=5):0.84


 当为max_depth(即树的深度)为1、3、5的时候,划分如下图: 

image.png


通过图和输出结果,都可以看出,随着max_depth增加,划分越精确( max_depth=1的时候完全是不正确的)。但是我们会发现所有的数据测试集都低于训练集的值,这就是决策树最致命的一点:容易过拟合。


1.4剪枝

解决过拟合的方法是剪枝,预剪枝(Pre-pruning)和后剪枝(post-pruning)。预剪枝及早停止树的增长;后剪枝先形成树,然后再剪枝。Sklearn仅采用预剪枝的策略,预剪枝可以分以下三种方法中的任意一种来解决。


限制最大深度

限制叶节点数最大数目

规定一个节点数据点的最小数目

我们以Sklearn乳腺癌数据采取限制最大深度来看一下防止过拟合的效果。 


from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier
def decision_tree():
    cancer = load_breast_cancer()
    x_train,x_test,y_train,y_test = train_test_split(cancer.data,cancer.target,stratify=cancer.target,random_state=42)
    tree = DecisionTreeClassifier(random_state=0) # 构件树,不剪枝
    tree.fit(x_train,y_train)
    print("不剪枝,训练数据集上的精度:{:.3f}".format(tree.score(x_train,y_train)))
    print("不剪枝,测试数据集上的精度:{:.3f}".format(tree.score(x_test,y_test)))
    print("不剪枝,树的深度:{}".format(tree.get_depth()))
    tree = DecisionTreeClassifier(max_depth=4,random_state=0) # 构件树,剪枝
    tree.fit(x_train,y_train)
    print("剪枝,训练数据集上的精度:{:.3f}".format(tree.score(x_train,y_train)))
    print("剪枝,测试数据集上的精度:{:.3f}".format(tree.score(x_test,y_test)))
    print("剪枝,树的深度:{}".format(tree.get_depth()))


 输出 


不剪枝,训练数据集上的精度:1.000
不剪枝,测试数据集上的精度:0.937
不剪枝,树的深度:7
剪枝,训练数据集上的精度:0.988
剪枝,测试数据集上的精度:0.951
剪枝,树的深度:4


 可见树的深度为7的时候,测试数据集的得分<训练数据集的得分。但是当树的深度为4的时候,测试数据集的得分几乎等于训练数据集的得分。


1.5 决策树的可视化

为了看到可视化的决策树,首先需要下载并且安装一个软件Graphviz的软件,Graphviz 是一款由AT&T Research和Lucent Bell实验室开源的可视化图形工具。然后打开命令行,输入pip3 install graphviz。接下来运行下面代码。


from sklearn.tree import export_graphviz
import graphviz
def show_tree():
    wine = datasets.load_wine()
# 仅选前两个特征
    X = wine.data[:,:2]
    y = wine.target
    X_train,X_test,y_train,y_test = train_test_split(X, y)
    clf = DecisionTreeClassifier(max_depth=3)#为了图片不太大选择max_depth=3
    clf.fit(X_train,y_train) export_graphviz(clf,out_file="wine.dot",class_names=wine.target_names,feature_names=wine.feature_names[:2],impurity=False,filled=True)
#打开dot文件
with open("wine.dot") as f:
        dot_graph = f.read()
    graphviz.Source(dot_graph)


 在本地目录下生成wine.dot文件,用Graphviz软件打开,得到如图图片。

 

image.png

总结一下,决策树的优点是:容易可视化和无需对数据进行预处理;缺点是即使采取剪枝也会造成过拟合。解决这个问题最有利的方法是采用随机森林模型。


2 随机森林模型


2.1基本概念

2001年Breiman把分类树组合成随机森林(Breiman 2001a),即在变量(列)的使用和数据(行)的使用上进行随机化,生成很多分类树,再汇总分类树的结果。随机森林在运算量没有显著提高的前提下提高了预测精度。


算法流程:

构建决策树的个数t,单颗决策树的特征个数f,m个样本,n个特征数据集

1 单颗决策树训练

1.1 采用有放回抽样,从原数据集经过m次抽样,获得有m个样本的数据集(可能有重复样本)

1.2 从n个特征里,采用无放回抽样原则,去除f个特征作为输入特征

1.3 在新的数据集(m个样本, f个特征数据集上)构建决策树

1.4 重复上述过程t次,构建t棵决策树

2 随机森林的预测结果

生成t棵决策树,对于每个新的测试样例,综合多棵决策树预测的结果作为随机森林的预测结果。

  回归问题:取t棵决策树预测值的平均值作为随机森林预测结果

  分类问题:少数服从多数的原则,取单棵的分类结果作为类别随机森林预测结果

在Sklearn中RandomForestClassifier和RandomForestRegressor分类和回归树算法。


2.2 Sklearn中的构建随机森林

from sklearn.ensemble import RandomForestClassifier
def base_of_decision_tree_forest(n_estimator,random_state):
    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=n_estimator, random_state=random_state, n_jobs=2) 
#n_jobs:设置为CPU个数
# 在训练数据集上进行学习
    forest.fit(X_train, y_train)
    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.pcolormesh(xx,yy,Z,cmap=cmap_light,shading='auto’)
  #用散点把样本表示出来
  plt.scatter(X[:,0],X[:,1],c=y,cmap=cmap_bold,s=20,edgecolors='k’)
  plt.xlim(xx.min(),xx.max()) 
  plt.ylim(yy.min(),yy.max())
  print("红酒数据随机森林训练集得分(n_estimators:"+str(n_estimator)+",random_state:"+str(random_state)+"):{:.2f}".format(forest.score(X_train,y_train)))
  print("红酒数据随机森林测试集得分(n_estimators:"+str(n_estimator)+",random_state:"+str(random_state)+"):{:.2f}".format(forest.score(X_test,y_test)))
def tree_forest():
#定义图像中分区的颜色和散点的颜色
    figure,axes = plt.subplots(4,4,figsize =(100,10))
  plt.subplots_adjust(hspace=0.95)
    i = 0
for n_estimator in range(4,8):
for random_state in range(2,6):
            plt.subplot(4,4,i+1)
            plt.title("n_estimator:"+str(n_estimator)+"random_state:"+str(random_state))
            plt.suptitle("Classifier:RandomForest")
            base_of_decision_tree_forest(n_estimator,random_state)
            i = i + 1
    plt.show()


 得到的结果总结如下表。

image.png

image.png


2.3 随机森林避免过拟合

我们以2个月亮数据进行分析。 


import mglearn
def my_RandomForet():
# 生成一个用于模拟的二维数据集
  X, y = datasets.make_moons(n_samples=100, noise=0.25, random_state=3)
# 训练集和测试集的划分
  X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y,random_state=42)
# 初始化一个包含 5 棵决策树的随机森林分类器
  forest = RandomForestClassifier(n_estimators=5, random_state=2)
# 在训练数据集上进行学习
  forest.fit(X_train, y_train)
# 可视化每棵决策树的决策边界
  fig, axes = plt.subplots(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(X_train, y_train, tree, ax=ax)
    print("决策树"+str(i)+"训练集得分:{:.2%}".format(tree.score(X_train,y_train)))
    print("决策树"+str(i)+"测试集得分:{:.2%}".format(tree.score(X_test,y_test)))
# 可视化集成分类器的决策边界
  print("随机森林训练集得分:{:.2%}".format(forest.score(X_train,y_train)))
  print("随机森林测试集得分:{:.2%}".format(forest.score(X_test,y_test)))
  mglearn.plots.plot_2d_separator(forest, X_train, fill=True, ax=axes[-1, -1],alpha=0.4)
  axes[-1, -1].set_title('Random Forest')
  mglearn.discrete_scatter(X_train[:, 0], X_train[:, 1], y_train)
  plt.show()


 输出

image.png

image.png


虽然决策树3不存在过拟合,决策树4的差值与随机森林得分一致,但是随机森林得分比他们都要高。

目录
相关文章
|
14天前
|
缓存 Java 测试技术
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
使用JMeter对项目各个接口进行压力测试,并对前端进行动静分离优化,优化三级分类查询接口的性能
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
|
19天前
|
机器学习/深度学习 算法 Python
从菜鸟到大师:一棵决策树如何引领你的Python机器学习之旅
【9月更文挑战第9天】在数据科学领域,机器学习如同璀璨明珠,吸引无数探索者。尤其对于新手而言,纷繁复杂的算法常让人感到迷茫。本文将以决策树为切入点,带您从Python机器学习的新手逐步成长为高手。决策树以其直观易懂的特点成为入门利器。通过构建决策树分类器并应用到鸢尾花数据集上,我们展示了其基本用法及效果。掌握决策树后,还需深入理解其工作原理,调整参数,并探索集成学习方法,最终将所学应用于实际问题解决中,不断提升技能。愿这棵智慧之树助您成为独当一面的大师。
23 3
|
20天前
|
人工智能 测试技术 PyTorch
AI计算机视觉笔记二十四:YOLOP 训练+测试+模型评估
本文介绍了通过正点原子的ATK-3568了解并实现YOLOP(You Only Look Once for Panoptic Driving Perception)的过程,包括训练、测试、转换为ONNX格式及在ONNX Runtime上的部署。YOLOP由华中科技大学团队于2021年发布,可在Jetson TX2上达到23FPS,实现了目标检测、可行驶区域分割和车道线检测的多任务学习。文章详细记录了环境搭建、训练数据准备、模型转换和测试等步骤,并解决了ONNX转换过程中的问题。
|
20天前
|
人工智能 计算机视觉
AI计算机视觉笔记十五:编写检测的yolov5测试代码
该文为原创文章,如需转载,请注明出处。本文作者在成功运行 `detect.py` 后,因代码难以理解而编写了一个简易测试程序,用于加载YOLOv5模型并检测图像中的对象,特别是“人”类目标。代码实现了从摄像头或图片读取帧、进行颜色转换,并利用YOLOv5进行推理,最后将检测框和置信度绘制在输出图像上,并保存为 `result.jpg`。如果缺少某些模块,可使用 `pip install` 安装。如涉及版权问题或需获取完整代码,请联系作者。
|
20天前
|
机器学习/深度学习 人工智能 文字识别
AI计算机视觉笔记二十:PaddleOCR环境搭建及测试
OCR技术广泛应用于日常生活中,与人脸识别一样常见。PaddleOCR是一个基于飞桨的OCR工具库,具有超轻量级中文OCR模型,支持中英文数字组合、竖排及长文本识别。本文档详细介绍了PaddleOCR的学习过程,包括环境搭建、安装、样本标注及测试步骤。使用AutoDL云平台进行环境创建,并提供了详细的命令行操作指南,帮助用户顺利完成PaddleOCR的部署与测试。
|
21天前
|
机器学习/深度学习 算法 Python
决策树下的智慧果实:Python机器学习实战,轻松摘取数据洞察的果实
【9月更文挑战第7天】当我们身处数据海洋,如何提炼出有价值的洞察?决策树作为一种直观且强大的机器学习算法,宛如智慧之树,引领我们在繁复的数据中找到答案。通过Python的scikit-learn库,我们可以轻松实现决策树模型,对数据进行分类或回归分析。本教程将带领大家从零开始,通过实际案例掌握决策树的原理与应用,探索数据中的秘密。
29 1
|
26天前
|
机器学习/深度学习 算法 前端开发
R语言基础机器学习模型:深入探索决策树与随机森林
【9月更文挑战第2天】决策树和随机森林作为R语言中基础且强大的机器学习模型,各有其独特的优势和适用范围。了解并熟练掌握这两种模型,对于数据科学家和机器学习爱好者来说,无疑是一个重要的里程碑。希望本文能够帮助您更好地理解这两种模型,并在实际项目中灵活应用。
|
27天前
|
机器学习/深度学习 人工智能 数据处理
AI计算机视觉笔记六:mediapipe测试
MediaPipe是由Google Research开发并开源的多媒体机器学习框架,已被集成到YouTube、Google Lens等重要产品中。该框架支持多种功能,如物体检测、自拍分割、头发分割、人脸检测、手部检测及运动追踪等。本文档将指导你通过Python环境搭建与测试MediaPipe,包括创建虚拟环境、安装依赖库,并进行手指骨骼识别测试。具体步骤涵盖环境配置、摄像头数据处理及结果显示。
|
27天前
|
人工智能 PyTorch 算法框架/工具
AI计算机视觉笔记十四:YOLOV5环境搭建及测试全过程
本文详细记录了在Windows 10环境下从零开始搭建yolov5环境并进行测试的全过程,涵盖环境配置、依赖安装及模型测试等关键步骤。文章首先介绍了所需环境(Python 3.8、yolov5-5.0),接着详细说明了如何使用Miniconda3创建与激活虚拟环境,并通过具体命令演示了如何下载安装yolov5及相关依赖库。最后,通过一系列命令展示了如何下载预训练模型并对示例图像进行目标检测,同时解决了一些常见错误。适合初学者跟随实践。如需转载,请注明原文出处。
|
1月前
|
机器学习/深度学习 算法
【机器学习】SVM面试题:简单介绍一下SVM?支持向量机SVM、逻辑回归LR、决策树DT的直观对比和理论对比,该如何选择?SVM为什么采用间隔最大化?为什么要将求解SVM的原始问题转换为其对偶问题?
支持向量机(SVM)的介绍,包括其基本概念、与逻辑回归(LR)和决策树(DT)的直观和理论对比,如何选择这些算法,SVM为何采用间隔最大化,求解SVM时为何转换为对偶问题,核函数的引入原因,以及SVM对缺失数据的敏感性。
57 3