【机器学习】sclearn分类算法-决策树、随机森林

分类算法-决策树、随机森林

  • 1.决策树
    • 1.1 认识决策树
    • 1.2 信息论基础-银行贷款分析
    • 1.3 决策树的生成
    • 1.4 决策树的划分依据之一-信息增益
    • 1.5 sklearn决策树API
    • 1.6 泰坦尼克号乘客生存分类
  • 2. 集成学习方法-随机森林

1.决策树

1.1 认识决策树

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

1.2 信息论基础-银行贷款分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
每猜一次给一块钱,告诉我是否猜对了,那么我需要掏多少钱才能知道谁是冠军?我可以把球编上号,从1到32,然后提问:冠 军在1-16号吗?依次询问,只需要五次,就可以知道结果。

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

*1948年,香农发表了划时代的论文——通信的数学原理,奠定了现代信息论的基础
信息的单位:比特
在这里插入图片描述
“谁是世界杯冠军”的信息量应该比5比特少。香农指出,它的准确信息量应该是:

H = -(p1logp1 + p2logp2 + … + p32log32)
H的专业术语称之为信息熵,单位为比特。
公式:
在这里插入图片描述
当这32支球队夺冠的几率相同时,对应的信息熵等于5比特
如果:不知道任何一个球队的信息的话,5bit 1/32 1/32
5=-(1/32logp1/32 + 1/32log1/32 + … + 1/32log1/32)
但是当开放一些数据信息时
5<-(1/4logp1/4 + 1/4log1/4 + … )
比如德国1/4 巴西1/4 中国1/4
当得到一些信息时,信息熵是减少的。信息熵越大,不确定性越大。
在这里插入图片描述

1.3 决策树的生成

1.4 决策树的划分依据之一-信息增益

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

特征A对训练数据集D的信息增益g(D,A),
定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差,即公式为:
在这里插入图片描述
结合前面的贷款数据来看我们的公式:

  • 信息熵的计算:
    在这里插入图片描述
  • 条件熵的计算:
    在这里插入图片描述
    注:𝐶_𝑘 表示属于某个类别的样本数,
    在这里插入图片描述
    其他常见决策树使用的算法
ID3
信息增益 最大的准则
C4.5
信息增益比 最大的准则
CART 
回归树: 平方误差 最小 
分类树: 基尼系数(划分更仔细)   最小的准则 在sklearn中可以选择划分的原则

1.5 sklearn决策树API

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

1.6 泰坦尼克号乘客生存分类

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

在这里插入图片描述
数据:http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt

泰坦尼克号乘客生存分类模型
流程:

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

决策树的优缺点以及改进

  • 优点:
    简单的理解和解释,树木可视化。
    需要很少的数据准备,其他技术通常需要数据归一化
  • 缺点:
    决策树学习者可以创建不能很好地推广数据的过于复杂的树,这被称为过拟合
    决策树可能不稳定,因为数据的小变化可能会导致完全不同的树被生成
  • 改进:
    减枝cart算法
    随机森林
from sklearn.metrics import classification_report
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier, export_graphviz
import pandas as pd
def decision():"""决策树对泰坦尼克号进行预测生死:return: None"""# 获取数据titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")# 处理数据,找出特征值和目标值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)#不产生稀疏矩阵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: None
if __name__ == "__main__":decision()

2. 集成学习方法-随机森林

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

  • 随机森林
    定义:在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。
    例如, 如果你训练了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.metrics import classification_report
from sklearn.feature_extraction import DictVectorizer
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
def decision():"""决策树对泰坦尼克号进行预测生死:return: None"""# 获取数据titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")# 处理数据,找出特征值和目标值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)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', '女性', '男性'])# 随机森林进行预测 (超参数调优)rf = RandomForestClassifier()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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】回归算法-线性回归分析、回归实例和回归性能评估

回归算法-线性回归分析、回归实例和回归性能评估线性回归损失函数(误差大小)sklearn线性回归正规方程、梯度下降API线性回归实例回归&#xff1a;目标值连续&#xff1b;分类&#xff1a;目标值离散。 预测回归和分类是不一样的。回归问题可以用于预测销售额&#xff0c;比如公…

scrapy使用代理报错keyerror: proxy_爬虫Scrapy框架-Crawlspider链接提取器与规则解析器...

Crawlspider一&#xff1a;Crawlspider简介CrawlSpider其实是Spider的一个子类&#xff0c;除了继承到Spider的特性和功能外&#xff0c;还派生除了其自己独有的更加强大的特性和功能。其中最显著的功能就是”LinkExtractors链接提取器“。Spider是所有爬虫的基类&#xff0c;其…

传智书城首页设计代码_(自适应手机版)响应式创意餐饮酒店装饰设计类网站织梦模板 html5蓝色餐饮酒店设计网站源码下载...

模板名称&#xff1a;(自适应手机版)响应式创意餐饮酒店装饰设计类网站织梦模板 html5蓝色餐饮酒店设计网站源码下载本套织梦模板采用织梦最新内核开发的模板&#xff0c;这款模板使用范围广&#xff0c;不仅仅局限于一类型的企业&#xff0c;创意设计、装饰设计、餐饮酒店设计…

【机器学习】逻辑回归—良/恶性乳腺癌肿瘤预测

逻辑回归—良&#xff0f;恶性乳腺癌肿瘤预测 逻辑回归的损失函数、优化 与线性回归原理相同,但由于是分类问题&#xff0c;损失函数不一样&#xff0c;只能通过梯度下降求解 sklearn逻辑回归API sklearn.linear_model.LogisticRegressionLogisticRegression sklearn.linear…

opencv mat初始化_【OpenCV入门之十二】看起来一样的图像竟然存在这么大的差别!...

小白导读学习计算机视觉最重要的能力应该就是编程了&#xff0c;为了帮助小伙伴尽快入门计算机视觉&#xff0c;小白准备了【OpenCV入门】系列。新的一年文章的内容进行了很大的完善&#xff0c;主要是借鉴了更多大神的文章&#xff0c;希望让小伙伴更加容易理解。如果小伙伴觉…

LeetCode 1854. 人口最多的年份(差分)

文章目录1. 题目2. 解题1. 题目 给你一个二维整数数组 logs &#xff0c;其中每个 logs[i] [birthi, deathi] 表示第 i 个人的出生和死亡年份。 年份 x 的 人口 定义为这一年期间活着的人的数目。 第 i 个人被计入年份 x 的人口需要满足&#xff1a;x 在闭区间 [birthi, dea…

服务端_说说Netty服务端启动流程

点击上方☝SpringForAll社区 轻松关注&#xff01;及时获取有趣有料的技术文章本文来源&#xff1a;http://yeming.me/2016/03/12/netty1/netty服务端代码分析服务端启动配置对于 ServerBootstrap&#xff1a;ServerBootstrap继承于 AbstractBootstrap&#xff0c;它从父类继承…

ztree在刷新时第一个父节点消失_第一个关于中式菜谱的智能问答机器人小程序正式上线啦...

为了满足大家对菜品烹饪的各类问题能直接得到答案的需求&#xff0c;我开发了目前第一个真正关于菜谱的智能问答系统&#xff0c;并在微信小程序发布上线。这套系统支持对于8600多种菜品的问答功能&#xff0c;并能实现快速问答响应&#xff0c;整套系统后端依托于搭建的中式菜…

LeetCode 1855. 下标对中的最大距离(双指针)

文章目录1. 题目2. 解题1. 题目 给你两个 非递增 的整数数组 nums1​​​​​​ 和 nums2​​​​​​ &#xff0c;数组下标均 从 0 开始 计数。 下标对 (i, j) 中 0 < i < nums1.length 且 0 < j < nums2.length 。如果该下标对同时满足 i < j 且 nums1[i] …

【Python基础知识-pycharm版】第一节-基础

python第一节特点Python 解释器python开发环境交互模式IDLE开发环境使用入门程序基本格式图形化程序设计python程序的构成python程序的对象python的引用python的标识符标识符命名规则变量和简单赋值语句删除变量和垃圾回收机制Python 是一种解释型、面向对象的语言。 官网&…

c++对象回收string类型成员时coredump_本体技术视点 | 虚拟机中引用性动态语言对象模型思考...

1引言Ontology 的 NeoVM 虚拟机新增加了 DCALL、HAS_KEY、KEYS 以及 VALUES 等几条新的指令。因此&#xff0c;基于 NeoVM 的引用性动态语言对象的设计理论上可行&#xff0c;这可使得当前语言的支持能更接近原生语义。对象模型设计的必要性Ontology NeoVM 对用户暴露的对象语义…

LeetCode 1856. 子数组最小乘积的最大值(前缀和 + 单调栈)

文章目录1. 题目2. 解题1. 题目 一个数组的 最小乘积 定义为这个数组中 最小值 乘以 数组的 和 。 比方说&#xff0c;数组 [3,2,5] &#xff08;最小值是 2&#xff09;的最小乘积为 2 * (325) 2 * 10 20 。 给你一个正整数数组 nums &#xff0c;请你返回 nums 任意 非空…

【Python基础知识-pycharm版】第二节-赋值/数据类型/时间点/运算符/字符串

python第二节链式赋值_系列解包赋值内置数据类型时间表示unix时间点多点坐标绘出折线图运算符字符串部分来源&#xff1a;1.https://blog.csdn.net/wys103158/article/details/964882382.https://www.cnblogs.com/jack-zh/p/10810569.html3.http://c.biancheng.net/view/4258.h…

LeetCode 1859. 将句子排序

文章目录1. 题目2. 解题1. 题目 一个 句子 指的是一个序列的单词用单个空格连接起来&#xff0c;且开头和结尾没有任何空格。每个单词都只包含小写或大写英文字母。 我们可以给一个句子添加 从 1 开始的单词位置索引 &#xff0c;并且将句子中所有单词 打乱顺序 。 比方说&a…

java 拦截器_Spring的春天来啦——百战Java课程更新(2019.09.06)

百战程序员运营400天&#xff0c;课程突破10000节&#xff0c;周周有新课更新&#xff0c;保持行业领先&#xff0c;九大专业运营。注册人数突破70万人&#xff0c;超级VIP用户累计8358人。百战程序员&#xff0c;由50专家、精英讲师组成课程研究院&#xff0c;根据市场发展和企…

LeetCode 1860. 增长的内存泄露(等差数列)

文章目录1. 题目2. 解题1. 题目 给你两个整数 memory1 和 memory2 分别表示两个内存条剩余可用内存的位数。 现在有一个程序每秒递增的速度消耗着内存。 在第 i 秒&#xff08;秒数从 1 开始&#xff09;&#xff0c;有 i 位内存被分配到 剩余内存较多 的内存条&#xff08;如…

argumentoutofrangeexception:长度不能小于0_数组长度属性背后的魔力有哪些?

开发人员每天都会处理数组。作为集合&#xff0c;要查询的重要属性是项目数&#xff1a;Array.prototype.length。在JavaScript中&#xff0c;length它并不总是指示现有元素的数量&#xff08;对于稀疏数组&#xff09;&#xff0c;并且修改此属性可能会删除元素。让我们揭开这…

【Python基础知识-pycharm版】第四节-元组

元组元组的创建元组的元素访问和计数生成器推导式创建元组列表属于可变序列&#xff0c;可以任意修改列表中的元素&#xff0c;元组属于不可变序列&#xff0c;不能修改元组中的元素。因此&#xff0c;元组没有增加元素、修改元素、删除元素相关的方法。 因此&#xff0c;我们只…

人员离职it检查_?「市安委会第十七检查组」值班人员擅离职守,变压器房随意出入...

近日&#xff0c;市安委会第十七检查组深入浮山县隆顺矿业有限公司&#xff0c;细心查摆&#xff0c;全面梳理企业存在的安全隐患。日前&#xff0c;我们召开了安全生产工作会议&#xff0c;传达了市县相关要求和有关领导的指示批示&#xff0c;要求全体干部职工进一步提高安全…