机器学习测试笔记(20)——集成学习

简介: 机器学习测试笔记(20)——集成学习

1.概念


集成学习将多个训练的基础学习器进行结合,优化为更先进的学习器。集成学习模型的方式大致为以下几个:baggingboostingvotingstacking。它的特点是:

  • 初始化,对m个训练样本的数据集(不同颜色代表不同数据集),给每个样本分配初始权重(圆点越大,权重越大)
  • 使用带权重的数据集训练处一个弱学习器;
  • 对弱学习器训练的错误样本增加权重;
  • 新的带权重的数据集训练处下一个弱学习器;
  • 如此重复,直到训练处的弱学习器达到事先指定的N,最终将N个弱学习器加权融合。


sklearn中通过sklearn.ensemble包中实现。

2. 提升算法


提升算法是将一组弱学习器提升为强学习器的算法,也叫正向激励算法,最著名的是AdaBosst(adaptive boosting)算法。

image.png

                     

sklearn中通过sklearn.ensemble.AdaBoostClassifiersklearn.ensemble.AdaBoostRegressor来实现。


#AdaBoost提升算法
from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification
def my_AdaBoost():
    x,y =  make_classification(n_samples=100000,n_features=50,n_informative=30,n_clusters_per_class=3,random_state=11)
     x_train,x_test,y_train,y_test = train_test_split(x, y,  random_state=11)
    clf =  AdaBoostClassifier(n_estimators=50,random_state=11)
    clf.fit(x_train,y_train)
     plt.rcParams['font.family'] = ['sans-serif']
     plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.title(u"集成精确率")
    plt.ylabel(u"准确率")
    plt.xlabel(u"集成学习中学习器的数量")
     plt.plot(range(1,51),[accuracy for accuracy in  clf.staged_score(x_test,y_test)])
    plt.show()

image.png


可以看出随着学习器中及学习器数量增加,准确率随之增加。

现在我们来装在红酒数据,来看一下sklearn.ensemble.AdaBoostClassifiersklearn.ensemble.AdaBoostRegressor的表现。


AdaBoostClassifier


def my_AdaBoostClassifier():
        wine_dataset =  datasets.load_wine()
        X =  wine_dataset['data']
        y =  wine_dataset['target']
         X_train,X_test,y_train,y_test = train_test_split(X, y, random_state=0)
        clf =  AdaBoostClassifier(n_estimators=50,random_state=11)
         clf.fit(X_train,y_train)
        print('训练数据集的得分:{:.2%}'.format(clf.score(X_train,y_train)))
        print('测试数据集的得分:{:.2%}'.format(clf.score(X_test,y_test)))


输出

训练数据集的得分:94.74%
测试数据集的得分:86.67%


AdaBoostRegressor


def my_AdaBoostRegressor():
        wine_dataset =  datasets.load_wine()
        X =  wine_dataset['data']
        y =  wine_dataset['target']
         X_train,X_test,y_train,y_test = train_test_split(X, y, random_state=0)
        clf = AdaBoostRegressor(n_estimators=50,random_state=11)
         clf.fit(X_train,y_train)
        print('训练数据集的得分:{:.2%}:'.format(clf.score(X_train,y_train)))
        print('测试数据集的得分:{:.2%}:'.format(clf.score(X_test,y_test)))


输出

训练数据集的得分:100.00%
测试数据集的得分:95.56%


3. 装袋算法


Bagging算法 (英语:Bootstrap aggregating,引导聚集算法),又称装袋算法,是机器学习领域的一种团体学习算法。最初由Leo Breiman1994年提出。Bagging算法可与其他分类、回归算法结合,提高其准确率、稳定性的同时,通过降低结果的方差,避免过拟合的发生。m个样本原始数据进行n次抽样(n<=m)


  • 形成一个构成n个样本的新的训练数据集的训练模型
  • 重复T次,得到T个模型
  • 有新样本进行预测,采用投票方式(分类问题)或求平均值方式(回归问题)得到新样本的预测结果

特点

  • 平行合奏:每个模型独立构建
  • 旨在减少方差,而不是偏差
  • 适用于高方差低偏差模型(复杂模型)
  • 基于树的方法的示例是随机森林,其开发完全生长的树(注意,RF修改生长的过程以减少树之间的相关性)


Sklearn中通过BaggingClassifierBaggingRegressor实现装袋算法


from sklearn.svm import SVC
from sklearn.ensemble import BaggingClassifier
from sklearn.datasets import make_classification
def my_BaggingClassifier():
        iris =  datasets.load_iris()
        X = iris.data
        y = iris.target
         X_train,X_test,y_train,y_test = train_test_split(X, y, test_size=0.3)
        clf =  BaggingClassifier(base_estimator=SVC(),n_estimators=10, random_state=4)
         clf.fit(X_train,y_train)
        print('训练数据集的得分:{:.2%}'.format(clf.score(X_train,y_train)))
        print('测试数据集的得分:{:.2%}'.format(clf.score(X_test,y_test)))
         plt.plot(X_test,y_test)
        plt.show()


输出

训练数据集的得分:96.19%
测试数据集的得分:91.11%

image.png

输出

def my_BaggingRegressor():
        iris =  datasets.load_iris()
        X = iris.data
        y = iris.target
         X_train,X_test,y_train,y_test = train_test_split(X, y, test_size=0.3)
        clf =  BaggingRegressor(base_estimator=SVC(),n_estimators=10, random_state=4)
         clf.fit(X_train,y_train)
        print('训练数据集的得分:{:.2%}'.format(clf.score(X_train,y_train)))
        print('测试数据集的得分:{:.2%}'.format(clf.score(X_test,y_test)))
         plt.plot(X_test,y_test)
        plt.show()
训练数据集的得分:96.55%
测试数据集的得分:95.55%


4. 随机森林



随机森林是一种特殊的装袋算法,参见随机森林部分


5. 投票分类


投票分类分为Hard VotingSoft Voting

Hard Voting

模型

A得分

B得分

获胜者

1

99%

1%

A

2

49%

51%

B

3

40%

60%

B

4

90%

10%

A

5

30%

70%

B

A:两票、B三票,B获胜


 

Soft Voting

模型

A得分

B得分

1

99%

1%

2

49%

51%

3

40%

60%

4

90%

10%

5

30%

70%

A(99%+49%+40%+90%+30%)/5=61.6%

B(1%+51%+60%+10%+70%)/5=38.4%

A获胜


Sklearn中通过sklearn.ensemble.VotingClassifier实现投票分类算法


from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import VotingClassifier
def my_Voting():
    X, y =  datasets.make_moons(n_samples=500, noise=0.3, random_state=42)
    X_train, X_test,  y_train, y_test = train_test_split(X, y, random_state=42)
    voting_clf =  VotingClassifier(estimators=[('log_clf', LogisticRegression()),('svm_clf',  SVC()),('dt_clf', DecisionTreeClassifier(random_state=666))], voting='hard')
    voting_clf.fit(X_train,  y_train)
    print(' hard Voting训练数据集的得分:{:.2%}'.format(voting_clf.score(X_train,  y_train)))
    print(' hard Voting测试数据集的得分:{:.2%}'.format(voting_clf.score(X_test,  y_test)))
    voting_clf =  VotingClassifier(estimators=[('log_clf', LogisticRegression()),('svm_clf',  SVC(probability=True)),('dt_clf', DecisionTreeClassifier(random_state=666))],  voting='soft')
    voting_clf.fit(X_train,  y_train)
    print('soft Voting训练数据集的得分:{:.2%}'.format(voting_clf.score(X_train,  y_train)))
    print('soft Voting测试数据集的得分:{:.2%}'.format(voting_clf.score(X_test,  y_test)))


输出

hard Voting训练数据集的得分:93.60%
hard Voting测试数据集的得分:90.40%
soft Voting训练数据集的得分:96.53%
soft Voting测试数据集的得分:90.40%


6. 堆叠分类


image.png

stacking严格来说并不是一种算法,而是精美而又复杂的,对模型集成的一种策略。


  1. 首先我们会得到两组数据:训练集和测试集。将训练集分成5份:train1,train2,train3,train4,train5
  2. 选定基模型。这里假定我们选择了xgboost, lightgbm randomforest 这三种作为基模型。比如xgboost模型部分:依次用train1,train2,train3,train4,train5作为验证集,其余4份作为训练集,进行5折交叉验证进行模型训练;再在测试集上进行预测。这样会得到在训练集上由xgboost模型训练出来的5predictions,和在测试集上的1份预测值B1。将这五份纵向重叠合并起来得到A1lightgbmrandomforest模型部分同理。
  3. 三个基模型训练完毕后,将三个模型在训练集上的预测值作为分别作为3"特征"A1,A2,A3,使用LR模型进行训练,建立LR模型。
  4. 使用训练好的LR模型,在三个基模型之前在测试集上的预测值所构建的三个"特征"的值(B1,B2,B3)上,进行预测,得出最终的预测类别或概率。

stacking,首先需要安装mlxtend库。安装方法:进入Anaconda Prompt,输入命令 pip install mlxtend 即可。


通过mlxtend.classifier.StackingClassifier实现投票分类算法


from mlxtend.classifier import StackingClassifier
from mlxtend.feature_selection import ColumnSelector
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
def my_StackingClassifier_1():
    iris = load_iris()
    X = iris.data
    y = iris.target
    X_train, X_test,  y_train, y_test = train_test_split(X, y, random_state=42)
#基分类器1:xgboost
    pipe1 =  make_pipeline(ColumnSelector(cols=(0, 2)),AdaBoostClassifier())
#基分类器2:RandomForest
    pipe2 =  make_pipeline(ColumnSelector(cols=(1, 2, 3)),RandomForestClassifier()) 
    sclf =  StackingClassifier(classifiers=[pipe1, pipe2],  meta_classifier=LogisticRegression())
    sclf.fit(X_train,  y_train)
    print('StackingClassifier训练数据集的得分:{:.2%}'.format(sclf.score(X_train,  y_train)))
     print('StackingClassifier测试数据集的得分:{:.2%}'.format(sclf.score(X_test, y_test)))


输出

StackingClassifier训练数据集的得分:100.00%
StackingClassifier测试数据集的得分:100.00%


再来看一个

from mlxtend.classifier import StackingClassifier
from mlxtend.feature_selection import ColumnSelector
from sklearn.pipeline import make_pipeline
from sklearn.ensemble import RandomForestClassifier
def my_StackingClassifier_1():
        iris =  datasets.load_iris()
        X = iris.data
        y = iris.target
        X_train, X_test,  y_train, y_test = train_test_split(X, y, random_state=42)
#基分类器1:AdaBoostClassifier
        pipe1 =  make_pipeline(ColumnSelector(cols=(0, 2)),AdaBoostClassifier())
#基分类器2:RandomForest
        pipe2 =  make_pipeline(ColumnSelector(cols=(1, 2, 3)),RandomForestClassifier()) 
        sclf =  StackingClassifier(classifiers=[pipe1, pipe2],  meta_classifier=LogisticRegression())
        sclf.fit(X_train,  y_train)
        print('StackingClassifier训练数据集的得分:{:.2%}'.format(sclf.score(X_train,  y_train)))
         print('StackingClassifier测试数据集的得分:{:.2%}'.format(sclf.score(X_test, y_test)))


输出

5-fold cross validation:
Accuracy: 0.86 (+/- 0.10) [adaboost]
Accuracy: 0.95 (+/- 0.03) [lightgbm]
Accuracy: 0.94 (+/- 0.04) [Random Forest]
Accuracy: 0.94 (+/- 0.04) [StackingClassifier]

—————————————————————————————————


软件安全测试

https://study.163.com/course/courseMain.htm?courseId=1209779852&share=2&shareId=480000002205486

接口自动化测试

https://study.163.com/course/courseMain.htm?courseId=1209794815&share=2&shareId=480000002205486

DevOps 和Jenkins之DevOps

https://study.163.com/course/courseMain.htm?courseId=1209817844&share=2&shareId=480000002205486

DevOps与Jenkins 2.0之Jenkins

https://study.163.com/course/courseMain.htm?courseId=1209819843&share=2&shareId=480000002205486

Selenium自动化测试

https://study.163.com/course/courseMain.htm?courseId=1209835807&share=2&shareId=480000002205486

性能测试第1季:性能测试基础知识

https://study.163.com/course/courseMain.htm?courseId=1209852815&share=2&shareId=480000002205486

性能测试第2季:LoadRunner12使用

https://study.163.com/course/courseMain.htm?courseId=1209980013&share=2&shareId=480000002205486

性能测试第3季:JMeter工具使用

https://study.163.com/course/courseMain.htm?courseId=1209903814&share=2&shareId=480000002205486

性能测试第4季:监控与调优

https://study.163.com/course/courseMain.htm?courseId=1209959801&share=2&shareId=480000002205486

Django入门

https://study.163.com/course/courseMain.htm?courseId=1210020806&share=2&shareId=480000002205486

啄木鸟顾老师漫谈软件测试

https://study.163.com/course/courseMain.htm?courseId=1209958326&share=2&shareId=480000002205486

目录
相关文章
|
10月前
|
安全 关系型数据库 测试技术
学习Python Web开发的安全测试需要具备哪些知识?
学习Python Web开发的安全测试需要具备哪些知识?
197 61
|
7月前
|
存储 人工智能 测试技术
小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
141423 29
小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
|
10月前
|
敏捷开发 测试技术 持续交付
探索软件测试中的自动化与持续集成
在快速迭代的软件开发环境中,自动化测试和持续集成(CI)已成为确保产品质量和加速交付的关键策略。本文将深入探讨自动化测试的基本原理、实施步骤以及它如何与持续集成流程相结合,以提高软件开发的效率和可靠性。我们将通过实际案例分析,展示自动化测试和CI的最佳实践,以及它们如何帮助企业实现更快的市场响应时间和更高的客户满意度。
134 16
|
10月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
534 3
|
10月前
|
jenkins 测试技术 持续交付
软件测试中的自动化与持续集成:提升效率与质量的关键
在快节奏的软件开发环境中,自动化测试和持续集成已经成为不可或缺的部分。本文将探讨自动化测试和持续集成的重要性,以及它们如何协同工作以提高软件开发的效率和质量。通过分析自动化测试的策略、工具选择以及持续集成的实践,我们将揭示这些技术如何帮助开发团队快速响应变化,减少错误,并加速产品上市时间。
|
10月前
|
机器学习/深度学习 人工智能 jenkins
软件测试中的自动化与持续集成实践
在快速迭代的软件开发过程中,自动化测试和持续集成(CI)是确保代码质量和加速产品上市的关键。本文探讨了自动化测试的重要性、常见的自动化测试工具以及如何将自动化测试整合到持续集成流程中,以提高软件测试的效率和可靠性。通过案例分析,展示了自动化测试和持续集成在实际项目中的应用效果,并提供了实施建议。
|
10月前
|
前端开发 JavaScript 测试技术
前端测试技术中,如何提高集成测试的效率?
前端测试技术中,如何提高集成测试的效率?
|
7月前
|
人工智能 IDE 测试技术
用户说 | 通义灵码2.0,跨语言编码+自动生成单元测试+集成DeepSeek模型且免费使用
通义灵码, 作为国内首个 AI 程序员,从最开始的内测到公测,再到通义灵码正式发布第一时间使用,再到后来使用企业定制版的通义灵码,再再再到现在通义灵码2.0,我可以说“用着”通义灵码成长的为数不多的程序员之一了吧。咱闲言少叙,直奔主题!今天,我会聊一聊通义灵码的新功能和通义灵码2.0与1.0的体验感。
|
7月前
|
人工智能 自然语言处理 搜索推荐
云上玩转DeepSeek系列之三:PAI-RAG集成联网搜索,构建企业级智能助手
本文将为您带来“基于 PAI-RAG 构建 DeepSeek 联网搜索+企业级知识库助手服务”解决方案,PAI-RAG 提供全面的生态能力,支持一键部署至企业微信、微信公众号、钉钉群聊机器人等,助力打造多场景的AI助理,全面提升业务效率与用户体验。
|
9月前
|
jenkins 测试技术 持续交付
软件测试中的自动化与持续集成
在现代软件开发过程中,自动化测试和持续集成已成为不可或缺的组成部分。本文将深入探讨自动化测试和持续集成的重要性、优势以及如何有效实施它们以提升软件质量和开发效率。通过具体案例分析,我们将展示这些技术如何在实际项目中发挥作用,并讨论其面临的挑战及应对策略。
224 60

热门文章

最新文章