sklearn的机器学习之路:朴素贝叶斯

1. 基础概念

什么是朴素贝叶斯:贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。

贝叶斯公式

P(Y|X)=P(X|Y)P(Y)P(X) P ( Y | X ) = P ( X | Y ) P ( Y ) P ( X )

X:特征向量 Y:类别

先验概率 P(X) P ( X ) :先验概率:是指根据以往经验和分析得到的概率。
后验概率 P(Y|X) P ( Y | X ) :事情已经发生,要求这件事情发生的原因是由某个因素引起的可能性的大小。
类条件概率 P(X|Y) P ( X | Y ) :在已知某类别的特征空间中,出现特征值X的概率密度。

朴素朴素贝叶斯算法是假设各个特征之间相互独立,也是朴素这词的意思。那么贝叶斯公式中 P(X|Y) P ( X | Y ) 可写成

P(X|Y)=P(x1|Y)P(x2|Y)P(xn|Y) P ( X | Y ) = P ( x 1 | Y ) P ( x 2 | Y ) ⋯ P ( x n | Y )

朴素贝叶斯公式:
P(Y|X)=P(x1|Y)P(x2|Y)P(xn|Y)P(Y)P(X) P ( Y | X ) = P ( x 1 | Y ) P ( x 2 | Y ) ⋯ P ( x n | Y ) P ( Y ) P ( X )

三种常见模型


  • 多项式模型:多项式模型在计算先验概率 P(Yk) P ( Y k ) 和条件概率 P(xi|Yk) P ( x i | Y k ) 时,会做一些平滑处理,具体公式为:
    P(Yk)=NYk+αN+Kα P ( Y k ) = N Y k + α N + K α

N N :样本数
NYk N Y k :类别为 Yk Y k 的样本数
K K :总的类别个数
α α :平滑值

P(xi|Yk)=NYk,xi+αNYk+nα P ( x i | Y k ) = N Y k , x i + α N Y k + n α

NYk,xi N Y k , x i :类别为 Yk Y k ,且特征为 x1 x 1 的样本数
n n :特征 x1 x 1 可以选择的数量

  • 高斯模型
    当特征是连续变量的时候,假设特征分布为正太分布,根据样本算出均值和方差,再求得概率。
    这里写图片描述
  • 伯努利模型
    伯努利模型适用于离散特征的情况,伯努利模型中每个特征的取值只能是1和0。
    这里写图片描述

算法流程
1. 处理数据,得到m个具有n个特征的样本,这些样本分别属于 {Y1,Y2,Y3} { Y 1 , Y 2 , Y 3 } 类别(类别数量增多,这里说明朴素贝叶斯处理多分类问题的流程)。
2. 通过数据分析可以得到每个特征的类条件概率 P(xi|Y) P ( x i | Y ) ,再通过全概率公式求得 P(X) P ( X )

P(X)=P(X|Y1)P(Y1)+P(X|Y2)P(Y2)+P(X|Y3)P(Y3) P ( X ) = P ( X | Y 1 ) P ( Y 1 ) + P ( X | Y 2 ) P ( Y 2 ) + P ( X | Y 3 ) P ( Y 3 )
其中 P(X|Yk) P ( X | Y k ) 可根据特征独立性展开。
3. 将求得的先验概率和类条件概率带入朴素贝叶斯公式,求得每个类别的后验概率。我们可以选择概率最大的类别为最后确定的类别。


2. sklearn实战

使用的是sklearn.naive_bayes中的高斯模型,数据为约会数据(是连续的),数据和代码可前往:https://github.com/AugusXJ/scikit_learn/tree/master/Bayes

from sklearn import metrics
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler

# 读取数据
X = []
Y = []
fr = open("datingTestSet.txt")
index = 0
for line in fr.readlines():
    line = line.strip()
    line = line.split('\t')
    X.append(line[:3])
    Y.append(line[-1])

#归一化
scaler = MinMaxScaler()
X = scaler.fit_transform(X)

# 交叉分类
train_X,test_X, train_y, test_y = train_test_split(X,
                                                   Y,
                                                   test_size=0.2) # test_size:测试集比例20%

# KNN模型,选择3个邻居
model = GaussianNB()

model.fit(train_X, train_y)
print(model)

expected = test_y
predicted = model.predict(test_X)
print(metrics.classification_report(expected, predicted))       # 输出分类信息
label = list(set(Y))    # 去重复,得到标签类别
print(metrics.confusion_matrix(expected, predicted, labels=label))  # 输出混淆矩阵信息

你可能感兴趣的:(机器学习)