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