第十次做業——分類與監督學習,樸素貝葉斯分類算法

1.理解分類與監督學習、聚類與無監督學習。算法

簡述分類與聚類的聯繫與區別。編程

答:聯繫:聚類屬於無監督學習,即模型訓練過程當中沒有被目標標籤監督。而分類屬於監督學習,即其訓練數據都標記了須要被預測的真實值。在不少狀況下,聚類模型等價於分類模型的無監督形式。數組

區別:分類是事先定義好類別 ,類別數不變 。分類器須要由人工標註的分類訓練語料訓練獲得,屬於有指導學習範疇。app

聚類則沒有事先預約的類別,類別數不肯定。 聚類不須要人工標註和預先訓練分類器,類別在聚類過程當中自動生成 。函數

分類是一種有監督的算法,是在已經有目標分類的狀況下對數據進行類別判斷(樸素貝葉斯算法)。而聚類是一種無監督算法,是在創建模型以前尚未目標分類,將特徵類似的數據自動聚爲一類的算法(KMeans聚類算法)學習

 

簡述什麼是監督學習與無監督學習。spa

答:監督學習:就是人們常說的分類,經過已有的訓練樣本(即已知數據以及其對應的輸出)去訓練獲得一個最優模型(這個模型屬於某個函數的集合,最優則表示在某個評價準則下是最佳的),再利用這個模型將全部的輸入映射爲相應的輸出,對輸出進行簡單的判斷從而實現分類的目的,也就具備了對未知數據進行分類的能力。3d

無監督學習:是另外一種研究的比較多的學習方法,它與監督學習的不一樣之處,在於咱們事先沒有任何訓練樣本,而須要直接對數據進行建模。excel

有監督學習是在創建模型以前已經給出訓練數據集,機器根據訓練數據集訓練出模型並對新數據進行預測。無監督學習是對未進行人工標註的數據進行分析,機器根據數據間的類似性自行分類。類似度高的數據會被聚爲一類。code

 

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)

運行結果:

相關文章
相關標籤/搜索