《机器学习实战第7章:利用AdaBoost元算法提高分类性能》

2021-06-28 14:05

阅读:460

标签:dimen   matrix   训练   ssl   pos   分布   曲线   loaddata   学习   

import numpy as np
import matplotlib.pyplot as plt
def loadSimpData():
    dataMat = np.matrix([[1., 2.1],
                      [2., 1.1],
                      [1.3, 1.],
                      [1., 1.],
                      [2., 1.]])

    classLabels = [1.0, 1.0, -1.0, -1.0, 1.0]

    
    return dataMat, classLabels

def showDataSet(dataMat, label):
    """
    数据可视化
    Parameters:
        dataMat - 数据矩阵
        label - 数据标签
    Returns:
        无
    """
    
    # 方法一 via CHJ
    data = np.array(dataMat)
    #print(data)
    for i in range(len(data)):
        if label[i] == 1.0:
            #用plt.scatter画散点图也行
            plt.plot(data[i][0], data[i][1], marker = ‘o‘, color = ‘red‘)
        else:
            plt.plot(data[i][0], data[i][1],  marker = ‘s‘,color = ‘blue‘)

    plt.show()

    # # 方法二 
    # data_plus = [] #正样本
    # data_mins = [] #负样本
    # for i in range(len(dataMat)):
    #   if label[i] > 0:
    #       data_plus.append(dataMat[i])
    #   else:
    #       data_mins.append(dataMat[i])

    # data_plus_np = np.array(data_plus)  #转换成numpy矩阵  #[[[1.  2.1]], [[2.  1.1]], [[2.  1. ]]]
    # data_mins_np = np.array(data_mins)  #转换成numpy矩阵  #[[[1.3 1. ]], [[1.  1. ]]]
    # #需要转置,否则绘图不正确
    # x = np.transpose(data_plus_np)  # [[[1.  2.  2. ]], [[2.1 1.1 1. ]]]
    # y = np.transpose(data_mins_np)  # [[[1.3 1. ]], [[1.  1. ]]]
    # plt.scatter(x[0], x[1])  # 正样本散点图
    # plt.scatter(y[0], y[1])  # 负样本散点图
    # plt.show()


print("------------7.4节:基于单层决策树构建分类器-----------------------")

def stumpClassify(dataMatrix, dimen, threshVal, threshIneq):
    """
    (将数据集,按照feature列的value进行 二分法切分比较来赋值分类)
    单层决策树分类函数
    Parameters:
        dataMatrix - 数据矩阵
        dimen - 第dimen列,也就是第几列特征
        threshVal - 阈值(特征列要比较的值)
        threshIneq - 阈值不等式(这里有两个:lt和gt)
    Returns:
        retArray - 分类结果(np.array类型)
    """
    retArray = np.ones((np.shape(dataMatrix)[0], 1))  # 生成m 行1列的单位矩阵
    # thresh_ineq == ‘lt‘表示阈值不等式取lt(less than)
    if threshIneq == ‘lt‘:
        # data_mat[:, dimen] 表示数据集中第dimen列的所有值
        retArray[dataMatrix[:, dimen]  threshVal] = -1.0    # 如果大于阈值,则赋值为-1

    return retArray

def buildStump(dataArr, classLabels, D):

    """
    找到数据集上的最佳单层决策树 -- 单层决策树是指只考虑其中的一个特征,在该特征的基础上进行分类,
    寻找分类错误率最低的阈值即可, 非常简单
    例如本文例子中,如果以第一列特征(dimen = 1)为基础,阈值v选择1.3,并且设置lt:阈值,则分类为-1
            就这个题目来说,两者加起来误差肯定为1
            ‘‘‘
            #第三层循环是在大于和小于之间切换不等式
            for inequal in [‘lt‘, ‘gt‘]:  # 遍历小于和大于的情况。
                threshVal = (rangeMin + float(j) * stepSize)   # 计算阈值
                predictedVals = stumpClassify(dataMatrix, i , threshVal, inequal) # 计算分类结果
                errArr = np.mat(np.ones((m,1)))   # 初始化误差矩阵
                
                errArr[predictedVals == labelMat] = 0  # 分类正确的,赋值为0
                # 基于权重向量D而不是其他错误指标来评价分类器的,不同的分类器计算方法不一样
                weightedError = D.T * errArr # 计算误差--这里没有采用常规方法来评价这个分类器的分类准确率,而是乘上了权重
                # print(‘split: dim %d, thresh %.2f, thresh inequal: %s, the weighted error is %.3f‘                 #   %(i, threshVal, inequal, weightedError))
                if weightedError 

《机器学习实战第7章:利用AdaBoost元算法提高分类性能》

标签:dimen   matrix   训练   ssl   pos   分布   曲线   loaddata   学习   

原文地址:https://www.cnblogs.com/HongjianChen/p/9647845.html


评论


亲,登录后才可以留言!