项目实训(十二)--弱分类器--决策树与集成

项目实训(十二)

本文记录在项目中的决策树使用

目录

  • 项目实训(十二)
    • 分类器
    • adboost
    • 实现
    • 参考

分类器

我们有一种新思路,通过创建许多弱分类器,并通过集成的方法,得到良好的分类效果,实现最终目的。
集成方法(ensemble method)通过组合多个学习器来完成学习任务,颇有点“三个臭皮匠顶个诸葛亮”的意味。基分类器一般采用的是弱可学习(weakly learnable)分类器,通过集成方法,组合成一个强可学习(strongly learnable)分类器。所谓弱可学习,是指学习的正确率仅略优于随机猜测的多项式学习算法;强可学习指正确率较高的多项式学习算法。集成学习的泛化能力一般比单一的基分类器要好,这是因为大部分基分类器都分类错误的概率远低于单一基分类器的。
在项目中我是用的是adaptive boosting集成算法

adboost

Boosting是一种与Bagging很类似的技术。Boosting的思路则是采用重赋权(re-weighting)法迭代地训练基分类器,主要思想:

每一轮的训练数据样本赋予一个权重,并且每一轮样本的权值分布依赖上一轮的分类结果。
基分类器之间采用序列式的线性加权方式进行组合。
AdaBoost算法是基于Boosting思想的机器学习算法,AdaBoost是adaptive boosting(自适应boosting)的缩写,其运行过程如下:

1、计算样本权重
训练数据中的每个样本,赋予其权重,即样本权重,用向量D表示,这些权重都初始化成相等值。假设有n个样本的训练集
设定每个样本的权重都是相等的,即1/n。

2、计算错误率
利用第一个弱学习算法h1对其进行学习,学习完成后进行错误率ε的统计

3、计算弱学习算法权重
弱学习算法也有一个权重,用向量α表示,利用错误率计算权重α

4、更新样本权重
在第一次学习完成后,需要重新调整样本的权重,以使得在第一分类中被错分的样本的权重,在接下来的学习中可以重点对其进行学习

5、AdaBoost算法
重复进行学习,这样经过t轮的学习后,就会得到t个弱学习算法、权重、弱分类器的输出以及最终的AdaBoost算法的输出

伪代码:
项目实训(十二)--弱分类器--决策树与集成_第1张图片

实现

import numpy as np
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression


# Boosting的思路则是采用重赋权(re-weighting)法迭代地训练基分类器
# 每一轮的训练数据样本赋予一个权重,并且每一轮样本的权值分布依赖上一轮的分类结果
# 基分类器之间采用序列式的线性加权方式进行组合
# 1、计算样本权重
# 2、计算错误率
# 3、计算弱学习算法权重
# 4、更新样本权重
# 5、重复进行学习,这样经过t轮的学习后,就会得到t个弱学习算法、权重、弱分类器的输出以及最终的AdaBoost算法的输出


def loadDataSet(vecfileName, labelfileName,num1,num2):
    # numFeat = len((open(vecfileName).readline().split('\t')))
    dataMat = [];
    labelMat = []
    fr = open(vecfileName)
    for line in fr.readlines()[num1:num2]:
        tmp_vec = eval(line[5:-2])
        dataMat.append(tmp_vec)
    fr = open(labelfileName)
    for line in fr.readlines()[num1:num2]:
        tmp_label = int(line[2])
        labelMat.append(tmp_label)

    return dataMat, labelMat

if __name__ == '__main__':
	# dataArr, classLabels = loadDataSet('horseColicTraining2.txt')
	dataArr, classLabels = loadDataSet("vec.csv","label.csv",0,7000)
	# testArr, testLabelArr = loadDataSet('horseColicTest2.txt')
	testArr, testLabelArr = loadDataSet("vec.csv","label.csv",7001,9999)
	bdt = AdaBoostClassifier(DecisionTreeClassifier(max_depth=2), algorithm="SAMME", n_estimators=10)
	# bdt = AdaBoostClassifier(LogisticRegression(solver='sag', max_iter=800,multi_class='multinomial'), algorithm = "SAMME.R", n_estimators = 100)
	bdt.fit(dataArr, classLabels)
	predictions = bdt.predict(dataArr)
	print("预测的训练==========")
	print(predictions)
	print("训练标签============")
	print(classLabels)
	errArr = np.mat(np.ones((len(dataArr), 1)))
	print('训练集的错误率:%.3f%%' % float(errArr[predictions != classLabels].sum() / len(dataArr) * 100))
	predictions = bdt.predict(testArr)
	print("预测的测试==========")
	print(predictions)
	print("测试标签============")
	print(testLabelArr)
	errArr = np.mat(np.ones((len(testArr), 1)))
	print('测试集的错误率:%.3f%%' % float(errArr[predictions != testLabelArr].sum() / len(testArr) * 100))

简单的单层决策树通过集成也可以获得70%以上的准确率。
我又尝试将上文提到的逻辑回归进行集成,发现效果并未出现提升。

参考

https://cuijiahua.com/blog/2017/11/ml_10_adaboost.html

你可能感兴趣的:(项目实训(十二)--弱分类器--决策树与集成)