• 第十次作业——分类与监督学习,朴素贝叶斯分类算法


    1.理解分类与监督学习、聚类与无监督学习。

    简述分类与聚类的联系与区别。

    答:联系:聚类属于无监督学习,即模型训练过程中没有被目标标签监督。而分类属于监督学习,即其训练数据都标记了需要被预测的真实值。在很多情况下,聚类模型等价于分类模型的无监督形式。

    区别:分类是事先定义好类别 ,类别数不变 。分类器需要由人工标注的分类训练语料训练得到,属于有指导学习范畴。

    聚类则没有事先预定的类别,类别数不确定。 聚类不需要人工标注和预先训练分类器,类别在聚类过程中自动生成 。

    分类是一种有监督的算法,是在已经有目标分类的情况下对数据进行类别判断(朴素贝叶斯算法)。而聚类是一种无监督算法,是在建立模型之前还没有目标分类,将特征相似的数据自动聚为一类的算法(KMeans聚类算法)

     

    简述什么是监督学习与无监督学习。

    答:监督学习:就是人们常说的分类,通过已有的训练样本(即已知数据以及其对应的输出)去训练得到一个最优模型(这个模型属于某个函数的集合,最优则表示在某个评价准则下是最佳的),再利用这个模型将所有的输入映射为相应的输出,对输出进行简单的判断从而实现分类的目的,也就具有了对未知数据进行分类的能力。

    无监督学习:是另一种研究的比较多的学习方法,它与监督学习的不同之处,在于我们事先没有任何训练样本,而需要直接对数据进行建模。

    有监督学习是在建立模型之前已经给出训练数据集,机器根据训练数据集训练出模型并对新数据进行预测。无监督学习是对未进行人工标注的数据进行分析,机器根据数据间的相似性自行分类。相似度高的数据会被聚为一类。

    2.朴素贝叶斯分类算法 实例

    利用关于心脏情患者的临床数据集,建立朴素贝叶斯分类模型。

    有六个分类变量(分类因子):性别,年龄、KILLP评分、饮酒、吸烟、住院天数

    目标分类变量疾病:–心梗–不稳定性心绞痛

    新的实例:–(性别=‘男’,年龄<70, KILLP=‘I',饮酒=‘是’,吸烟≈‘是”,住院天数<7)

    最可能是哪个疾病?

    上传演算过程。

     

    3.编程实现朴素贝叶斯分类算法

    利用训练数据集,建立分类模型。

    输入待分类项,输出分类结果。

    可以心脏情患者的临床数据为例,但要对数据预处理。

    import pandas as pd
    import numpy as np
    
    dataDF = pd.read_excel(r'data/心脏病患者临床数据.xlsx')
    
    # 数据处理,对男女(男1女0),年龄(<70 -1,70-80 0,>80 1),
    # 住院天数(<7 -1,7-14 0,>14 1)三个列进行处理
    sex = []
    for s in dataDF['性别']:
        if s == '':
            sex.append(1)
        else:
            sex.append(0)
    
    age = []
    for a in dataDF['年龄']:
        if a == '<70':
            age.append(-1)
        elif a == '70-80':
            age.append(0)
        else:
            age.append(1)
    
    days = []
    for d in dataDF['住院天数']:
        if d == '<7':
            days.append(-1)
        elif d == '7-14':
            days.append(0)
        else:
            days.append(1)
    
    # 另外生成一份处理后的DF
    dataDF2 = dataDF
    dataDF2['性别'] = sex
    dataDF2['年龄'] = age
    dataDF2['住院天数'] = days
    
    # 转为数组用于计算
    dataarr = np.array(dataDF)
    dataarr
    
    # 用贝叶斯模型判断病人属于哪种病:性别=‘男’,年龄<70, KILLP=1,饮酒=‘是’,吸烟=‘是”,住院天数<7
    def beiyesi(sex, age, KILLP, drink, smoke, days):
        # 初始化变量
        x1_y1,x2_y1,x3_y1,x4_y1,x5_y1,x6_y1 = 0,0,0,0,0,0
        x1_y2,x2_y2,x3_y2,x4_y2,x5_y2,x6_y2 = 0,0,0,0,0,0
        y1 = 0
        y2 = 0
        
        for line in dataarr:
            if line[6] == '心梗':# 计算在心梗条件下出现各症状的次数
                y1 += 1
                if line[0] == sex:
                    x1_y1 += 1
                if line[1] == age:
                    x2_y1 += 1
                if line[2] == KILLP:
                    x3_y1 += 1
                if line[3] == drink:
                    x4_y1 += 1
                if line[4] == smoke:
                    x5_y1 += 1
                if line[5] == days:
                    x6_y1 += 1
            else: # 计算不稳定性心绞痛条件下出现各症状的次数
                y2 += 1
                if line[0] == sex:
                    x1_y2 += 1
                if line[1] == age:
                    x2_y2 += 1
                if line[2] == KILLP:
                    x3_y2 += 1
                if line[3] == drink:
                    x4_y2 += 1
                if line[4] == smoke:
                    x5_y2 += 1
                if line[5] == days:
                    x6_y2 += 1
        # print('y1:',y1,' y2:',y2)
                
                
        # 计算,转为x|y1, x|y2
        # print('x1_y1:',x1_y1, ' x2_y1:',x2_y1, ' x3_y1:',x3_y1, ' x4_y1:',x4_y1, ' x5_y1:',x5_y1, ' x6_y1:',x6_y1)
        # print('x1_y2:',x1_y2, ' x2_y2:',x2_y2, ' x3_y2:',x3_y2, ' x4_y2:',x4_y2, ' x5_y2:',x5_y2, ' x6_y2:',x6_y2)
        x1_y1, x2_y1, x3_y1, x4_y1, x5_y1, x6_y1 = x1_y1/y1, x2_y1/y1, x3_y1/y1, x4_y1/y1, x5_y1/y1, x6_y1/y1
        x1_y2, x2_y2, x3_y2, x4_y2, x5_y2, x6_y2 = x1_y2/y2, x2_y2/y2, x3_y2/y2, x4_y2/y2, x5_y2/y2, x6_y2/y2
        x_y1 = x1_y1 * x2_y1 * x3_y1 * x4_y1 * x5_y1 * x6_y1
        x_y2 = x1_y2 *  x2_y2 * x3_y2 * x4_y2 * x5_y2 * x6_y2
    
            
        # 计算各症状出现的概率
        x1,x2,x3,x4,x5,x6 = 0,0,0,0,0,0
        for line in dataarr:
            if line[0] == sex:
                x1 += 1
            if line[1] == age:
                x2 += 1
            if line[2] == KILLP:
                x3 += 1
            if line[3] == drink:
                x4 += 1
            if line[4] == smoke:
                x5 += 1
            if line[5] == days:
                x6 += 1
        # print('x1:',x1, ' x2:',x2, ' x3:',x3, ' x4:',x4, ' x5:',x5, ' x6:',x6)
        # 计算
        length = len(dataarr)
        x = x1/length * x2/length * x3/length * x4/length * x5/length * x6/length
        # print('x:',x)
        
        # 分别计算 给定症状下心梗 和 不稳定性心绞痛 的概率
        y1_x = (x_y1)*(y1/length)/x
        # print(y1_x)
        y2_x = (x_y2)*(y2/length)/x
        
        # 判断是哪中疾病的可能性大
        if y1_x > y2_x:
            print('该病人患有心梗的可能性大,可能性为:',y1_x)
        else:
            print('该病人患有不稳定性心绞痛的可能性较大,可能性为:',y2_x)
    
    # 判断:性别=‘男’,年龄<70, KILLP=1,饮酒=‘是’,吸烟=‘是”,住院天数<7
    beiyesi(1,-1,1,'','',-1)

    运行结果:

  • 相关阅读:
    hdu4059 The Boss on Mars
    cf475D CGCDSSQ
    HDU
    cf1447D Catching Cheaters
    cf1440 Greedy Shopping
    Treats for the Cows
    dp废物学会了记录路径
    D. Jzzhu and Cities
    cf1359D Yet Another Yet Another Task
    关于sg函数打表的理解
  • 原文地址:https://www.cnblogs.com/didi-l/p/9979660.html
Copyright © 2020-2023  润新知