朴素贝叶斯算法
算法原理对数据的要求算法的优缺点算法需要注意的点算法实现(python)(待更.......)算法原理
P(Ck∣xi)=p(xi∣ck)∗p(ck)p(xi)=p(x1∣ck)∗p(x2∣ck)....p(ck)p(x1)p(x2)....P(C_k|x_i)=\frac{p(x_i|c_k)*p(c_k)}{p(x_i)}=\frac{p(x_1|c_k)*p(x_2|c_k)....p(c_k)}{p(x_1)p(x_2)....}P(Ck∣xi)=p(xi)p(xi∣ck)∗p(ck)=p(x1)p(x2)....p(x1∣ck)∗p(x2∣ck)....p(ck)(条件是独立同分布)(原理给出先验求后验)
对数据的要求
1.能处理缺失值
2. 需要离散化连续性数据
3. 数据不需要标准化或者归一化处理
算法的优缺点
一、优点
1、有坚实的数学基础,以及稳定的分类效率
2、对小规模数据表现良好,能处理多分类问题,适合增量学习
3、 对于结果解释容易理解
4、能够处理缺失值
一、缺点
1、 对于输入数据敏感(离散、连续…)
2、 需要计算先验概率,分类决策存在错误率
3.、模型假设属性之间相互独立,但这个假设在实际中往往不成立
算法需要注意的点
1. 朴素贝叶斯为啥被称为朴素?
朴素体现在每个特征都是独立同分布(假设)避免求解时面临组合爆炸
2. p(xi∣ck)=0p(x_i|c_k)=0p(xi∣ck)=0时怎么办(或者特征没有取到样例)?
采用拉普拉斯平滑p(y=ck)=∑i=1NI(yi=ck)+λN+kλp(y=c_k)=\frac{\sum_{i=1}^NI(y_i=c_k)+\lambda}{N+k\lambda}p(y=ck)=N+kλ∑i=1NI(yi=ck)+λ
3. 为什么独立性假设在实际中很难成立,但朴素贝叶斯效果仍很好?
1、建模之前排除了特征之间的共线性
2、对于分类任务,只要类别条件概率排序正确,无需精准P
3、如果属性间依赖对所有类别影响相同,或影响相互抵消,最后影响不大
算法实现(python)(待更…)
import numpy as np import pandas as pdfrom sklearn.naive_bayes import GaussianNBimport osos.chdir(r'E:/wyz/Desktop/data/')#读取数据data = pd.read_excel('lw.xlsx',sheet_name = 'Sheet2')#数据切分y = data_model['target']x = data_model.drop('target', axis=1)x_train, x_test, y_train, y_test = train_test_split(x, y,random_state=0,train_size=0.7)#训练clf = GaussianNB()clf = clf.fit(x_train, y_train)#预测y_pred=clf.predict(x_test)