机器学习基础09-审查分类算法(基于印第安糖尿病Pima Indians数据集)

算法审查是选择合适的机器学习算法的主要方法之一。审查算法前并
不知道哪个算法对问题最有效,必须设计一定的实验进行验证,以找到对问题最有效的算法。本章将学习通过
scikit-learn来审查六种机器学习的分类算法,通过比较算法评估矩阵的结果,选择合适的算法。

如何审查机器学习的分类算法?

审查算法前没有办法判断哪个算法对数据集最有效、能够生成最优模
型,必须通过一系列实验判断出哪些算法对问题最有效,然后再进一步来选择算法。这个过程被叫作算法审查。

在选择算法时,应该换一种思路,不是针对数据应该采用哪种算法,而是应该用数据来审查哪些算法。应该先猜测一下,什么算法会具有最好的效果。这是训练我们对数据敏感性的好方法。我非常建议大家对同一个数据集运用不同的算法,来审查算法的有效性,然后找到最有效的算法。
下面是审查算法的几点建议:

  • 尝试多种代表性算法。
  • 尝试多种机器学习的算法。
  • 尝试多种模型。

接下来会介绍几种常见的分类算法。

在分类算法中,目前存在很多类型的分类器:线性分类器、贝叶斯分类器、基于距离的分类器等。接下来会介绍六种分类算法,先介绍两种线性算法:

  • 逻辑回归。
  • 线性判别分析。

再介绍四种非线性算法:

  • K近邻。
  • 贝叶斯分类器。
  • 分类与回归树。
  • 支持向量机。

下面继续使用Pima Indians数据集来审查算法,同时会采用10折交叉验证来评估算法的准确度。使用平均准确度来标准化算法的得分,以减少数据分布不均衡对算法的影响。

逻辑回归和线性判别分析都是假定输入的数据符合高斯分布。

逻辑回归

回归是一种极易理解的模型,相当于y=f (x),表明自变量x与因变
量y的关系。犹如医生治病时先望、闻、问、切,再判定病人是否生病或生了什么病,此处的“望、闻、问、切”就是获取自变量x,即特征数据;判断是否生病就相当于获取因变量y,即预测分类。

逻辑回归其实是一个分类算法而不是回归算法,通常是利用已知的自变量来预测一个离散型因变量的值(如二进制值0/1、是/否、真/假)。简单来说,它就是通过拟合一个逻辑函数(Logit Function)来预测一个事件发生的概率。所以它预测的是一个概率值,它的输出值应该为 0~1,因此非常适合处理二分类问题。在scikit-learn 中的实现类是LogisticRegression。代码如下:

数据集下载

import pandas as pdfrom sklearn.linear_model import LogisticRegression
from sklearn.model_selection import KFold, cross_val_score#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)#打印标签名称
print(data.columns)#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]Y = array[:, 8]num_folds = 10
seed = 7#特征选择
kfold = KFold(n_splits=num_folds, random_state=seed, shuffle=True)
model = LogisticRegression()result = cross_val_score(model, X, Y, cv=kfold)print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))

运行结果:

算法评估结果:0.776 (0.045)

线性判别分析

线性判别分析(Linear Discriminant Analysis,LDA),也叫作Fisher线性判别(Fisher Linear
Discriminant,FLD),是模式识别的经典算法,它是在1996年由Belhumeur引入模式识别和人工智能领域的。

线性判别分析的基本思想是将高维的模式样本投影到最佳鉴别矢量空间,以达到抽取分类信息和压缩特征空间维数的效果,投影后保证模式样本在新的子空间有最大的类间距离和最小的类内距离,即模式在该空间中有最佳的可分离性。

因此,它是一种有效的特征抽取方法。使用这种方法能够使投影后模式样本的类间散布矩阵最大,并且类内散布矩阵最小。就是说,它能够保证投影后模式样本在新的空间中有最小的类内距离和最大的类间距离,即模式在该空间中有最佳的可分离性。线性判别分析与主要成分分析一样,被广泛应用在数据降维中

在 scikit-learn 中的实现类是LinearDiscriminantAnalysis。代码如下:

import pandas as pd
from sklearn.discriminant_analysis import LinearDiscriminantAnalysisfrom sklearn.model_selection import KFold, cross_val_score#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)#打印标签名称
print(data.columns)#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]Y = array[:, 8]num_folds = 10
seed = 7#特征选择
kfold = KFold(n_splits=num_folds, random_state=seed, shuffle=True)
model = LinearDiscriminantAnalysis()result = cross_val_score(model, X, Y, cv=kfold)print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))

运行结果:

Index(['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin','BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome'],dtype='object')
算法评估结果:0.767 (0.048)

非线性算法

下面介绍四种非线性算法:K近邻(KNN)、贝叶斯分类器、分类与回归树和支持向量机算法。

K近邻算法

K 近邻算法是一种理论上比较成熟的方法,也是最简单的机器学习算法之一。

在KNN中,通过计算对象间距离来作为各个对象之间的非相似性
指标,避免了对象之间的匹配问题,距离一般使用欧氏距离或曼哈顿距离;同时,KNN通过依据k个对象中占优的类别进行决策,而不是通过单一的对象类别决策。这就是 KNN 算法的优势。在 scikit-learn 中的实现类是KNeighborsClassifier。代码如下:

import pandas as pd
from sklearn.discriminant_analysis import LinearDiscriminantAnalysisfrom sklearn.model_selection import KFold, cross_val_score
from sklearn.neighbors import KNeighborsClassifier#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]Y = array[:, 8]num_folds = 10
seed = 7#特征选择
kfold = KFold(n_splits=num_folds, random_state=seed, shuffle=True)
model = KNeighborsClassifier()result = cross_val_score(model, X, Y, cv=kfold)print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))

运行结果:


算法评估结果:0.711 (0.051)

贝叶斯分类器

贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其在所有类别上的后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。也就是说,贝叶斯分类器是最小错误率意义上的优化。

各个类别出现的概率,哪个最大就认为此待分类项属于哪个类别。贝叶斯分类器的特点如下:

  • 贝叶斯分类器是一种基于统计的分类器,它根据给定样本属于某一个具体类的概率来对其进行分类。
  • 贝叶斯分类器的理论基础是贝叶斯理论。
  • 贝叶斯分类器的一种简单形式是朴素贝叶斯分类器,与随机森林、神经网络等分类器都具有可比的性能。
  • 贝叶斯分类器是一种增量型的分类器。

在贝叶斯分类器中,对输入数据同样做了符合高斯分布的假设。在
scikit-learn中的实现类是GaussianNB。
代码如下:

import pandas as pdfrom sklearn.model_selection import KFold, cross_val_score
from sklearn.naive_bayes import GaussianNB#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]Y = array[:, 8]num_folds = 10
seed = 7#特征选择
kfold = KFold(n_splits=num_folds, random_state=seed, shuffle=True)
#高斯朴素贝叶斯
model = GaussianNB()result = cross_val_score(model, X, Y, cv=kfold)print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))

运行结果:

算法评估结果:0.759 (0.039)

分类与回归树

分类与回归树的英文缩写是 CART,也属于一种决策树,树的构建基于基尼指数。

CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归二分每个特征,将输入空间(特征空间)划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。

CART算法由以下两步组成。

  • 树的生成:基于训练数据集生成决策树,生成的决策树要尽量大。
  • 树的剪枝:用验证数据集对已生成的树进行剪枝,并选择最优子树,这时以损失函数最小作为剪枝的标准。

决策树的生成就是通过递归构建二叉决策树的过程,对回归树用平方误差最小化准则,或对分类树用基尼指数最小化准则,进行特征选择,生成二叉树。可以通过scikit-learn中的DecisionTreeClassifier类来构建一个CART模型。代码如下:

import pandas as pdfrom sklearn.model_selection import KFold, cross_val_score
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]Y = array[:, 8]num_folds = 10
seed = 7#特征选择
kfold = KFold(n_splits=num_folds, random_state=seed, shuffle=True)
#高斯朴素贝叶斯
model = DecisionTreeClassifier()result = cross_val_score(model, X, Y, cv=kfold)print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))

运行结果:

算法评估结果:0.695 (0.051)

支持向量机

支持向量机是Corinna Cortes和Vapnik等于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。

在机器学习中,支持向量机(SVM)是与相关的学习算法有关的监督学习模型,可以分析数据、识别模式,用于分类和回归分析。给定一组训练样本,每条记录标记所属类别,使用支持向量机算法进行训练,并建立一个模型,对新数据实例进行分类,使其成为非概率二元线性分类。

一个SVM模型的例子是,如在空间中的不同点的映射,使得所属不同类别的实例是由一个差距明显且尽可能宽的划分表示。新的实例则映射到相同的空间中,并基于它们落在相同间隙上预测其属于同一个类别。现在SVM也被扩展到处理多分类问题,可以通过scikit-learn中的SVC类来构建一个SVM模型。

代码如下:

import pandas as pdfrom sklearn.model_selection import KFold, cross_val_score
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]Y = array[:, 8]num_folds = 10
seed = 7#特征选择
kfold = KFold(n_splits=num_folds, random_state=seed, shuffle=True)
#高斯朴素贝叶斯
model = SVC()result = cross_val_score(model, X, Y, cv=kfold)print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))
算法评估结果:0.760 (0.035)

介绍了六种分类算法,以及它们在 scikit-learn 中的实现。算法主
要分为:线性算法、距离算法、树算法、统计算法等。每一种算法都有不同的适用场景,对数据集有不同的要求。

本次利用 Pima Indians 数据集对这几种算法进行了审查,这是选择合适的算法模型的有效方法。

6个算法评估表如下:

算法名称算法评估结果
逻辑回归LogisticRegression算法评估结果:0.776 (0.045)
线性判别分析 LinearDiscriminantAnalysis算法评估结果:0.767 (0.048)
K近邻算法 KNeighborsClassifier算法评估结果:0.711 (0.051)
贝叶斯分类器GaussianNB算法评估结果:0.759 (0.039)
分类与回归树DecisionTreeClassifier算法评估结果:0.695 (0.051)
支持向量机SVC()算法评估结果:0.760 (0.035)

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

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

相关文章

Ubuntu本地快速搭建web小游戏网站,并使用内网穿透将其发布到公网上

文章目录 前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar内网穿透3.2 创建隧道3.3 测试公网访问 4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名 前言 网:我们通常说的是互联网&am…

Zebec在Nautilus Chain 开启质押,ZBC 将极致通缩

前不久,Zebec Protocol旗下的模块化公链Nautilus Chain上线了主网,模块化Layer3体系正式开启。在Nautilus Chain主网上线的初期阶段,将以ZBC通证作为链上主要的职能通证,用于Gas消耗、治理等诸多方面。据悉,此前在测试…

css3英文文字换行,超过两行...展示

需求:超过两行...展示 开发的过程中发现div内容中文可以换行英文不换行,导致长度会溢出。 是英文全英文的话浏览器会解析成一个单词, 加上这句就好了 word-break:break-all; 一开始不知道是会解析成一个单词,用字符串拼接处理…

await Promise内部执行setTimeout定时器,提前clearTimeout,导致卡死的情况分析及解决方案

背景概述 在我们日常开发中,我们常常需要在某个地方暂停某个动作一段时间。这个时候,我们的通常做法是使用setTimeout,配合promise实现。也就是如下代码。 function delay(ms) {return new Promise((resolve, reject) > {setTimeout(() …

element上传图片,调取接口传值,参数FormData为空

需求 输入完reason,选完文件后,点击提交按钮后 调取接口。 遇到的问题 上传文件orderFile 字段一直为空 打印了发现,上传文件也是有值得。但是传到接口中就为空 原因 json里边不能放file,但是formData里可以放 file 也可以放…

Kotlin全方位-简单解析

Kotlin是一种现代化的静态类型编程语言,由JetBrains公司开发。它可以在Java虚拟机(JVM)上运行,并且可以与Java代码无缝地进行互操作。Kotlin旨在提供更简洁、更安全、更具表达力和更高效的编程语言。 Kotlin主要运用 Android开发…

AIGC ChatGPT 实现动态多维度分析雷达图制作

雷达图在多维度分析中是一种非常实用的可视化工具,主要有以下优势: 易于理解:雷达图使用多边形或者圆形的形式展示多维度的数据,直观易于理解。多维度对比:雷达图可以在同一张图上比较多个项目或者实体在多个维度上的…

OpenCV基础知识(9)— 视频处理(读取并显示摄像头视频、播放视频文件、保存视频文件等)

前言:Hello大家好,我是小哥谈。OpenCV不仅能够处理图像,还能够处理视频。视频是由大量的图像构成的,这些图像是以固定的时间间隔从视频中获取的。这样,就能够使用图像处理的方法对这些图像进行处理,进而达到…

openGauss学习笔记-52 openGauss 高级特性-LLVM

文章目录 openGauss学习笔记-52 openGauss 高级特性-LLVM52.1 适用场景52.2 非适用场景52.3 其他因素对LLVM性能的影响52.4 LLVM使用建议 openGauss学习笔记-52 openGauss 高级特性-LLVM openGauss借助LLVM(Low Level Virtual Machine)提供的库函数&…

【C++】—— C++11之线程库

前言: 在本期,我将给大家介绍的是 C11 中新引进的知识,即关于线程库的相关知识。 目录 (一)线程库的介绍 1、线程库的由来 2、线程库的简单介绍 (二)线程函数参数 (三&#xf…

window系统中如何判断是物理机还是虚拟机及VMPROTECT无法检测云主机

为什么要判断物理机,因为授权不能对虚拟机安装后的软件进行授权。虚拟机可以复制可以克隆,无法作为一个不可复制ID来使用。 总结了如何判断物理机: 1. 用systeminfo的系统型号。(注,有资料是看处理器和bios。但是我这…

List与String数组互转

一.List 转为 String 数组 1.使用toArray方法 public static void main(String[] args) {List<String> list Lists.newArrayList("1","2","3");// Java6以前版本String[] str1 list.toArray(new String[list.size()]);// Java6以后版本…

高并发场景加锁方式及存在的问题

在多线程高并发场景下&#xff0c;为了保证共享资源的正确性&#xff0c;通常会采用加锁的方式。关于加锁以及一些相关的问题&#xff0c;这里根据个人学习了解的做个汇总。 加锁方式&#xff1a; 1、JVM锁1.1 多例模式1.2 事务1.3 集群 2、MySQL悲观锁乐观锁2.1 悲观锁2.2 乐…

JavaScript模块化历程(二)

文章目录 4.模块化标准规范(ES Modules)4.1 如何使用ES6规范4.2 严格模式4.3 实际使用4.4 默认导出4.5 <scrpit>加载文件的顺序 参考文章 4.模块化标准规范(ES Modules) ES6 提供的模块化方案叫做 ES Module&#xff0c;简称 esm,现在我开始接触的基本就是这种规范了,写n…

leetcode做题笔记106. 从中序与后序遍历序列构造二叉树

给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 思路一&#xff1a;递归 struct TreeNode* createTreeNode(int val) {struct TreeNode* ret ma…

四信5G工业路由器赋能5G LAN全连接工厂建设

5G作为“新基建”之首&#xff0c;肩负着驱动国民经济转型升级、促进实体经济与数字经济深度融合、满足各行各业高质量通信服务需求的重任。 随着5G技术的更新迭代&#xff0c;各行各业对网络的可靠性&#xff0c;确定性等提出更高的需求&#xff0c;5G LAN作为3GPP R16标准定…

【CSS】网站 网格商品展示 模块制作 ( 清除浮动需求 | 没有设置高度的盒子且内部设置了浮动 | 使用双伪元素清除浮动 )

一、清除浮动需求 ( 没有设置高度的盒子且内部设置了浮动 ) 绘制的如下模块 : 在上面的盒子中 , 没有设置高度 , 只设置了一个 1215px 的宽度 ; 在列表中每个列表项都设置了 浮动 ; /* 网格商品展示 */ .box-bd {/* 处理列表间隙导致意外换行问题一排有 5 个 228x270 的盒子…

如何修改由 img 标签引入的 svg 图片颜色 (react环境)

网上试了好几个方法都不行&#xff0c;问了一下身边同事的处理方法&#xff0c;终于搞定了。话不多说&#xff0c;直接上代码&#xff1a; 此处是 jsx 中的图标引入 <img className{STYLE.contactIcon}onClick{() > {你的一些操作}} style{{WebkitMaskImage: url(${ite…

LibreOffice新一代的办公软件for Mac/Windows免费版

LibreOffice是一款免费、开源的办公软件套件&#xff0c;可在多个操作系统上运行&#xff0c;包括Windows、Mac和Linux。它提供了一系列功能强大的办公工具&#xff0c;包括文档处理、电子表格、演示文稿、数据库管理等。 LibreOffice的界面简洁直观&#xff0c;与其他流行的办…

【力扣每日一题】2023.8.26 汇总区间

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个有序数组&#xff0c;让我们把数组内的元素汇总区间&#xff0c;也就是说有一串数字是连续的&#xff0c;比如是 1 2 3 4…