当前位置: 首页 > news >正文

机器学习基础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)

相关文章:

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

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

C++ sort与优先队列排序的区别

int main() {vector<int> data{3, 1, 2};cout << "从小到大排序" << endl;sort(data.begin(), data.end(), std::less<int>());printContainer(data);auto cmp1 [](int x, int y) { return x < y; };sort(data.begin(), data.end(), cmp…...

【Rust】Rust学习 第十九章高级特征

现在我们已经学习了 Rust 编程语言中最常用的部分。在第二十章开始另一个新项目之前&#xff0c;让我们聊聊一些总有一天你会遇上的部分内容。你可以将本章作为不经意间遇到未知的内容时的参考。本章将要学习的功能在一些非常特定的场景下很有用处。虽然很少会碰到它们&#xf…...

C++ 纯虚函数和虚函数的区别

在 C 中&#xff0c;虚函数&#xff08;Virtual Function&#xff09;和纯虚函数&#xff08;Pure Virtual Function&#xff09;都是用于实现多态性的机制&#xff0c;但它们之间有一些关键的不同。 虚函数&#xff08;Virtual Function&#xff09; 定义&#xff1a;在基类…...

Go中的有限状态机FSM的详细介绍 _

1、FSM简介 1.1 有限状态机的定义 有限状态机&#xff08;Finite State Machine&#xff0c;FSM&#xff09;是一种数学模型&#xff0c;用于描述系统在不同状态下的行为和转移条件。 状态机有三个组成部分&#xff1a;状态&#xff08;State&#xff09;、事件&#xff08;…...

Python入门教程 | Python3 基本数据类型

赋值 Python 中的变量不需要声明。每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。 在 Python 中&#xff0c;变量就是变量&#xff0c;它没有类型&#xff0c;我们所说的"类型"是变量所指的内存中对象的类型。 等号&#xff08;&#xff…...

STM32移植u8g2玩转oled 用软件iic实现驱动oled

移植u8g2到stm int fputc(int ch,FILE *f) {ITM_SendChar(ch);return (ch); }void delay_us(uint32_t time) {uint32_t i8*time;while(i--); }uint8_t STM32_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) {//printf("%s:msg %d,arg_int …...

C++ 学习系列 -- string 实现

string是C标准库的重要部分&#xff0c;主要用于字符串处理。这里我们自己实现一个简单版本的 string. 一 思路 string 类中应该包含如下&#xff1a; 1. 类成员变量&#xff1a;char* m_data&#xff0c;利用 char* 指针存放字符串 2. 成员函数&#xff1a; 2.1 size(…...

C语言小练习(三)

&#x1f31e; “也许你感觉自己与周遭格格不入&#xff0c;但正是那些你一人度过的时光&#xff0c;让你变得越来越有意思&#xff0c;等有天别人终于注意到你的时候&#xff0c;他们就会发现一个比他们想象中更酷的人。”-《生活大爆炸》 Day03 &#x1f4dd; 一.选择题&…...

2023 js逆向爬虫 有道翻译 代码

前置条件&#xff1a;nodejs环境、安装 crypto 和 python3环境 js.js文件&#xff1a; const crypto require("crypto")function decode(resp_data) {g_o ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHlg_n ydsecre…...

【物联网无线通信技术】NFC从理论到实践(FM17XX)

NFC&#xff0c;全称是Near Field Communication&#xff0c;即“近场通信”&#xff0c;也叫“近距离无线通信”。NFC诞生于2004年&#xff0c;是基于RFID非接触式射频识别技术演变而来&#xff0c;由当时的龙头企业NXP(原飞利浦半导体)、诺基亚以及索尼联合发起。NFC采用13.5…...

Python爬虫猿人学逆向系列——第六题

题目&#xff1a;采集全部5页的彩票数据&#xff0c;计算全部中奖的总金额&#xff08;包含一、二、三等奖&#xff09; 地址&#xff1a;https://match.yuanrenxue.cn/match/6 本题比较简单&#xff0c;只是容易踩坑。话不多说请看分析。 两个参数&#xff0c;一个m一个f&…...

idea使用tomcat

1. 建立javaweb项目 2. /WEB-INF/web.xml项目配置文件 如果javaweb项目 先建立项目&#xff0c;然后在项目上添加框架支持&#xff0c;选择javaee 3. 项目结构 4.执行测试&#xff1a;...

搭建Tomcat HTTP服务:在Windows上实现外网远程访问的详细配置与设置教程

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器&#xff0c;不仅名字很有趣&#xff0…...

Java学习笔记——继承(包括this,super的使用总结)

继承&#xff1a; 使用情景&#xff1a;当类与类之间&#xff0c;存在相同&#xff08;共性&#xff09;的内容&#xff0c;并满足子类是父类的一种&#xff0c;就可以考虑使用继承&#xff0c;来优化代码 Java中提供一个关键字extends&#xff0c;用这个关键字&#xff0c;我…...

Android 获取应用sha1和sha256

在 Android 应用开发中&#xff0c;SHA-1&#xff08;Secure Hash Algorithm 1&#xff09;值是一种哈希算法&#xff0c;常用于生成应用的数字签名。这个数字签名用于验证应用的身份&#xff0c;并确保应用在发布到设备上时没有被篡改。 以下是生成 Android 应用的 SHA-1 值的…...

c# 方法参数修饰符(out、ref、in)的区别

在C#中&#xff0c;ref、out和in是三种方法参数修饰符&#xff0c;它们在传递参数的方式和作用上有所不同。 ref修饰符&#xff1a; 传递方式&#xff1a;使用ref修饰符的参数可以是输入输出参数&#xff0c;即在方法调用前后都可以对其进行修改。 作用&#xff1a;通过ref修…...

shell 编写一个带有进度条的程序安装脚本

需求 使用 shell 写一个 软件安装脚本&#xff0c;带有进度条 示例 #!/bin/bash# 模拟软件安装的步骤列表 steps("解压文件" "安装依赖" "配置设置" "复制文件" "")# 计算总步骤数 total_steps${#steps[]}# 安装进度的初…...

服务器数据恢复-AIX PV完整镜像方法以及误删LV的数据恢复方案

AIX中的PV相当于物理磁盘&#xff08;针对于存储来说&#xff0c;PV相当于存储映射过来的卷&#xff1b;针对操作系统来说&#xff0c;PV相当于物理硬盘&#xff09;&#xff0c;若干个PV组成一个VG&#xff0c;AIX可以将容量不同的存储空间组合起来统一分配。AIX把同一个VG的所…...

首席执行官Adam Selipsky解读“亚马逊云科技的技术产品差异化”

迄今为止&#xff0c;亚马逊云科技已经参与了21世纪几乎所有的大型计算变革&#xff0c;亚马逊云科技是一个很传奇的故事&#xff0c;它始于大约20年前的一项实验&#xff0c;当时亚马逊试图出售其过剩的服务器。人们确实对此表示怀疑。为什么在线书店试图销售云服务&#xff1…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...