使用sklearn中的Adaboost分类器来实现ORL人脸分类

前言:博主上网浏览使用Adaboost实现人脸分类时,发现并没有分类,大部分全都是关于人脸识别检测的,并没有实现对某个人的精准分类(例如,这个人叫什么名字),有关ORL识别的,大多是用PCA降维或者SVM实现的,也没有用Adaboost的,故因此写了个随笔。

算法原理

算法过程:

假设我们有个二分类训练数据集T={(x1,y1),...,(xN,yN)},yi∈{−1,+1}.

  • 1)在刚开始,我们让每个变量xi都有相同的权重,也就是说,刚开始每个样本在基分类器中的作用相同。

    ​ Dj = (wj1,wj2,…. wji,…. wjN) wjN = 1/N

    Dj表示权重分布的向量,其中j表示当前是第一轮因为后面还要进行很多轮学习,每次都会改变这个分布。wji表示第j轮对应的第xi变量

  • 2)对 m = 1 , 2 , . . . , M ,共计M个基分类器 进行以下步骤:

    ①:学习得到基本分类器Gm(x)

    ​ 使用具有权值分布Dm的训练数据集进行学习,得到基本分类器Gm(x),Gm(x)可以根据输入给出 +1 或 -1 的输出

    ②:计算单个基分类器的分类误差率em

    ​ em = \(\sum_{i=1}^N\) wmi I(Gm(xi) \(\neq\)yi)

    这个公式什么意思呢:对于第m轮的误差 em,有对应xi对应的权重wmi,I 是指示函数,当后面括号里的式子成立就取1,不成立就取0, i = 1 ,2,…N 所有的xi 所以 em 就是把所有分类错误的样本权重加起来,如果初始权重相等,那么5个样本分错2个,错误率就是0.4,如果权重是[0.5,0.1,0.1,0.1,0.1,0.1],而权重为0.5的样本分错了,最后错误率就是0.5。因此这个设计使得,将权重高的样本分类正确能显著降低分类误差率。

    ③:计算 Gm(x) 的分类器投票权重αm(即在最终结果所占的重要性)

    假设em = 0.3,即分类误差较小,错误率较小,则,α较大。

    对于二分类问题,错误率超过0.5的话,只要进行简单的完全反转就可以使其降到0.5以下。举例来说,若 分类结果为 [1,1,1,-1] 错误率0.75,那么只要改成 [-1,-1,-1,1] 错误率就只有0.25了。(另一种想法是随机分类的错误率是0.5,弱学习器虽然弱,正确率也是要略高于随机分类的。

    ④:更新训练集的权重分布

    对于第m+1轮:

    wm+1,i = \(w_{mi}e^{-α_my_iG_m(x_i)}/Z_m\)

    其中,$Z_m = \sum_{i=1}Ne $

  • 得到最终分类器

代码实现

实验平台:kaggle 在线notebook kaggle具有不用配环境,有大量在线公共数据集,省去了很多麻烦

ORL数据集

我们采用公共数据库,进行算法实现。

选取ORL人脸数据库作为实验样本,总共40个人,每人10幅图像,图像大小为 112*92 像素。图像本身已经经过处理,不需要进行归一化和校准等工作。实验样本分为训 练样本和测试样本。首先设置训练样本集,选择40个人前6张图片作为训练样本,进行训练。然后设置测试样本集,将40个人后4张图片作为测试样本,进行选取识别。

该数据集来源:https://www.kaggle.com/datasets/jagadeeshkasaraneni/orlfaces

具体代码:

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv) import os
for dirname, _, filenames in os.walk('/kaggle/input'):
for filename in filenames:
print(os.path.join(dirname, filename))

输出:/kaggle/input/orlfaces/ORL_faces.npz

orlfaces = np.load("/kaggle/input/orlfaces/ORL_faces.npz")
orlfaces.files

输出:['testY', 'testX', 'trainX', 'trainY']

该数据集中的训练集和测试集已经给我们划分好了 训练集60% 测试集40%

print(orlfaces['trainX'].shape)
print(orlfaces['testX'].shape)

输出:(240, 10304)

(160, 10304)

240是指总共有24个人的图片,每个人有10张,所以是240

测试集共有16个人,因此第一维的值为160

112 * 92 = 10304,即我们要的图片是112 * 92的,他放在同一维度了,所以是10304

X_train = np.reshape(orlfaces['trainX'], (240, 112, 92))
Y_train = orlfaces['trainY']
X_test = np.reshape(orlfaces['testX'], (160, 112, 92))
Y_test = orlfaces['testY']
print(Y_train.shape)
Y_train

输出:

(240,)

array([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,

1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,

2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4,

4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,

5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7,

7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8,

8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,

9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11,

11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12,

12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14,

14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15,

15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,

17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18,

18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,

19, 19], dtype=uint8)

我们只展示其中3张图片:

## import matplotlib.pyplot as plt
%matplotlib inline def show_images(images) -> None:
n: int = len(images)
for i in range(10): # 图片太多了,展示10张图片算了吧 否则这里填 range(n)
plt.figure()
plt.imshow(images[i]) show_images(X_train)

输出:

多余图片省略...

from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score # 假设X_train和y_train是训练样本和标签,X_test和y_test是测试样本和标签
# 这里需要根据实际的图像数据来加载和预处理 # 初始化Adaboost分类器
ada_clf = AdaBoostClassifier(n_estimators=200,learning_rate = 0.1, random_state=42) # 训练模型
ada_clf.fit(X_train.reshape(-1,112*92),Y_train) # Adaboost分类器要求X_train维度 <= 2 # 预测测试样本
Y_pred = ada_clf.predict(X_test.reshape(-1,112*92)) # 计算准确率
accuracy = accuracy_score(Y_test, Y_pred)
print(f"识别准确率: {accuracy:.2f}")

输出:

识别准确率: 0.76

print(Y_test,Y_pred)

我们可以将预测Y和真实Y打印出来,进行比较,准确率为0.76

我们可以调整n_estimators,learning_rate , random_stat取值,来提升准确率:

  • n_estimators:这个参数指定了要使用的弱分类器的数量。n_estimators的值越大,意味着更多的弱分类器会被用来构建强分类器。这可能会导致更好的性能,但也会增加模型的复杂度和训练时间。
  • learning_rate:这个参数是每个弱分类器对最终预测的贡献率。在AdaBoost算法中,每个弱分类器的权重与其准确性成比例。learning_rate参数控制这个比例的大小。较小的learning_rate`意味着每个弱分类器对最终结果的影响较小,可能需要更多的弱分类器来达到相同的效果。
  • random_state:这个参数用于控制随机数生成器的种子,以确保结果的可重复性。设置random_state`可以确保每次运行代码时,只要输入数据不变,得到的结果都是相同的。这对于调试和实验是非常重要的,因为它允许研究人员比较不同模型或参数设置的效果。

参考

https://blog.csdn.net/codelady_g/article/details/122571189

https://www.kaggle.com/code/jagadeeshkasaraneni/orlfacerecognition/notebook

使用sklearn中的Adaboost分类器来实现ORL人脸分类的更多相关文章

  1. 『Kaggle』Sklearn中几种分类器的调用&词袋建立

    几种分类器的基本调用方法 本节的目的是基本的使用这些工具,达到熟悉sklearn的流程而已,既不会设计超参数的选择原理(后面会进行介绍),也不会介绍数学原理(应该不会涉及了,打公式超麻烦,而且近期也没 ...

  2. 使用OpenCV训练Haar like+Adaboost分类器的常见问题

    <FAQ:OpenCV Haartraining>——使用OpenCV训练Haar like+Adaboost分类器的常见问题 最近使用OpenCV训练Haar like+Adaboost ...

  3. 入门系列之Scikit-learn在Python中构建机器学习分类器

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由信姜缘 发表于云+社区专栏 介绍 机器学习是计算机科学.人工智能和统计学的研究领域.机器学习的重点是训练算法以学习模式并根据数据进行预 ...

  4. sklearn中的损失函数

    python风控评分卡建模和风控常识(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005214003&am ...

  5. Sklearn中的回归和分类算法

    一.sklearn中自带的回归算法 1. 算法 来自:https://my.oschina.net/kilosnow/blog/1619605 另外,skilearn中自带保存模型的方法,可以把训练完 ...

  6. sklearn中的模型评估-构建评估函数

    1.介绍 有三种不同的方法来评估一个模型的预测质量: estimator的score方法:sklearn中的estimator都具有一个score方法,它提供了一个缺省的评估法则来解决问题. Scor ...

  7. OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别 标签: 脸部识别opencv 2017-07-03 21:38 26人阅读

    上一篇文章中介绍了如何使用OpenCV自带的haar分类器进行人脸识别(点我打开). 这次我试着自己去训练一个haar分类器,前后花了两天,最后总算是训练完了.不过效果并不是特别理想,由于我是在自己的 ...

  8. 决策树在sklearn中的实现

    1 概述 1.1 决策树是如何工作的 1.2 构建决策树 1.2.1 ID3算法构建决策树 1.2.2 简单实例 1.2.3 ID3的局限性 1.3 C4.5算法 & CART算法 1.3.1 ...

  9. Sklearn 中的 CrossValidation 交叉验证

    1. 交叉验证概述 进行模型验证的一个重要目的是要选出一个最合适的模型,对于监督学习而言,我们希望模型对于未知数据的泛化能力强,所以就需要模型验证这一过程来体现不同的模型对于未知数据的表现效果. 最先 ...

  10. 机器学习:集成学习(集成学习思想、scikit-learn 中的集成分类器)

    一.集成学习的思想 集成学习的思路:一个问题(如分类问题),让多种算法参与预测(如下图中的算法都可以解决分类问题),在多个预测结果中,选择出现最多的预测类别做为该样本的最终预测类别: 生活中的集成思维 ...

随机推荐

  1. Maven经验分享(五)Maven拷贝资源

    上一章介绍使用ant拷贝资源,这里介绍maven拷贝资源,使用maven-resources-plugin插件. <plugin> <groupId>org.apache.ma ...

  2. PLC开发没有前景想转行嵌入式,找个培训机构还是自学?

    0. 粉丝提问 把粉丝的情况和问题总结起来,主要以下几点: 这位粉丝19年毕业,25岁,专业是是自动化,之前从事plc开发,现在在自学单片机,想转行做Linux相关开发 犹豫是自学还是报线下培训班? ...

  3. springboot踩坑&问题记录

    常见错误 莫名其妙 classes/:na 前往查看.yml 的配置问题 2.驼峰命名 是因为又用了xml配置,又在yml配置文件中用了mybatis的configuration配置,两个冲突了,不是 ...

  4. 在使用Nacos作为统一配置中心的时候,项目中使用@Value注解从Nacos获取值,一直报错Could not resolve placeholder 'blog.website' in value "${blog.website}".如下图:

    在使用Nacos作为统一配置中心的时候,项目中使用@Value注解从Nacos获取值,一直报错Could not resolve placeholder 'blog.website' in value ...

  5. 在 SQLAlchemy 中对数据异步处理的时候,获得关联集合的处理方式

    我们在定义SQLAlchemy对象模型的关系的时候,用到了relationship 来标识关系,其中 lazy 的参数有多种不同的加载策略,本篇随笔介绍它们之间的关系,以及在异步处理中的一些代码案例. ...

  6. Asp.net 获取客户端的信息

    Response.Write("客户端计算机名:" + Request.UserHostName + "<BR />"); Response.Wri ...

  7. 所见即所得,赋能RAG:PDF解析里的段落识别

    前几天,有一位用户使用OCR产品识别多栏论文后向我们询问:要怎么解决不合适的断句.分段以及错误阅读顺序的问题? 我们用一个相似案例为大家直观展示这位用户遇到的情况. 如图中的多栏期刊,如果用OCR识别 ...

  8. Identity – Authorize

    前言 Authorize 授权和 Identity Framework 关系不是很大. 虽然 Framework 有帮忙处理 Role, Claims 这些, 但这些只是整个 Authorize 小部 ...

  9. APP专项测试之兼容性测试

    1.APP 兼容性测试认识 随着 APP 应用范围越来越广,用户群体越来越大,终端设备的型号也越来越多,移动终端碎片化加剧,使得 APP 兼容性测试成为测试质量保障必须要考虑的环节. APP 兼容性测 ...

  10. (九)Redis 哨兵机制与集群

    主从复制中,如果从库发生故障了,客户端可以继续向主库或其他从库发送请求,但是如果主库发生故障了肿么办呢?读请求,那还可以由从库继续提供服务,写请求就么得办法了.此时,哨兵机制就登场了,解决3个问题: ...