python_sklearn机器学习算法系列之AdaBoost------人脸识别(PCA,决策树)

标签: 机器学习  AdaBoost  人工智能  人脸识别

          注:在读本文之前建议读一下之前的一片文章python_sklearn机器学习算法系列之PCA(主成分分析)------人脸识别(k-NearestNeighbor,KNN)

        本文主要目的是通过一个简单的小例子和很短的代码来快速学习python 中的sklearn.ensemble AdaBoost这一模块的基本操作和使用,注意不是用python纯粹从头到尾自己构建AdaBoost,既然sklearn提供了现成的我们直接拿来用就可以了,当然其原理十分重要,下面做简单介绍:

           其实说到AdaBoost就不得不提到bagging,那么它究竟是什么东东呢?它是一种自举汇聚发,比如现在有一个数据集M,我们每次从中有放回的抽取S个样本生成一个新的数据集合(注意这个集合里面可能包括多个重复的样本,也有可能不包括原数据集中有的样本),那么我们重复K次这样的操作就形成K个数据集对吧即N1,N2,N3……NK。每个数据集里面有S个样本,接下来将某个学习算法分别作用于每个数据集就得到S个分类(回归)器,当我们要对新数据进行分类(回归)时,就可以应用这S个分类(回归)器进行作业,与此同时,选择分类器中投票结果最多的类别作为最后分类结果(对于回归问题则采用S个结果的均值作为结果)(随机森林就是一种高级的bagging)。

          注意AdaBoost在分类和回归问题中都可以应运,原理大体相同,下面就都以分类来介绍。

           那么什么是boosting呢?它和bagging十分相似,但在其基础上增加了一些权值,即在下一次训练的时候会根据上一次训练结果改变样本的权值,即上一次分对的样本的权重会降低,相反则权重增加。另外它还对每个分类器分配了一个权重值alpha,这些alpha值是根据每个弱分类器(就是那些基本的分类器)的错误率进行计算的。

          总之一句话通过引入这些权重来进一步减低错误率,而本文AdaBoost全称是adaptive boosting(自适应boosting)属于boosting的一种,说到这里就要注意一下使用AdaBoost组合的弱分类器必须支持权重计算,小编当时就犯了这个低级错误,为了方便直接用了我上篇文章python_sklearn机器学习算法系列之PCA(主成分分析)------人脸识别(k-NearestNeighbor,KNN),而这篇文章中的弱分类器KNN并不支持权重计算,下面是我第一次运行结果可以看到相关的错误提示:


所以我们下面程序使用决策树这个弱分类,好了这些概念和它们之间的关系我们屡清后,我们看看python 中的sklearn.ensemble AdaBoost

它包含两个函数AdaBoostClassifier和AdaBoostRegresso顾名思义分别解决分类和回归问题接下来我们分别介绍

   对于AdaBoostClassifier()有几个比较重要的参数:(1) base_estimator就是指定我们要用的弱分类器,(2) algorithm是我们的AdaBoostClassifier选用什么算法,具体的有AMME和SAMME.R两者的主要区别就是后者使用概率作为我们上面介绍的权重,所以如果我们这里选用了SAMME.R算法那么base_estimator也要选有概率预测的弱分类器就是有没有predict_proba这一函数(3)n_estimators就是迭代的次数(4)learning_rate每个弱学习器的权重缩减系数

   注意AdaBoostClassifier调参主要就是n_estimatorslearning_rate,理论上两者越大越好,但不是绝对要联合调参

对于AdaBoostRegresso (1) base_estimator同上,(2)loss有是三个选项linear、square、exponential三种选择说白了就是对样本的误差处理对应为线性,平方和指数,默认为linear(3)n_estimators同上(4)learning_rate同上

     到此知识性的东西差不多讲解完了,接下来就让我们实践一下吧,再次说明:希望先看上一篇文章再来看下面的代码比较容易些,也对后面的对比有比较快的认识。

#PCA
import warnings
from sklearn import tree 
from sklearn import metrics 
from sklearn.cross_validation import train_test_split
from sklearn.datasets import fetch_lfw_people
from sklearn.decomposition import PCA
from sklearn.ensemble import AdaBoostClassifier

#忽略一些版本不兼容等警告
warnings.filterwarnings("ignore")

lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)

x=lfw_people.data
n_features=x.shape[1]
y=lfw_people.target
target_names=lfw_people.target_names

#分割训练集和测试集
x_train,x_test,y_train,y_test = train_test_split(x, y, test_size=0.6)
#先训练PCA模型
PCA=PCA(n_components=100).fit(x_train)
#返回测试集和训练集降维后的数据集
x_train_pca = PCA.transform(x_train)
x_test_pca = PCA.transform(x_test)


#决策树核心代码  
clf = tree.DecisionTreeClassifier(criterion='entropy')   
clf.fit(x_train_pca, y_train)                    

#声明使用AdaBoostClassifier
Ada1 = AdaBoostClassifier(tree.DecisionTreeClassifier(criterion='entropy'),
                         n_estimators=100,algorithm="SAMME", learning_rate=0.2)
Ada1.fit(x_train_pca,y_train)                                                                  #训练


Ada2 = AdaBoostClassifier(tree.DecisionTreeClassifier(criterion='entropy'),
                         n_estimators=300,algorithm="SAMME",learning_rate=0.2)
Ada2.fit(x_train_pca,y_train)   


#识别测试集中的人脸
y_test_predict1=clf.predict(x_test_pca)
y_test_predict2=Ada1.predict(x_test_pca)
y_test_predict3=Ada2.predict(x_test_pca)

'''
#输出
for i in range(len(y_test_predict)):
    print(target_names[y_test_predict[i]])
    
'''
print("------------------------------------------------未使用AdaBoost之前------------------------------------------")
print(clf.score(x_test_pca, y_test))                         #预测准确率  
print(metrics.classification_report(y_test,y_test_predict1)) #包含准确率,召回率等信息表  
print(metrics.confusion_matrix(y_test,y_test_predict1))      #混淆矩阵



print("--------------------------------使用AdaBoost之后:n_estimators=100, learning_rate=0.2-------------------------")
print(Ada1.score(x_test_pca, y_test))                        #预测准确率  
print(metrics.classification_report(y_test,y_test_predict2)) #包含准确率,召回率等信息表  
print(metrics.confusion_matrix(y_test,y_test_predict2))      #混淆矩阵


print("--------------------------------使用AdaBoost之后:n_estimators=300, learning_rate=0.2-------------------------")
print(Ada2.score(x_test_pca, y_test))                        #预测准确率  
print(metrics.classification_report(y_test,y_test_predict3)) #包含准确率,召回率等信息表  
print(metrics.confusion_matrix(y_test,y_test_predict3))      #混淆矩阵

运行结果:


可以看到准确率逐渐增加,当然了使用了AdaBoost并不一定就比没使用的准确率高,而且使用了AdaBoost后根据不同的参数还会得出不同的准确率,小编在运行的时候就碰到很多次没使用AdaBoost时准确率最高,我想可能是因为没使用AdaBoost的时候毕竟可以达到不遗漏的训练全部样本,反而使用了AdaBoost可能遗漏了一些样本,而重复了使用了很多一样的样本,总之实际情况还需多加调试才能得到比较好的效果!

更多算法可以参看博主其他文章,或者github:https://github.com/Mryangkaitong/python-Machine-learning

版权声明:本文为weixin_42001089原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42001089/article/details/79997405

智能推荐

SpringBoot 使用freemarker 处理文档,找不到文件位置(报错:basePackagePath=““ /* relatively to resourceLoaderClass pkg)

在Spring Boot中加载word的文档的时候,加载ftl文档的位置应该是从 target目录下面去加载的(不太确定),不是像大多数情况这样根据类的路径去加载。SpringBoot加载的位置应该是从 “resources”文件下面开始,如果放到“resources”的根目录下面需要加一道“/”斜线。 类似于: config...

剑指offer 合并两个排序的链表

题目 链接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/ 思路 我想的是,与合并两个有序数组一样的思维,新建一个链表,然后判断谁的值大,进而在新的链表上面进行插入。 看书思路 合并链表是一个递归问题:合并一个节点后可以转化为一个子问题。终止条件是其中一个链表为空 代码 链表反转也可以用递归解决...

Java编程思想 第三章:操作符

Java中的操作符和c/c++中的操作符基本一致,因为我之前学习过C语言和C++,所以本章的内容大部分都已熟知,下面只做简单的介绍。 Java操作符及优先级 Java中的操作符包括算术操作符,关系操作符,逻辑操作符,位运算符、自操作运算符、移位运算符、赋值运算符和其他运算符。 算术操作符:包括加减乘除和取余(%),优先级乘除取余高于加减,都是双元运算符,其中加法(+)可以用来连接两个字符串,比如:...

JetBrains 系列开发工具,如何配置 `SCSS` `File Watcher` ,相关输出配置参数详解:webStorm phpStorm IDEA

JetBrains 系列开发工具,如何配置 SCSS File Watcher ,相关输出配置参数详解:webStorm phpStorm IDEA 前言 你目前已经了解了如何使用 SCSS 进行开发,了解了该文章的内容:『 SCSS 日常用法 』 在 JetBrains 系列开发工具中通过 FileWatcher 进行编译的 SCSS 文件都是通过 sass 这个程序进行的。『 如何添加 Fil...

C语言小函数—二进制与十六进制

测试如下 “` int main() { long int num = 15; } “`...

猜你喜欢

仿微博或微信的文章多图显示(自定义MultiImageView)

按照一般的规矩,先上张图来供大伙看看 如果大致是大伙们需要实现的功能,不烦一观 自定义MultiImageView 工具类 具体使用 app.gradle中添加依赖 implementation 'com.github.bumptech.glide:glide:4.8.0' AndroidManifest.xml中配置联网权限 <uses-permission android:name=&q...

经典进程同步和互斥问题

经典进程同步与互斥问题 前言 一、生产者-消费者问题 1.问题描述 2.问题分析 3.代码 二、读者-写者问题 1.问题描述&&分析 2.代码 三、哲学家进餐问题 1.问题描述&&分析 2.代码 四、理发师问题 1.问题描述&&分析 2.代码 前言 在多道程序设计环境中,进程同步是一个非常重要的问题,下面讨论几个经典的进程同步问题。 一、生产者-消费...

java设计模式——ThreadLocal线程单例

1、定义一个ThreadLocal线程单例,代码如下: 2、定义一个多线程类,代码如下: 3、定义一个测试类,代码如下: 4、输出结果,如下图:...

【tensorflow】线性模型实战

线性模型:y = 1.477 * x + 0.089   1. 采样数据 采样噪声eps在均值0,方差0.01的高斯分布中,而后在均匀分布U(0,1)中,区间[-10,10]进行n=100次随机采样:   2. 计算误差 循环计算每个点的预测值与真是值之间差的平方并累加,从而获得训练集上的均芳误差损失值。   3. 计算梯度   4. 梯度更新 对权重w和偏...

常见损失函数和评价指标总结(附公式&代码)

网上看到一篇很实用的帖子关于常见损失函数和评价指标,收藏下来 本文转载于https://zhuanlan.zhihu.com/p/91511706 ------------------------------------------------------------------------------------------------------------------------------...