Udacity机器学习入门笔记1-朴素贝叶斯
1.监督学习与非监督学习的区别
监督学习是从给定的训练数据集中学习出一个函数(模型参数),当新的数据到来时,可以根据这个函数预测结果。监督学习的训练集要求包括输入输出,也可以说是特征和目标。
无监督学习是输入数据没有被标记,也没有确定的结果。样本数据类别未知,需要根据样本间的相似性对样本集进行分类(聚类,clustering)试图使类内差距最小化,类间差距最大化。
2.决策面
当决策面为直线的时候,我们称它为线性决策面
机器学习算法所做的是 获取数据->并将其转化成一个决策面(D.S)
3.朴素贝叶斯
朴素贝叶斯法(Naive Bayes)是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入 x ,利用贝叶斯定理求出后验概率最大的输出 y 。朴素贝叶斯法是基于概率论的分类算法。
3.1 先验概率
先验概率(prior probability)是指根据以往经验和分析得到的概率。
假设某公园中一个人是男性为事件 Y=ymen ,是女性则是 Y=ywomen ;其中 P(Y=ymen)与P(Y=ywomen) 可以根据例子中“该公园中男女比例通常为 2:1 ” 这一以往经验求得:P(Y=ymen)=
32 以及 P(Y=ywomen)=
31。
3.2 条件概率
条件概率是指在事件Y=y已经发生的条件下,事件X=x发生的概率。条件概率可表示为P(X=x| Y=y)。而条件概率计算公司为:
P(X=x∣Y=y)=P(Y=y)P(X=x,Y=y)
其中 P(X=x,Y=y) 是联合概率,也就是两个事件共同发生的概率。而 P(Y=y)以及P(X=x) 是先验概率。
3.3 全概率公式
全概率公式是指:如果事件 Y=y1,Y=y2,…,Y=yn 可构成一个完备事件组,即它们两两互不相容,其和为全集。则对于事件 X=x 有:
P(X=x)=i=1∑nP(Y=yi)P(X=x∣Y=yi)
3.4后验概率
后验概率是指,某事件 X=x 已经发生,那么该事件是因为事件 Y=y 的而发生的概率。
后验概率的计算要以先验概率为基础。后验概率可以根据通过贝叶斯公式,用先验概率和似然函数计算出来。
贝叶斯公式如下:
P(Y=ymen∣X=x1)=P(X=x1)P(X=x1∣Y=ymen)P(Y=ymen)=∑i=men,womenP(Y=yi)P(X=x1∣Y=yi)P(X=x1∣Y=ymen)P(Y=ymen)
其中
P(Y=ymen∣X=x1)为所求后验概率,
P(X=x1∣Y=ymen)为条件概率,P(Y=ymen) 为先验概率,P(X=x1)=
∑i=men,womenP(Y=yi)P(X=x1∣Y=yi) 为全概率公式。
而朴素贝叶斯算法正是利用以上信息求解后验概率,并依据后验概率的值来进行分类。
3.5朴素贝叶斯的推导
对于样本集:
D={(x1(1),x2(1),⋯,xn(1),y1),(x1(2),x2(2),⋯,xn(2),y2),⋯,(x1(m),x2(m),⋯,xn(m),ym)}
其中 m 表示有 m 个样本, n 表示有 n 个特征。
yi,i=1,2,…,m 表示样本类别,取值为 {C1,C2,…,CK} 。
先验概率为:
P(Y=Ck),k=1,2,...,K
条件概率为(依据条件独立假设):
P(X=x∣Y=Ck)=P(X1=x1,X2=x2,…,Xn=xn∣Y=Ck)=j=1∏nP(Xj=xj∣Y=Ck)
则后验概率为:
P(Y=Ck∣X=x)=∑kP(X=x∣Y=Ck)P(Y=Ck)P(X=x∣Y=Ck)P(Y=Ck)
将条件概率公式带入得:
P(Y=Ck∣X=x)=∑k∏j=1nP(Xj=xj∣Y=Ck)P(Y=Ck)∏j=1nP(Xj=xj∣Y=Ck)P(Y=Ck)
上式为朴素贝叶斯分类的基本公式。于是,朴素贝叶斯分类器可表示为:
P(Y=Ck∣X=x)=argmaxCk∑k∏j=1nP(Xj=xj∣Y=Ck)P(Y=Ck)∏j=1nP(Xj=xj∣Y=Ck)P(Y=Ck)
由于分母对所有的
Ck 都是相同的,所以:
P(Y=Ck∣X=x)=argmaxCkj=1∏nP(Xj=xj∣Y=Ck)P(Y=Ck)
argmaxCk表示取使后面式子最大的参数
Ck。
3.6参数估计
3.6.1 极大似然估计
针对样本集我们可以利用极大似然估计计算出以下一些信息:
先验概率:
P(Y=Ck)=m∑i=1mI(yi=Ck),k=1,2,⋯,K
其中
∑i=1mI(yi=Ck)计算的是样本类别为
Ck的总数。先验概率计算的是类别
Ck在样本集中的频率。
条件概率:
P(Xj=ajl∣Y=Ck)=∑i=1mI(yi=Ck)∑i=1mI(xj(i)=ajl,yi=Ck)
其中第 j 个特征的取值可能是 {
aj1,aj2,...,ajh} ,共 h 个。该条件概率指的是,在样本类别为
Ck 的子样本集中,第 j 个特征取值为 ajl 的样本的频率。
3.6.2 贝叶斯估计
为了弥补极大似然估计中可能出现概率值为0的情况(也就是某个事件出现的次数为0)。于是使用贝叶斯估计,如下:
先验概率:
P(Y=Ck)=m+Kλ∑i=1mI(yi=Ck)+λ,k=1,2,⋯,K
其中 K 为类别的个数。
条件概率:
P(Xj=ajl∣Y=Ck)=∑i=1mI(yi=Ck)+Sjλ∑i=1mI(xj(i)=ajl,yi=Ck)+λ
其中
Sj 为特征
Xj 取值的个数 h 。
3.7 朴素贝叶斯算法过程
样本集:
D={(x1(1),x2(1),⋯,xn(1),y1),(x1(2),x2(2),⋯,xn(2),y2),⋯,(x1(m),x2(m),⋯,xn(m),ym)}
其中
yi,i=1,2,…,m 表示样本类别,取值为 {
C1,C2,...,CK} 。
- 计算先验概率:求出样本类别的个数 K 。对于每一个样本 Y=
Ck ,计算出 P(Y=
Ck) 。其为类别
Ck在总样本集中的频率。
- 计算条件概率:将样本集划分成 K 个子样本集,分别对属于
Ck 的子样本集进行计算,计算出其中特征
Xj=ajl的概率:
P(Xj=ajl∣Y=Ck)。其为该子集中特征取值为
ajl 的样本数与该子集样本数的比值。
- 针对待预测样本
xtest ,计算其对于每个类别
Ck 的后验概率:
P(Y=Ck∣X=xtest)=j=1∏nP(Xj=xjtest∣Y=Ck)P(Y=Ck)。概率值最大的类别即为待预测样本的预测类别。
4.Sklearn
4.1 naive_bayes GaussianNB 例子
import numpy as np
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
Y = np.array([1, 1, 1, 2, 2, 2])
from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
clf.fit(X, Y)
print(clf.predict([[-0.8, -1]]))
clf_pf = GaussianNB()
clf_pf.partial_fit(X, Y, np.unique(Y))
print(clf_pf.predict([[-0.8, -1]]))
5.迷你project
5.1准备
检查你是否装有可用的 python,版本最好是 2.6 或 2.7(这是我们使用的版本 - 其他版本应该也可以,但我们不敢保证)。
我们会使用 pip 来安装一些包。首先,从此处获取并安装 pip
使用 pip 安装一系列 Python 包:
转到终端行界面(请勿打开 Python,只打开命令提示符)
安装 sklearn: pip install scikit-learn
此处包含 sklearn 安装说明,可供参考
安装自然语言工具包:pip install nltk
获取机器学习简介源代码。你将需要 git 来复制资源库:git clone https://github.com/udacity/ud120-projects.git
你只需操作一次,基础代码包含所有迷你项目的初始代码。进入 tools/ 目录,运行 startup.py。该程序首先检查 python 模块,然后下载并解压缩我们在后期将大量使用的大型数据集。下载和解压缩需要一些时间,但是你无需等到全部完成再开始第一部分。
5.2修改email_preprocess.py
由于sklearn版本变更修改tools/下email_preprocess.py
from sklearn import cross_validation 改成
from sklearn import model_selection
5.2代码实现
### your code goes here ###
from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
t0 = time()
clf.fit(features_train,labels_train)
print "training time:", round(time()-t0,3),"s"
t0 = time()
pred =clf.predict(features_test)
print "predict time:", round(time()-t0,3),"s"
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(labels_test,pred)
print accuracy