当前位置:   article > 正文

【Python机器学习】利用AdaBoost元算法提高分类性能——在数据集上应用AdaBoost

【Python机器学习】利用AdaBoost元算法提高分类性能——在数据集上应用AdaBoost

在之前用过的马疝病数据集上应用AdaBoost。

在一个难数据集上的AdaBoost应用步骤:

1、收集数据:提供的文本文件

2、准备数据:确保类别标签是+1河-1而不是1和0

3、分析数据:手工检查数据

4、训练算法:在数据上,利用adaBoostTrainDS()函数训练出一系列的分类器

5、测试算法:我们拥有两个数据集,在不采用随机抽样的方法下,我们对AdaBoost和Logistic回归的结果进行比较

6、使用算法:观察该例子上的错误率。

在完成上述步骤之前,要有一个向文件中加载数据的方法:

  1. def loadDataSet(fileName):
  2. numFeat=len(open(fileName).readline().split('\t'))
  3. dataMat=[]
  4. labelMat=[]
  5. fr=open(fileName)
  6. for line in fr.readlines():
  7. lineArr=[]
  8. curLine=line.strip().split('\t')
  9. for i in range(numFeat-1):
  10. lineArr.append(float(curLine[i]))
  11. dataMat.append(lineArr)
  12. labelMat.append(float(curLine[-1]))
  13. return dataMat,labelMat

这里,不必要指定每个文件中的特征数目。函数能够自动检测出特征的数目,同时,该函数也假定最后一个特征是类别标签。

使用基于单层决策树的AdaBoost算法:

  1. from numpy import *
  2. def stumpClassify(dataMatrix,dimen,threshVal,threshIneq):
  3. retArray=ones((shape(dataMatrix)[0],1))
  4. if threshIneq=='lt':
  5. retArray[dataMatrix[:,dimen] <= threshVal] = -1.0
  6. else:
  7. retArray[dataMatrix[:, dimen] > threshVal] = -1.0
  8. return retArray
  9. def builsStump(dataArr,classLabels,D):
  10. dataMatrix=mat(dataArr)
  11. labelMat=mat(classLabels).T
  12. m,n=shape(dataMatrix)
  13. numSteps=10.0
  14. bestStump={}
  15. bestClassEst=mat(zeros((m,1)))
  16. minError=inf
  17. for i in range(n):
  18. rangeMin=dataMatrix[:,i].min()
  19. rangeMax=dataMatrix[:,i].max()
  20. stepSize=(rangeMax-rangeMin)/numSteps
  21. for j in range(-1,int(numSteps)+1):
  22. for inequal in ['lt','gt']:
  23. threshVal=(rangeMin+float(j)*stepSize)
  24. predictedVals=stumpClassify(dataMatrix,i,threshVal,inequal)
  25. errArr=mat(ones((m,1)))
  26. errArr[predictedVals==labelMat]=0
  27. #计算加权错误率
  28. weightedError=D.T*errArr
  29. if weightedError<minError:
  30. minError=weightedError
  31. bestClassEst=predictedVals.copy()
  32. bestStump['dim']=i
  33. bestStump['thresh']=threshVal
  34. bestStump['ineq']=inequal
  35. return bestStump,minError,bestClassEst
  36. def adaBoostTrainDS(dataArr,classLabels,numIt=40):
  37. weakClassArr=[]
  38. m=shape(dataArr)[0]
  39. D=mat(ones((m,1))/m)
  40. aggClassEst=mat(zeros((m,1)))
  41. for i in range(numIt):
  42. bestStump,error,classEst=builsStump(dataArr,classLabels,D)
  43. #print('D:',D.T)
  44. alpha=float(0.5*log((1.0-error)/max(error,1e-16)))
  45. bestStump['alpha']=alpha
  46. weakClassArr.append(bestStump)
  47. #print('classEst:',classEst)
  48. #为下一次迭代计算D
  49. expon=multiply(-1*alpha*mat(classLabels).T,classEst)
  50. D=multiply(D,exp(expon))
  51. D=D/D.sum()
  52. #错误率累加计算
  53. aggClassEst=aggClassEst+alpha*classEst
  54. #print('aggClassEst:',aggClassEst.T)
  55. aggErrors=multiply(sign(aggClassEst)!=mat(classLabels).T,ones((m,1)))
  56. errorRate=aggErrors.sum()/m
  57. print('错误率:',errorRate)
  58. if errorRate==0.0:
  59. break
  60. return weakClassArr
  61. def adaClassify(datToClass,classifierArr):
  62. dataMatrix=mat(datToClass)
  63. m=shape(dataMatrix)[0]
  64. aggClassEst=mat(zeros((m,1)))
  65. for i in range(len(classifierArr)):
  66. classEst=stumpClassify(dataMatrix,classifierArr[i]['dim'],classifierArr[i]['thresh'],classifierArr[i]['ineq'])
  67. aggClassEst=aggClassEst+classifierArr[i]['alpha']*classEst
  68. print(aggClassEst)
  69. return sign(aggClassEst)

执行代码,计算错误率:

  1. datArr,labelArr=loadDataSet('horseColicTraining2.txt')
  2. classifierArray=adaBoostTrainDS(dataArr=datArr,classLabels=labelArr,numIt=10)
  3. print(classifierArray)

  1. testArr,testLabelArr=loadDataSet('horseColicTest2.txt')
  2. prediction10=adaClassify(testArr,classifierArray)
  3. errArr=mat(ones((67,1)))
  4. print(errArr[prediction10!=mat(testLabelArr).T].sum())

将弱分类器的数目设定为1-10000之间的不同数字,并重复上述过程,就会得到不同的错误率结果。

可以看到,测试错误率在达到了一个最小值之后又开始上升。这类现象被称为过拟合(也称过学习)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/942599
推荐阅读
相关标签
  

闽ICP备14008679号