文章目录

  • 分类算法-决策树
    • 认识决策树
    • 信息熵
    • 决策树的划分一句之一:信息增益
      • 信息增益的计算
      • 算法案例-泰坦尼克号乘客生存分类模型
      • 决策树的优缺点以及改进
  • 集成学习方法-随机森林
    • 什么是随机森林
    • 算法实例-泰坦尼克号乘客生存分类模型 随机森林做法
    • 随机森林的优点
    • 随机森林的优点

分类算法-决策树

关于机器学习开发流程等知识可见:机器学习 入门详细解析(一)开发流程\sklearn\k近邻算法\朴素贝叶斯算法\交叉验证

认识决策树

  • 决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法

  • 银行贷款数据

  • 如何去划分是否能得到贷款?

    • 决策树的实际划分

  • 信息的度量和作用

    • 问:每猜一次给一块钱,告诉我是否猜对了,那么我需要掏多少钱才能知道谁是冠军?

      答:我可以把球编上号,从1到32,然后提问:冠 军在1-16号吗?依次询问,只需要五次,就可以知道结果。

  • 1948年,香农发表了划时代的论文——通信的数学原理,奠定了现代信息论的基础信息的单位:比特。

    •  32支球队,log32 = 5 比特64支球队,log64 = 6 比特
      

信息熵

谁是世界杯冠军”的信息量应该比5比特少。香农指出,它的准确信息量应该是:
H=−(p1∗logp1+p2∗logp2+...+p32log32)H = -(p1*logp1 + p2*logp2 + ... + p32log32) H=−(p1∗logp1+p2∗logp2+...+p32log32)

  • H的专业术语称之为信息熵,单位为比特。**

  • 公式:

  • 当这32支球队夺冠的几率相同时,对应的信息熵等于5比特

  • 信息和消除不确定性是相联系的

决策树的划分一句之一:信息增益

特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差,即公式为:

  • 注:信息增益表示得知特征X的信息而使得类Y的信息的不确定性减少的程度

信息增益的计算

常见决策树使用的算法

  • ID3 信息增益 最大的准则

  • C4.5 信息增益比 最大的准则

  • CART

    • 回归树: 平方误差 最小

    • 分类树: 基尼系数 最小的准则 在sklearn中可以选择划分的原则

sklearn决策树API

class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)
# 决策树分类器
# criterion:默认是’gini’系数,也可以选择信息增益的熵’entropy’
# max_depth:树的深度大小
# random_state:随机数种子# method:
# decision_path:返回决策树的路径

算法案例-泰坦尼克号乘客生存分类模型

在泰坦尼克号和titanic2数据帧描述泰坦尼克号上的个别乘客的生存状态。在泰坦尼克号的数据帧不包含从剧组信息,但它确实包含了乘客的一半的实际年龄。关于泰坦尼克号旅客的数据的主要来源是百科全书Titanica。这里使用的数据集是由各种研究人员开始的。其中包括许多研究人员创建的旅客名单,由Michael A. Findlay编辑。我们提取的数据集中的特征是票的类别,存活,乘坐班,年龄,登陆,home.dest,房间,票,船和性别。乘坐班是指乘客班(1,2,3),是社会经济阶层的代表。其中age数据存在缺失。

分析步骤

1、pd读取数据
2、选择有影响的特征,处理缺失值
3、进行特征工程,pd转换字典,特征抽取  x_train.to_dict(orient="records")
4、决策树估计器流程

决策树的结构、本地保存

# 1、sklearn.tree.export_graphviz() 该函数能够导出DOT格式
tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])# 2、工具:(能够将dot文件转换为pdf、png)
#安装graphviz
ubuntu:sudo apt-get install graphviz                    Mac:brew install graphviz# 3、运行命令
# 然后我们运行这个命令
$ dot -Tpng tree.dot -o tree.png

代码示例

from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.model_selection import train_test_split, GridSearchCV
import pandas as pddef decision():"""决策树对泰坦尼克号进行预测生死:return: None"""# 获取数据titan = pd.read_csv("./data/titanic/train.csv")# 处理数据,找出特征值和目标值x = titan[['Pclass', 'Age', 'Sex']]y = titan['Survived']# 缺失值处理x['Age'].fillna(x['Age'].mean(), inplace=True)# 分割数据集到训练集合测试集x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)# 进行处理(特征工程)特征-》类别-》one_hot编码dict = DictVectorizer(sparse=False)print(dict)x_train = dict.fit_transform(x_train.to_dict(orient="records"))print(dict.get_feature_names())x_test = dict.transform(x_test.to_dict(orient="records"))print(x_train)#用决策树进行预测dec = DecisionTreeClassifier()dec.fit(x_train, y_train)# 预测准确率print("预测的准确率:", dec.score(x_test, y_test))# 导出决策树的结构export_graphviz(dec, out_file="./tree.dot", feature_names=['年龄', 'Pclass=1st', 'Pclass=2nd', 'Pclass=3rd', '女性', '男性'])return Noneif __name__ == "__main__":decision()

结果:

DictVectorizer(sparse=False)
['Age', 'Pclass=1st', 'Pclass=2nd', 'Pclass=3rd', 'Sex=female', 'Sex=male']
[[17.  0.  0.  1.  0.  1.][19.  0.  0.  1.  1.  0.][50.  1.  0.  0.  0.  1.]...[ 2.  0.  0.  1.  0.  1.][18.  0.  0.  1.  0.  1.][45.  1.  0.  0.  0.  1.]]
预测的准确率: 0.8295964125560538

决策树效果图:

决策树的优缺点以及改进

  • 优点:

    • 简单的理解和解释,树木可视化。
    • 需要很少的数据准备,其他技术通常需要数据归一化,
  • 缺点:

    • 决策树学习者可以创建不能很好地推广数据的过于复杂的树,这被称为过拟合。
    • 决策树可能不稳定,因为数据的小变化可能会导致完全不同的树被生成
  • 改进:

    • 减枝cart算法
    • 随机森林

集成学习方法-随机森林

集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测。

什么是随机森林

定义:在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。

  • 例如, 如果你训练了5个树, 其中有4个树的结果是True, 1个数的结果是False, 那么最终结果会是True.

学习算法:根据下列算法而建造每棵树

  • 用N来表示训练用例(样本)的个数,M表示特征数目。
  • 输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M。
  • 从N个训练用例(样本)中以有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。

为什么要随机抽样训练集?

  • 如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的

为什么要有放回地抽样?

  • 如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是“有偏的”,都是绝对“片面的”(当然这样说可能不对),也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决。

集成学习API

class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’,max_depth=None, bootstrap=True, random_state=None)
# 随机森林分类器
# n_estimators:integer,optional(default = 10) 森林里的树木数量
# criteria:string,可选(default =“gini”)分割特征的测量方法
# max_depth:integer或None,可选(默认=无)树的最大深度
# bootstrap:boolean,optional(default = True)是否在构建树时使用放回抽样 

算法实例-泰坦尼克号乘客生存分类模型 随机森林做法

from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.feature_extraction import DictVectorizer
from sklearn.ensemble import RandomForestClassifier
import pandas as pddef decision():"""决策树对泰坦尼克号进行预测生死:return: None"""# 获取数据titan = pd.read_csv("./data/titanic/train.csv")# 处理数据,找出特征值和目标值x = titan[['Pclass', 'Age', 'Sex']]y = titan['Survived']#print(x)# 缺失值处理x['Age'].fillna(x['Age'].mean(), inplace=True)# 分割数据集到训练集合测试集x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)# 进行处理(特征工程)特征-》类别-》one_hot编码dict = DictVectorizer(sparse=False)print(dict)x_train = dict.fit_transform(x_train.to_dict(orient="records"))print(dict.get_feature_names())x_test = dict.transform(x_test.to_dict(orient="records"))# 随机森林进行预测 (超参数调优)rf = RandomForestClassifier(n_jobs=-1)param = {"n_estimators": [120, 200, 300, 500, 800, 1200], "max_depth": [5, 8, 15, 25, 30]}# 网格搜索与交叉验证gc = GridSearchCV(rf, param_grid=param, cv=2)gc.fit(x_train, y_train)print("准确率:", gc.score(x_test, y_test))print("查看选择的参数模型:", gc.best_params_)return Noneif __name__ == "__main__":decision()

结果为

DictVectorizer(sparse=False)
['Age', 'Pclass=1st', 'Pclass=2nd', 'Pclass=3rd', 'Sex=female', 'Sex=male']
准确率: 0.8161434977578476
查看选择的参数模型: {'max_depth': 5, 'n_estimators': 120}

随机森林的优点

  • 在当前所有算法中,具有极好的准确率
  • 能够有效地运行在大数据集上
  • 能够处理具有高维特征的输入样本,而且不需要降维
  • 能够评估各个特征在分类问题上的重要性
  • 对于缺省值问题也能够获得很好得结果
DictVectorizer(sparse=False)
['Age', 'Pclass=1st', 'Pclass=2nd', 'Pclass=3rd', 'Sex=female', 'Sex=male']
准确率: 0.8161434977578476
查看选择的参数模型: {'max_depth': 5, 'n_estimators': 120}

随机森林的优点

  • 在当前所有算法中,具有极好的准确率
  • 能够有效地运行在大数据集上
  • 能够处理具有高维特征的输入样本,而且不需要降维
  • 能够评估各个特征在分类问题上的重要性
  • 对于缺省值问题也能够获得很好得结果

机器学习 入门详细解析(二)决策树、随机森林相关推荐

  1. 机器学习入门笔记(二):线性模型

    文章目录 一.基本形式 二.线性回归 2.1 离散属性连续化 2.2 最小二乘法 2.3 多元线性回归 2.4 广义线性模型 三.对数几率回归(逻辑回归) 3.1 最大似然估计 四.线性判别分析(LD ...

  2. 决策树随机森林GBDTXGBoost学习笔记以及代码实现

    文章目录 1. 引入 1.1 决策树 1.2 随机森林 1.3 GBDT(Gradient Boosting Decision Tree)梯度提升决策树 1.4 XGBoost(eXtreme Gra ...

  3. 词袋模型 matlab,【火炉炼AI】机器学习051-视觉词袋模型+极端随机森林建立图像分类器...

    [火炉炼AI]机器学习051-视觉词袋模型+极端随机森林建立图像分类器 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, m ...

  4. 机器学习实战之分类算法(K-近邻/朴素贝叶斯/决策树/随机森林)

    机器学习分类算法 1. 机器学习算法简介 1.1 按照学习方式分类 1.2 区别 1.3 关于监督学习中的分类与回归区别 1.4 机器学习开发流程 2. 数据集介绍与划分 2.1 sklearn数据集 ...

  5. 机器学习二【随机森林】

    随机森林 1. 概述 1.1 集成算法概述 1.2 sklearn中的集成算法 2 .RandomForestClassifier 2.1 重要参数 2.1.1 控制基评估器的参数 2.1.2 n_e ...

  6. 【数学建模】机器学习预测算法(KNN、随机森林、网格搜索对决策树、支持向量机)(Python代码实现)【2021华为杯】

    目录 1 题目 2 数据集介绍及建模目标 3 问题 4 简化描述 5 Python代码实现 1 题目 乳腺癌是目前世界上最常见,致死率较高的癌症之一.乳腺癌的发展与雌激素受体密切相关,有研究发现,雌激 ...

  7. 机器学习——决策树+随机森林

    目录 决策树 认识决策树 决策树的生成 信息的单位--比特 信息熵 决策树的划分依据之一--信息增益 例题--银行贷款分析 决策树的其他分类依据 案例--泰坦尼克号乘客生存分类 决策树的结构.本地保存 ...

  8. 机器学习之分类-决策树随机森林

    决策树 原理(信息论) 信息熵 信息:消除随机不定性的东西 信息熵公式,单位bit H ( X ) = − ∑ i = 1 n ( P ( x i ) log ⁡ b P ( x i ) ) H(X) ...

  9. 金融风控机器学习第三十一天---拜师课堂 机器学习算法--决策树 随机森林

    ID3 c4.5的核心是熵 ID3 c4.5 cart 过拟合解决一般 用 剪枝 或者 随机森林 随机森林代码: #!/usr/bin/python # -*- coding:utf-8 -*-imp ...

最新文章

  1. SpringMVC解决@ResponseBody返回乱码问题
  2. 【MATLAB】数据类型 ( 元胞数组 | 单位阵 | 幻方 | 结构体 | 元胞数组值获取 )
  3. tomcat服务器介绍之二 、session服务器实现方法
  4. 数组中两数相加等于特定值,以字符串的形式输出两数角标
  5. 网络爬虫--12.【XPath实战】获取百度贴吧中的图片
  6. c语言printf %llo,c++ - Printf疯狂了 - 堆栈内存溢出
  7. Python | 多种编码文件(中文)乱码问题解决
  8. PHP --字符串编码转换(自动识别原编码)
  9. 练习:查找指定目录(包括子目录)下的视频(格式为.mp4,.rmvb,.avi),并将目录存放在一个文件中...
  10. Windows11 专业版 体验分享
  11. 工商银行在线支付接口
  12. SDN是什么东东???
  13. openwrt运行n2n服务器,在openwrt路由中加入n2n,并在ubuntu里加入n2n服务,实现开机联网互通互访...
  14. nodejs串口通信
  15. 【C++】Win10设置默认程序
  16. android hook方法替换,Android Hook入门教程
  17. 购物车-前后端分离版
  18. vmstat 命令参数详解
  19. 2021-2026年,全球MPO光纤连接器市场复合年增长率预计为23.2%
  20. VerA 0.15 by PE_kill

热门文章

  1. R语言学习记录:主成分分析的R实现
  2. django 常用static\media\邮箱\富文本编辑器配置(备忘)
  3. Excel VBA 小程序 - 文本型数字转为数值型数字
  4. Java开发之路—Java反射机制
  5. 一行代码实现蒲公英市场APP检查更新
  6. 用python画盒图_[519]matplotlib(四)|Python中用matplotlib绘制盒状图(Boxplots)和小提琴图(Violinplots)...
  7. 一文掌握语义分割PSPNet——证件照制作、抠图(算法原理、Pytorch实现)
  8. Derivation of Linear Regression with Multiple Variables
  9. Java 编写程序打印以下图形_怎么用java编写如下程序在屏幕上输出如下图形 * *** *** * 循环语句做(if语句)...
  10. Python札记 -- 使用easy_install进行模块/包管理