35 机器学习(三):混淆矩阵|朴素贝叶斯|决策树|随机森林

文章目录

  • 分类模型的评估
    • 混淆矩阵
      • 精确率和召回率
    • 接口介绍
    • 其他的补充
  • 朴素贝叶斯
    • 基础原理介绍
    • 拉普拉斯平滑
    • 下面给出应用的例子
    • 朴素贝叶斯的思辨
  • 决策树
    • 基础使用
    • 基本原理
      • 信息熵
      • 信息增益
      • 信息增益率
      • Gini指数
    • 剪枝
    • api介绍
  • 随机森林------集成学习初识
    • 基本使用
    • api介绍

分类模型的评估

一般最常见使用的是准确率,即预测结果正确的百分比,我们之前写的那个KNN所使用的就是准确率,但是实际上在很多的别的使用场景上,我们关注的并不只有准确性,比如后面会举一个个人理解的例子,进行分析。

混淆矩阵

在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵。

在这里插入图片描述
这边的理解我们带入例子,进行理解,并理解一下为什么只有准确度并不能完全说明这个模型预测的好坏,我们把这个带入医生系统,去判断病人是否有病

TP:病人有病,被你预测成有病。
TN:病人没病,被你预测成没病。
FP:病人没病,被你预测成有病。
FN:病人有病,被你预测成没病。

明显对于医生预测系统来说,我们除了关注准确度来说,FN也是一个关键值,对于一个病人有病,却被诊断为没病,这是非常致命的缺陷,我们甚至希望牺牲掉部分准确性,去提升这一事故的发生。

精确率和召回率

精确率:预测结果为正例样本中真实为正例的比例(查得准):TP/TP+FP
召回率:真实为正例的样本中预测结果为正例的比例(查的全,对正样本的区分能力):TP/TP+FN

接口介绍

这个只是做接口介绍,具体的使用放在下面的朴素贝叶斯进行使用。

sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )y_true:真实目标值
y_pred:估计器预测目标值
labels:指定类别对应的数字
target_names:目标类别名称
return:每个类别精确率与召回率

其他的补充

参考链接:链接1
链接2

朴素贝叶斯

基础原理介绍

在学习概率论的时候,我们已经学习过了朴素贝叶斯,这是一个后验概率。
详细见链接

下面讲点,自己的理解:

在这里插入图片描述
即我们对于这个公式的分类理解:
我们现在想要做一个根据文章出现的关键词,进行判断这篇文章是不是属于科技类的新闻,那么概率就是P(科技|‘云计算’ ‘高帧’ ‘计算机’···),但这个概率明显是没有办法进行求取的,但是我们可以根据这个贝叶斯公式进行转化

直接变成(P(云计算|科技) * P(科技) * ···)/ P(‘云计算’ ‘高帧’ ‘计算机’···)

这明显都可以根据已有的条件进行推出,这也就是这个公式的意义。

朴素贝叶斯的实现API:

sklearn.naive_bayes.MultinomialNB

拉普拉斯平滑

在求取概率的时候,有时候由于每个参数出现的次数太少,然后根据我们上面的公式一个为0之后,那么之后所有的样本都不用进行计算,直接全为0了,所以我们这边采用拉普拉斯平滑进行处理,让其脱离0的局限。

在这里插入图片描述

处理就是在求条件概率的时候,上方加上一个alpha,下方加上alpha*样本数目。

实现接口:

sklearn.naive_bayes.MultinomialNB(alpha = 1.0)

下面给出应用的例子

数据就是20类新闻的那个数据。

# 朴素贝叶斯进行文本分类 以及使用检测那个混淆矩阵的 精确率和回归率
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report,roc_auc_score# 数据准备 sklearn就是好啊,直接给的都不需要进行数据处理
news = fetch_20newsgroups(subset='all', data_home='dataset')
print(len(news.data)) # 看一下共有多少条新闻# 进行数据分割
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25, random_state=1)# 开始特征工程的工作 对数据集进行特征抽取 这一部分之前也讲解过,不细看,由于这个数据是纯英文的,所以不需要进行jieba分词
tfidef = TfidfVectorizer()
x_train = tfidef.fit_transform(x_train)
x_test = tfidef.transform(x_test)# 训练 准备开始训练
# 进行朴素贝叶斯算法的预测,alpha是拉普拉斯平滑系数,分子和分母加上一个系数,分母加alpha*特征词数目
mlt = MultinomialNB(alpha=1.0)# 开始训练
mlt.fit(x_train, y_train)# 训练结束 开始预测
y_predict = mlt.predict(x_test)# 得出准确率,这个是很难提高准确率,为什么呢?
print("准确率为:", mlt.score(x_test, y_test))# 计算精准率和召回率
print("每个类别的精确率和召回率:\n", classification_report(y_test, y_predict, target_names=news.target_names))# 把0-19总计20个分类,变为0和1 这个是计算AUC用的,AUC只能用于二分类
y_test = np.where(y_test == 0, 1, 0)
y_predict = np.where(y_predict == 0, 1, 0)
# roc_auc_score的y_test只能是二分类,针对多分类如何计算AUC
print("AUC指标:\n", roc_auc_score(y_test, y_predict))

输出:

18846
准确率为: 0.8518675721561969
每个类别的精确率和召回率:precision    recall  f1-score   supportalt.atheism       0.91      0.77      0.83       199comp.graphics       0.83      0.79      0.81       242comp.os.ms-windows.misc       0.89      0.83      0.86       263
comp.sys.ibm.pc.hardware       0.80      0.83      0.81       262comp.sys.mac.hardware       0.90      0.88      0.89       234comp.windows.x       0.92      0.85      0.88       230misc.forsale       0.96      0.67      0.79       257rec.autos       0.90      0.87      0.88       265rec.motorcycles       0.90      0.95      0.92       251rec.sport.baseball       0.89      0.96      0.93       226rec.sport.hockey       0.95      0.98      0.96       262sci.crypt       0.76      0.97      0.85       257sci.electronics       0.84      0.80      0.82       229sci.med       0.97      0.86      0.91       249sci.space       0.92      0.96      0.94       256soc.religion.christian       0.55      0.98      0.70       243talk.politics.guns       0.76      0.96      0.85       234talk.politics.mideast       0.93      0.99      0.96       224talk.politics.misc       0.98      0.56      0.72       197talk.religion.misc       0.97      0.26      0.41       132accuracy                           0.85      4712macro avg       0.88      0.84      0.84      4712weighted avg       0.87      0.85      0.85      4712AUC指标:0.8827602448315142

朴素贝叶斯的思辨

优点:

  1. 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
  2. 对缺失数据不太敏感,算法也比较简单,常用于文本分类。
  3. 分类准确度高,速度快

缺点:

  1. 需要知道先验概率 P(F1,F2,…|C),因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
  2. 假设了文章当中一些词语另外一些是独立没关系—-如果有关系,会造成不太靠谱
  3. 训练集当中去进行统计词这些工作 文章收集的不好,比如有作弊文章,充斥某个词会对结果造成干扰

朴素贝叶斯常用于文本领域,但是现在神经网络的transformer做的更好,朴素贝叶斯也属于lazy learning的类型的。

决策树

基础使用

# 决策树
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier# 获取数据 观察数据的内容
titan = pd.read_csv("./dataset/titanic/titan_train.csv")# 确定特征值 目标值
x = titan[["Pclass", "Age", "Sex"]]
y = titan["Survived"]
print(x.info()) # 打印出来说明存在nan
print(x.shape)
print('-'*20)# 处理空值 直接平均值填写吧
im = SimpleImputer(missing_values=np.nan, strategy='mean')
x['Age'] = im.fit_transform(x[['Age']])# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)# 查看数据,存在字符串,所以需要转化为one-hot Dict顾名思义需要传入的是字典
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train.to_dict(orient="records"))
x_test = transfer.fit_transform(x_test.to_dict(orient="records"))# 决策树训练
estimator = DecisionTreeClassifier(criterion="entropy", max_depth=5)
estimator.fit(x_train, y_train)# 模型评估
print(estimator.score(x_test, y_test))

输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 3 columns):#   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  0   Pclass  891 non-null    int64  1   Age     714 non-null    float642   Sex     891 non-null    object 
dtypes: float64(1), int64(1), object(1)
memory usage: 21.0+ KB
None
(891, 3)
--------------------
0.7757847533632287

基本原理

决策树的基本原理:
在这里插入图片描述

决策树的基本原理就是类似我们的if-else,从根节点开始,不断进行判断,最后走到一个叶子节点,就是我们相对应的结局,而我们需要根据自己的需要去构建出这么一棵决策树,构建决策树要根据什么原则来构建呢?实际上采用的熵

信息熵

系统越有序,熵值越低;系统越混乱或者分散,熵值越高,在之前的决策树,我们采用的是香农的信息熵公式进行判断到底是什么需要优先排在上面,什么排在下面再进行判断。
在这里插入图片描述

而我么进行排列的顺序一大顺序就是按照信息熵的信息增益来进行判断的。

信息增益

信息增益:以某特征划分数据集前后的熵的差值。熵可以表示样本集合的不确定性,熵越大,样本的不确定性就越大。因此可以使用划分前后集合熵的差值来衡量使用当前特征对于样本集合D划分效果的好坏。
在这里插入图片描述
信息增益 = entroy(前) - entroy(后),然后来判断到底是哪一个来的效果更好,就是选择哪一个。

这个就是经典的id3 算法,但是对于id3算法来说,他的一个巨大的缺陷就是他受特征量多的那一个影响太严重,这个需要根据个人的想法进行判断是否采用这个算法。

信息增益率

在这里插入图片描述
这个就是在原本的计算的时候除掉一个总数。

Gini指数

基尼值Gini(D):从数据集D中随机抽取两个样本,其类别标记不一致的概率。故,Gini(D)值越小,数据集D的纯度越高。
在这里插入图片描述

一般,选择使划分后基尼系数最小的属性作为最优化分属性

剪枝

为了防止过拟合现象,需要剪枝进行剪掉我们的部分数据。

预剪枝:

  1. 每一个结点所包含的最小样本数目,例如10,则该结点总样本数小于10时,则不再分
  2. 指定树的高度或者深度,例如树的最大深度为4
  3. 指定结点的熵小于某个值,不再划分。随着树的增长, 在训练样集上的精度是单调上升的, 然而在独立的测试样例上测出的精度先上升后下降。

后剪枝:
实际上就是在看到了前面的效果之后的剪枝,剪枝也跟上面是一致的。

api介绍

class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)criterion 特征选择标准
"gini"或者"entropy",前者代表基尼系数,后者代表信息增益。一默认"gini",即CART算法。min_samples_split
内部节点再划分所需最小样本数
这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。我之前的一个项目例子,有大概10万样本,建立决策树时,我选择了min_samples_split=10。可以作为参考。min_samples_leaf
叶子节点最少样本数
这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。之前的10万样本项目使用min_samples_leaf的值为5,仅供参考。max_depth
决策树最大深度
决策树的最大深度,默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间random_state
随机数种子

随机森林------集成学习初识

基本使用

# 随机森林 使用了集成学习
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV# 还是使用上面的数据 不详细介绍
#----------------------------------------------------------------------
titan = pd.read_csv("./dataset/titanic/titan_train.csv")
x = titan[["Pclass", "Age", "Sex"]]
y = titan["Survived"]
im = SimpleImputer(missing_values=np.nan, strategy='mean')
x['Age'] = im.fit_transform(x[['Age']])
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train.to_dict(orient="records"))
x_test = transfer.fit_transform(x_test.to_dict(orient="records"))
#----------------------------------------------------------------------# 随机森林进行训练 随机森林搭配网格训练
rf = RandomForestClassifier()
# n_estimators 代表的就是有几棵树
param = {"n_estimators": [120,200,300], "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))

输出:

随机森林预测的准确率为: 0.7802690582959642

api介绍

sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’, max_depth=None, bootstrap=True, random_state=None, min_samples_split=2)n_estimators:integer,optional(default = 10)森林里的树木数量120,200,300,500,800,1200Criterion:string,可选(default =“gini”)分割特征的测量方法max_depth:integer或None,可选(默认=无)树的最大深度 5,8,15,25,30max_features="auto”,每个决策树的最大特征数量
If "auto", then max_features=sqrt(n_features).
If "sqrt", then max_features=sqrt(n_features)(same as "auto").
If "log2", then max_features=log2(n_features).
If None, then max_features=n_features.bootstrap:boolean,optional(default = True)是否在构建树时使用放回抽样min_samples_split:节点划分最少样本数min_samples_leaf:叶子节点的最小样本数超参数:n_estimator, max_depth, min_samples_split,min_samples_leaf

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

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

相关文章

音频录制和处理软件 Audio Hijack mac中文版说明

Audio Hijack mac是一款功能强大的音频录制和处理软件&#xff0c;它可以帮助用户从各种来源捕获和处理音频。 首先&#xff0c;Audio Hijack具有灵活的音频捕获功能。它支持从多个来源录制音频&#xff0c;包括麦克风、应用程序、网络流媒体、硬件设备等等。你可以选择捕获整个…

告别传统纸质期刊,电子期刊更环保更快捷

​【新发现】随着科技的发展&#xff0c;电子期刊逐渐取代了传统的纸质期刊&#xff0c;成为人们获取信息的新选择。电子期刊不仅环保&#xff0c;而且快捷方便&#xff0c;但是你知道怎么制作电子期刊吗&#xff1f; 不会制作的可以试试我推荐的这个网站----FLBOOK电子杂志制作…

无代码玩转web UI自动化

可以直接进入官网下载开源版或点击右上角体验企业版体验 RunnerGo UI自动化平台 RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块&#xff0c;覆盖了整个产品测试周期。 RunnerGo UI自动化基于Selenium浏览器自动化方案构建&#xff0c;内嵌高度…

报错:AttributeError: module ‘tensorflow‘ has no attribute ‘flags‘

改成如下&#xff1a; 报错原因&#xff1a;tensorflow1.x与2.x版本问题不兼容

今日最新版早安问候大全,秋天早上好祝福短句,生活顺心,一切开心

天上最美的是星星&#xff0c;关心朋友的是短信&#xff0c;人间最美的是真情&#xff0c;外表留给人的是印象&#xff0c;内心留给人的是感情&#xff0c;珍惜了今天你就拥有了明天&#xff0c;愿你开怀地笑&#xff0c;温柔地睡&#xff01;早安朋友&#xff01; 早晨的阳光…

Leetcode——数组的旋转

189. 轮转数组 class Solution { public:void rotate(vector<int>& nums, int k) {int lennums.size();vector<int> num(len);for(int i0;i<len;i){num[(ik)%len]nums[i];}nums.assign(num.begin(),num.end());} };旋转数组 没看出数学公式gg 正确答案 cl…

AI大模型高速发展,Web3还远吗?

在过去的几年里&#xff0c;人工智能&#xff08;AI&#xff09;和Web3技术都经历了令人瞩目的发展。AI大模型&#xff0c;特别是像GPT-3、GPT-4等这样的巨型语言模型&#xff0c;已经成为AI领域的明星&#xff0c;而Web3则代表了下一代互联网的愿景&#xff0c;具有去中心化和…

最近邻插值的原理及实现

1. 介绍 插值算法一般用来做上采样和下采样,最邻近插值算法,是插值算法中最简单的一种。 最邻近插值:将每个目标像素找到距离它最近的原图像素点,然后将该像素的值直接赋值给目标像素。 优点: 实现简单,计算速度快 缺点:插值结果缺乏连续性,可能会产生锯齿状的边缘,对…

scratch时间游戏 2023年9月中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析

目录 scratch时间游戏 一、题目要求 1、准备工作 2、功能实现 二、案例分析

Cocos Creator3.8 项目实战(十)使用 protobuf详细教程

在 Cocos Creator 中使用 protobuf.js 库可以方便地进行协议的序列化和反序列化。 下面是使用 protobuf.js 的详细说明&#xff1a; 一、protobuf环境安装 1、安装 npm protobuf环境安装安装需要使用 npm 命令进行&#xff0c;因此首先需要安装 npm 。 如果你还没安装 npm …

微信一键群发超过200人的方法

在当前社交媒体的大潮中&#xff0c;微信已跻身全球最热门的社交平台之列。对于企业的运营管理来说&#xff0c;微信的管理系统工具发挥着举足轻重的作用。然而&#xff0c;微信自带的群发助手功能最多只能发送消息给200个好友&#xff0c;要是需要发送1000个好友甚至更多&…

《论文阅读28》OGMM

一、论文 研究领域&#xff1a; 点云配准 | 有监督 部分重叠论文&#xff1a;Overlap-guided Gaussian Mixture Models for Point Cloud Registration WACV 2023 二、概述 概率3D点云配准方法在克服噪声、异常值和密度变化方面表现出有竞争力的性能。本文将点云对的配准问题…

10款远程办公软件,助你事半功倍,晋升快如闪电

选择一个易于使用和方便的远程软件&#xff0c;可以提高团队的整体效率&#xff0c;减少加班&#xff0c;使整个团队更受益。互联网行业从产品经理、UI/从UX设计师到技术开发和测试人员&#xff0c;每一个环节都需要密切沟通和跟踪&#xff0c;在远程沟通中及时发现问题&#x…

power point导出pdf保留字体

在 slides 中用到非自带的字体&#xff0c;如 [1]&#xff0c;想导出成 pdf 文件&#xff08;因为导出成图&#xff0c;如 png&#xff0c;放大会蒙&#xff09;&#xff0c;并在别人电脑里也保留字体。除了让别人也装上相应字体&#xff0c;可以&#xff1a; 参考 [2]&#x…

“岗课赛证”融通的物联网综合实训室建设方案

一、概述 随着5G技术的普及应用和产业经济的革新发展,物联网产业所呈现的广阔前景带来了对创新型技术技能人才的迫切需求。高职院校物联网专业建设也因此转变为面向国家战略性新兴产业发展需求。当前,“岗位课程竞赛证书”融通的培育理念,是高职院校物联网人才培养和专业优化的…

Anomalib 图像异常检测算法

图像异常检测算法 1.简介1.1. 问题描述1.2. 挑战与需求 2. 图像异常检测定义2.1 异常的定义及类型2.2 图像数据中的异常 3. 图像异常检测技术研究现状4.方法5.安装和使用5.1 安装PyPI 安装本地安装 5.2 训练5.3 特征提取与&#xff08;预训练&#xff09;backones5.4 自定义数据…

大中小企业自招人力及劳务派遣全行业招聘来抖音招聘流量大效果佳

抖音直播招聘报白是通过抖音直播方式展现职位信息&#xff0c;并与求职者进行互动的招聘方式。在抖音平台上&#xff0c;企业或者人力资源公司可以通过直播的形式&#xff0c;将职位以视频直播的方式展现出来。通过抖音直播招聘报白&#xff0c;企业或者人力资源公司可以利用抖…

文本识别工具 TextSniper for Mac有哪些特点

TextSniper 是一款 macOS 平台上的文本提取工具&#xff0c;它可以将屏幕上的文字内容快速转换为可编辑的文本。无论是从图像、视频、PDF 文件还是其他类型的文档中提取文字&#xff0c;TextSniper 都提供了便捷的功能。 以下是 TextSniper的一些主要特点和功能&#xff1a; …

vue 插槽-默认插槽

vue 插槽-默认插槽 **创建 工程&#xff1a; H:\java_work\java_springboot\vue_study ctrl按住不放 右键 悬着 powershell H:\java_work\java_springboot\js_study\Vue2_3入门到实战-配套资料\01-随堂代码素材\day05\准备代码\07-插槽-默认插槽 vue --version vue create…

地铁大数据客流分析系统 设计与实现 计算机竞赛

文章目录 1 前言1.1 实现目的 2 数据集2.2 数据集概况2.3 数据字段 3 实现效果3.1 地铁数据整体概况3.2 平均指标3.3 地铁2018年9月开通运营的线路3.4 客流量相关统计3.4.1 线路客流量排行3.4.2 站点客流量排行3.4.3 入站客流排行3.4.4 整体客流随时间变化趋势3.4.5 不同线路客…