01.02 「AI科技」機器學習算法系列-樸素貝葉斯分類(1)Python實戰

前面在 中介紹了樸素貝葉斯的方法提出過程以及樸素貝葉斯相關兩個重要因素:貝葉斯定理和特徵條件獨立假設。

「AI科技」機器學習算法系列-樸素貝葉斯分類(1)Python實戰

由於本次使用的數據特徵是離散數據,所以本文主要介紹一下樸素貝葉斯常用3個模型中的“多項式模型”的實現過程。

樸素貝葉斯分類過程

整個樸素貝葉斯分類分為三個階段:

  1. 準備工作階段:機器學習預測質量的上限是數據(特徵、標籤),因此這一階段尤為重要,需要好好準備。
  2. 分類建模階段:通過統計每個標籤的類別出現的概率(先驗概率),及每個標籤屬性劃分對每個類別的概率(label與feature同時發生的概率),最後計算提供特徵的條件下各個標籤出現的概率,取概率最大的標籤為預測值。
  3. 分類預測階段:在主函數輸入特徵,按照模型輸出結果。

樸素貝葉斯分類代碼實現

第一階段:準備工作階段:

數據處理,獲取數據的特徵及標籤。輸入參數為一個數據框,包含數據特徵及標籤,最後一列為標籤。返回兩個數組:特徵,標籤。

「AI科技」機器學習算法系列-樸素貝葉斯分類(1)Python實戰

# -*- coding: utf-8 -*-
"""
Created on Tue Jan 1 19:50:36 2019
"""
import pandas as pd
import numpy as np
def getdatalabel(data):
"""
功能:獲取數據的特徵及標籤
data:數據框,最後一列為標籤
return:數據特徵,標籤
"""

dataNP = np.array(data) #將數據由dataframe類型轉換為數組類型
trainData = dataNP[:,0:dataNP.shape[1]-1] #訓練數據x1,x2
labels = dataNP[:,dataNP.shape[1]-1] #訓練數據所對應的所屬類型Y
return trainData, labels

第二階段:樸素貝葉斯分類建模

通過計算先驗概率、聯合概率和條件概率,最後去概率最大的標籤為預測標籤。

def naivebayes_classify(trainData, labels, features):
"""
功能:通過樸素貝葉斯對提供的特徵進行分類
trainData:數組,訓練特徵數據
labels:數組,訓練標籤數據
features:序列,測試特徵。
return:測試特徵的標籤

"""
#求labels中每個label的先驗概率
labels = list(labels) #轉換為list類型
P_y = {} #存入label的概率
for label in labels:
P_y[label] = labels.count(label)/float(len(labels)) # p = count(y) / count(Y)
#求label與feature同時發生的概率
P_xy = {}
for y in P_y.keys():
y_index = [i for i, label in enumerate(labels) if label == y] # labels中出現y值的所有數值的下標索引
for j in range(len(features)): # features[0] 在trainData[:,0]中出現的值的所有下標索引
x_index = [i for i, feature in enumerate(trainData[:,j]) if feature == features[j]]
xy_count = len(set(x_index) & set(y_index)) # set(x_index)&set(y_index)列出兩個表相同的元素
pkey = str(features[j]) + '*' + str(y)
P_xy[pkey] = xy_count / float(len(labels))
#求條件概率
P = {}
for y in P_y.keys():
for x in features:
pkey = str(x) + '|' + str(y)
P[pkey] = P_xy[str(x)+'*'+str(y)] / float(P_y[y]) #P[X1/Y] = P[X1Y]/P[Y]
#求 features 所屬類別
F = {} # features 屬於各個類別的概率
for y in P_y:
F[y] = P_y[y]
for x in features:
F[y] = F[y]*P[str(x)+'|'+str(y)] #P[y/X] = P[X/y]*P[y]/P[X],分母相等,比較分子即可,所以有F=P[X/y]*P[y]=P[x1/Y]*P[x2/Y]*P[y]
features_label = max(F, key=F.get) #概率最大值對應的類別
return features_label
「AI科技」機器學習算法系列-樸素貝葉斯分類(1)Python實戰

第三階段:分類預測階段

輸入訓練數據和需要預測的特徵,返回最終結果。

def main():
o = open('C://python項目//樸素貝葉斯//data.csv')
data = pd.read_csv(o)
o.close()
# 訓練數據
trainData, labels = getdatalabel(data)
# x1,x2
features = ['高', '多']
# 該特徵應屬於哪一類
result = naivebayes_classify(trainData, labels, features)
print("具有 價格{} ,課時{} 特徵的課程,銷量 {}".format(features[0],features[1],result))
if __name__ == '__main__':
main()

由於使用的是Python3,所以讀取數據必須採用如下的調用方式。

o = open('C://python項目//樸素貝葉斯//data.csv')
data = pd.read_csv(o)
o.close()

數據大家可以根據自己的實際情況變更。數據樣例如下:

 價格 課時 銷量
0 低 多 高
1 高 中 高
2 低 少 高

3 低 中 低
4 中 中 中
5 高 多 高
6 低 少 中
7 低 多 高
8 高 中 高
9 低 少 高

結果如下:

具有 價格高 ,課時多 特徵的課程,銷量 高


分享到:


相關文章: