python归一化 增大差异_机器学习实验二-集成学习

本文通过对比分析,展示了在WEBSPAM-UK2006数据集上,集成学习算法如Bagging和AdaBoost.M1与SVM、DTree和KNN等基本分类器结合的效果。实验表明,归一化处理对于SVM和KNN的性能至关重要,特别是对基于距离的分类器。Bagging + DTree组合表现出最佳的稳定性和准确性。此外,调整SVM的参数如C值,可以避免过拟合并提升性能。
摘要由CSDN通过智能技术生成

本实验采用的数据集是 WEBSPAM-UK2006 数据集, 数据集中包含1803个垃圾网站,4411个正常网站,每个网站有96个内容特征,有138个超链接标签。这138个超链接标签可以被分为五类:Degree-related features, PageRank-related features, TrustRank-related features, Truncated PageRank-related features, Supporter-related features

在本实验中,需要将数据集划分为4:1的训练集和测试集

实验任务

比较由不同的基本分类器组成的不同的集成学习算法的性能

至少需要包含Bagging 算法和 AdaBoost.M1算法

至少需要使用SVM和Decision Tree两种基本分类器算法

至少需要完成的算法组合为:Bagging + DTree, Bagging + SVM, AdaBoost.M1 + DTree, AdaBoost.M1 + SVM.

扩展任务

尝试其他的基本分类器(K-NN, Naive Bayes…)

分析不同的特征的影响(比如可以只使用内容特征,或者只使用链接特征,或者进行特征组合)

考虑特征缩放(归一化)来提高性能

数据集是不平衡的,如何克服

实验设计

基础分类器选取了SVM,Dtree, 和KNN

基础分类器采用了sklearn的包,由于KNN算法无法设置训练样本的权中,因此进行了如下组合:

Bagging + DTree

Bagging + SVM

Bagging + KNN

AdaBoost.M1 + DTree

AdaBoost.M1 + SVM.

实验结果

针对Bagging和AdaBoost.M1集成学习算法 分别使用SVM,Dtree,KNN等基本分类器进行组合后,并且设置了不同的训练集大小,迭代次数(分类器个数),测试后的总体结果如下:

Bagging

SVM

1

994

0.886565

Bagging

Decision Tree

1

994

0.824618

Bagging

KNN

1

994

0.849558

AdaBoost.M1

SVM

1

994

0.884956

AdaBoost.M1

Decision Tree

1

994

0.847949

Bagging

SVM

21

994

0.881738

Bagging

Decision Tree

21

994

0.913113

Bagging

KNN

21

994

0.881738

AdaBoost.M1

SVM

21

994

0.862430

AdaBoost.M1

Decision Tree

21

994

0.881738

Bagging

SVM

41

994

0.913113

Bagging

Decision Tree

41

994

0.900241

Bagging

KNN

41

994

0.884151

AdaBoost.M1

SVM

41

994

0.896219

AdaBoost.M1

Decision Tree

41

994

0.901046

Bagging

SVM

21

1988

0.895414

Bagging

Decision Tree

21

1988

0.902655

Bagging

KNN

21

1988

0.885760

AdaBoost.M1

SVM

21

1988

0.873693

AdaBoost.M1

Decision Tree

21

1988

0.881738

Bagging

SVM

21

3976

0.895414

Bagging

Decision Tree

21

3976

0.901046

Bagging

KNN

21

3976

0.897828

AdaBoost.M1

SVM

21

3976

0.901850

AdaBoost.M1

Decision Tree

21

3976

0.901046

由上表可以得出结论:对于本数据集,Bagging算法和AdaBoost算法的算法性能大致相同,组合基础算法时,KNN+性能最差,Dtree+性能最好,不过在迭代次数较少时SVM的性能较好,迭代次数增加、训练集增加时Dtree+的准确率上升较快

分析和讨论

数据预处理问题

在不对数据进行归一化处理的时候,SVM的Bagging算法表现极差,只能达到

对于SVM,Dtree, KNN三个基础分类器,进行特征归一化与否的分类效果如下所示:

是否归一化

分类器

准确率

SVM

0.735318

DTree

0.875302

KNN

0.781979

SVM

0.914722

DTree

0.876106

KNN

0.899437

可以得出结论:归一化操作对SVM,KNN等算法而言及其重要,这是因为这类分类器是利用两点间的距离计算两点间的差异,当各个特征的维度差异较大时对其分类效果影响较大,因此需要进行归一化,而这些也直接影响了集成学习算法的准确率,如下表所示

不进行归一化处理

Bagging

SVM

21

994

0.714401

Bagging

Decision Tree

21

994

0.896219

Bagging

KNN

21

994

0.764280

AdaBoost.M1

Decision Tree

21

994

0.894610

(不归一化处理时,SVM在训练集上做测试时几乎会是完全正确,即出现了过拟合,这时AdaBoost算法无法进行下去,故无数据)

进行归一化处理

Bagging

SVM

21

994

0.905873

Bagging

Decision Tree

21

994

0.907482

Bagging

KNN

21

994

0.893001

AdaBoost.M1

SVM

21

994

0.872888

AdaBoost.M1

Decision Tree

21

994

0.901046

可以发现,在不进行归一化处理时,对于基于SVM和KNN两种基本算法的Bagging和AdaBoost集成学习算法表现均较差,而进行了归一化处理之后,其算法准确率则大幅提高(注意,单个算法的准确率较高是因为训练时采用了全训练集,而集成学习的训练集只采用了20%的训练集,因此可能稍有偏差)而DTree的结果并无比较大的差异

由这个对比可以感受到特征归一化对部分分类器的重要性

SVM的参数设置

在实验过程中发现使用SVM算法 + AdaBoost.M1算法时会出现每轮迭代时会出现分类效果越来越差的情况,通过打印预测结果发现,其对训练集的预测会循环出现全0和全1,即这一轮迭代会将每一个测试数据分类为sapm,下一轮迭代时会将每一个测试数据分类为normal, 这样会导致最终的训练结果准确率为69%,反复调试发现是sklearn.svm.SVC参数设置问题

1

2

4

5

6sklearn.svm.SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,

decision_function_shape='ovr', degree=3, gamma='auto',

kernel='rbf',

max_iter=-1, probability=False, random_state=None,

shrinking=True,

tol=0.001, verbose=False)

SVC的参数C代表了其惩罚参数,相当于惩罚松弛变量,松弛变量接近0时,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。默认为1时,训练时加上了各样本参数时则会对其训练效果产生极大影响,最终导致分类错误率增加,将其设置为300之后则效果变好。

算法表现差异分析

将上述测试结果按照准确率进行排序结果如下:

集成算法

基础算法

迭代次数

训练集大小

准确率

Bagging

Decision Tree

1

994

0.824618

AdaBoost.M1

Decision Tree

1

994

0.847949

Bagging

KNN

1

994

0.849558

AdaBoost.M1

SVM

21

994

0.86243

AdaBoost.M1

SVM

21

1988

0.873693

Bagging

SVM

21

994

0.881738

Bagging

KNN

21

994

0.881738

AdaBoost.M1

Decision Tree

21

994

0.881738

AdaBoost.M1

Decision Tree

21

1988

0.881738

Bagging

KNN

41

994

0.884151

AdaBoost.M1

SVM

1

994

0.884956

Bagging

KNN

21

1988

0.88576

Bagging

SVM

1

994

0.886565

Bagging

SVM

21

1988

0.895414

Bagging

SVM

21

3976

0.895414

AdaBoost.M1

SVM

41

994

0.896219

Bagging

KNN

21

3976

0.897828

Bagging

Decision Tree

41

994

0.900241

AdaBoost.M1

Decision Tree

41

994

0.901046

Bagging

Decision Tree

21

3976

0.901046

AdaBoost.M1

Decision Tree

21

3976

0.901046

AdaBoost.M1

SVM

21

3976

0.90185

Bagging

Decision Tree

21

1988

0.902655

Bagging

Decision Tree

21

994

0.913113

Bagging

SVM

41

994

0.913113

可以发现,综合表现最好的是Bagging + Dtree算法,平均来看,Bagging集成方法优于AdaBoost算法,这与经验相悖,分析可能的原因是:实验时未考虑各特征的权重问题,每个特征的计算方法不同,归一化时并没有考虑这一点,这些可能使得当AdaBoost算法专注于那些分错的样本时其实违背了数据的特征规律。

Bagging算法和AdaBoost算法有什么区别

Bagging

算法流程:

给定一个大小为n的训练集D,Bagging算法从中均匀、有放回地选出T个大小为n1的子集Di,作为新的训练集。在这m个训练集上使用分类、回归等算法,则可得到m个模型,再通过取平均值、取多数票等方法,即可得到Bagging的结果

算法特点:

Bagging要求基分类器的学习算法不稳定,也就是当数据发生小变化时,训练的分类器会产生很大不同,依次来增加基分类器的多样性,使得分类系统更加稳定,泛化能力更强。

AdaBoost

算法流程

AdaBoost方法是一种迭代算法,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率。 每一个训练样本都被赋予一个权重,表明它被某个分类器选入训练集的概率。 如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它被选中的概率就被降低; 相反,如果某个样本点没有被准确地分类,那么它的权重就得到提高。 通过这样的方式,AdaBoost方法能“聚焦于”那些较难分(更富信息)的样本上。

在具体实现上,最初令每个样本的权重都相等, 对于第k次迭代操作,我们就根据这些权重来选取样本点,进而训练分类器Ck。 然后就根据这个分类器,来提高被它分错的的样本的权重,并降低被正确分类的样本权重。 然后,权重更新过的样本集被用于训练下一个分类器Ck[2]。整个训练过程如此迭代地进行下去。

算法特点

具有较低的泛化误差(low generalization)

不容易出现overfiting(过拟合)现象

算法差异

Bagging算法的训练集是从原数据集中有放回的抽样得到的(原数据集的一部分),每个基分类器是相互独立的,并列的。因为每个基分类器训练方法独立且相同,所以最后分类器等权重投票。

而在Boosting算法中,基分类器是依次训练的,因为分错的点在接下来的训练时会更加的被侧重,也就是说,每个基分类器的训练都是建立在之前基分类器的表现基础之上的。最后分类器加权投票。

通常来说,基分类器不稳定时,Bagging算法的表现会比较好,大多数情况下AdaBoost算法表现较好,但是也容易出现过拟合的情况,比如说本次实验中(【SVM的参数设置】一节所述),当基分类器为SVM时,若C参数设置为1时,则会出现最终分类准确率仅为69%的情况

什么样的组合最好,为什么

进行相应的参数调整之后,各个算法组合之间的差异并不是特别大,不过Bagging + Dtree的稳定性应该是最高的,其效果也最好,实际上Bagging + SVM的效果也比较好,此次测试SVM效果劣于Dtree可能是SVC的参数设置不够好

代码说明:

ContentNewLinkAllSample.csv : 原始数据

README.md : 说明文档

base_cls.py : 基础分类器的分类效果测试, python base_cls.py即可运行

ensemble.py : 集成学习算法

main.py : 测试程序

share.py : 一些配置函数

参考资料

曾刚,李宏.一个基于现实世界的大型Web参照数据集——UK2006 Datasets的初步研究[J].企业技术开发(学术版),2009,28(5):16-17,31.

SVM: Weighted samples http://scikit-learn.org/stable/auto_examples/svm/plot_weighted_samples.html

原文:https://www.cnblogs.com/lijianming180/p/12262616.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值