前言:参考《机器学习》,简单介绍朴素贝叶斯分类器
机器学习专栏:机器学习专栏
贝叶斯定理(Bayes’ theorem)是概率论中的一个定理,描述在已知一些条件下,某事件的发生概率。
其中,
现给定数据集 D = ( ( x ( 1 ) , y ( i ) ) , ( x ( 2 ) , y ( 2 ) ) , . . . , ( x ( m ) , y ( m ) ) ) D={((x^{(1)},y^{(i)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)}))} D=((x(1),y(i)),(x(2),y(2)),...,(x(m),y(m))),假设有K种可能的类别标记, C = { c 1 , c 2 , . . . , c K } C=\{c_1,c_2,...,c_K\} C={ c1,c2,...,cK},则 , y ( i ) ∈ { c 1 , c 2 , . . . , c k } ,y^{(i)}\in\{c_1,c_2,...,c_k\} ,y(i)∈{ c1,c2,...,ck}。
贝叶斯分类的实质就是:给定一个样本 x ( i ) x^{(i)} x(i),其属于类别k的概率为: P ( c k ∣ x ( i ) ) P(c_k|x^{(i)}) P(ck∣x(i)),贝叶斯分类的分类结果就是条件概率 P ( c ∣ x ( i ) ) P(c|x^{(i)}) P(c∣x(i))(或者称为似然)最大的那个类别,即:
a r g m a x c k ∈ C P ( c k ∣ x ( i ) ) \mathop{arg\;max}\limits_{c_k\in C}\;P(c_k|x^{(i)}) ck∈CargmaxP(ck∣x(i))
我们将我们前面介绍的贝叶斯公式换成符合数据集D的形式:
P ( c ∣ x ) = P ( x ∣ c ) ⋅ P ( c ) P ( x ) P(c|x)=\frac {P(x|c)·P(c)}{P(x)} P(c∣x)=P(x)P(x∣c)⋅P(c)
给定数据集的情况下,我们利用大数定律就可以确定 P ( c ) P(c) P(c),对于确定的样本 x x x( x = [ x 1 , x 2 , . . . , x n ] x=[x_1,x_2,...,x_n] x=[x1,x2,...,xn])n为属性个数,对所有类别来说 P ( x ) P(x) P(x)也是确定的。
假设各个属性相互独立(这就是“朴素”),则:
P ( x ∣ c ) = ∏ j = 1 n P ( x j ∣ c ) P(x|c)=\prod_{j=1}^{n}P(x_j|c) P(x∣c)=j=1∏nP(xj∣c)
基于上面所述的贝叶斯判定准则,可以得出朴素贝叶斯分类器的表达式为:
h n b ( x ) = a r g m a x c ∈ C P ( c ) ∏ j = 1 n P ( x j ∣ c ) h_{nb}(x)=\mathop{arg\;max}\limits_{c\in C}\;P(c)\prod_{j=1}^{n}P(x_j|c) hnb(x)=c∈CargmaxP(c)j=1∏nP(xj∣c)
明显可以看出朴素贝叶斯分类器更适用于离散属性,所以我们也可以考虑连续离散化处理的方法。
# -*- coding:utf-8 -*-
"""
@author: 1
@file: bayes.py
@time: 2019/11/30 1:25
"""
from sklearn.naive_bayes import GaussianNB
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
df = pd.read_csv(r'D:\workspace\python\machine learning\data\iris.csv')
X = df.iloc[:, 0:3]
Y = df.iloc[:, 4]
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)
# 属性假设为高斯分布
gnb = GaussianNB()
model = gnb.fit(x_train, y_train)
y_pred = model.predict(x_test)
print('accuracy_score:', accuracy_score(y_test, y_pred))