本文目录一览:
python sklearn 朴素贝叶斯多分类怎么做
用的过程是这样考虑的,xpath 是你需要知道文档结构,而beautifulsoup 是不知道的时候去尝试找某些标签。 说的不对的话请轻喷,用的场景不同。
python scikit-learn 有什么算法
- 前言 很久不发文章,主要是Copy别人的总感觉有些不爽,所以整理些干货,希望相互学习吧。不啰嗦,进入主题吧,本文主要时说的为朴素贝叶斯分类算法。与逻辑回归,决策树一样,是较为广泛使用的有监督分类算法,简单且易于理解(号称十大数据挖掘算法中最简单的算法)。但其在处理文本分类,邮件分类,拼写纠错,中文分词,统计机器翻译等自然语言处理范畴较为广泛使用,或许主要得益于基于概率理论,本文主要为小编从理论理解到实践的过程记录。
- 公式推断 一些贝叶斯定理预习知识:我们知道当事件A和事件B独立时,P(AB)=P(A)(B),但如果事件不独立,则P(AB)=P(A)P(B|A)。为两件事件同时发生时的一般公式,即无论事件A和B是否独立。当然也可以写成P(AB)=P(B)P(A|B),表示若要两件事同事发生,则需要事件B发生后,事件A也要发生。 由上可知,P(A)P(B|A)= P(B)P(A|B) 推出P(B|A)= 其中P(B)为先验概率,P(B|A)为B的后验概率,P(A|B)为A的后验概率(在这里也为似然值),P(A)为A的先验概率(在这也为归一化常量)。 由上推导可知,其实朴素贝叶斯法就是在贝叶斯定理基础上,加上特征条件独立假设,对特定输入的X(样本,包含N个特征),求出后验概率最大值时的类标签Y(如是否为垃圾邮件),理解起来比逻辑回归要简单多,有木有,这也是本算法优点之一,当然运行起来由于得益于特征独立假设,运行速度也更快。
- 参数估计 由上面推断出的公式,我们知道其实朴素贝叶斯方法的学习就是对概率P(Y=ck)和P(X(j)=x(j)|Y=ck)的估计。我们可以用极大似然估计法估计上述先验概率和条件概率。 其中I(x)为指示函数,若括号内成立,则计1,否则为0。李航的课本直接给出了用极大似然(MLE)估计求出的结果,并没给推导过程, 我们知道,贝叶斯较为常见的问题为0概率问题。为此,需要平滑处理,主要使用拉普拉斯平滑,如下所示: K是类的个数,Sj是第j维特征的最大取值。实际上平滑因子λ=0即为最大似然估计,这时会出现提到的0概率问题;而λ=1则避免了0概率问题,这种方法被称为拉普拉斯平滑。
- 算法流程
- 朴素贝叶斯算法优缺点
- 优点:
- 朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率
- 需调参较少,简单高效,尤其是在文本分类/垃圾文本过滤/情感判别等自然语言处理有广泛应用。
- 在样本量较少情况下,也能获得较好效果,计算复杂度较小,即使在多分类问题。
- 无论是类别类输入还是数值型输入(默认符合正态分布)都有相应模型可以运用。
- 缺点:
- 0概率问题,需要平滑处理,通常为拉普拉斯平滑,但加一平滑不一定为效果最好,
- 朴素贝叶斯有分布独立的假设前提,生活中较少完全独立,在属性个数比较多或者属性之间相关性较大时,NBC模型的分类效率比不上决策树模型。而在属性相关性较小时,NBC模型的性能最为良好。
- 模型注意点:
- 大家也知道,很多特征是连续数值型的,一般选择使用朴素贝叶斯高斯模型。
- 为避免0概率事件,记得平滑,简单一点可以用『拉普拉斯平滑』。先处理处理特征,把相关特征去掉,
- 朴素贝叶斯分类器一般可调参数比较少,需集中精力进行数据的预处理等特征工程工作。
- 优点:
- Scikit-learn三大朴素贝叶斯模型
Scikit-learn里面有3种不同类型的朴素贝叶斯(:
- 高斯分布型模型:用于classification问题,假定属性/特征是服从正态分布的,一般用在数值型特征。
- 多项式型模型:用于离散值模型里。比如文本分类问题里面我们提到过,我们不光看词语是否在文本中出现,也得看出现的次数。如果总词数为n,出现词数为m的话,说起来有点像掷骰子n次出现m次这个词的场景。
- 伯努利模型:这种情况下,就如提到的bag ofwords处理方式一样,最后得到的特征只有0(没出现)和1(出现过)。
- Scikit-learn算法实践 小编通过实现朴素贝叶斯三种模型以及主要分类算法,对比发现跟SVM,随机森林,融合算法相比,贝叶斯差距明显,但其时间消耗要远低于上述算法,以下为主要算法主要评估指标)。
- Python代码
# -*-coding: utf-8 -*- import time from sklearn import metrics from sklearn.naive_bayes import GaussianNB from sklearn.naive_bayes import MultinomialNB from sklearn.naive_bayes import BernoulliNB from sklearn.neighbors import KNeighborsClassifier from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn import tree from sklearn.ensemble import GradientBoostingClassifier from sklearn.svm import SVC import numpy as np import urllib # url with dataset url = "-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data" # download the file raw_data = urllib.request.urlopen(url) # load the CSV file as a numpy matrix dataset = np.loadtxt(raw_data, delimiter=",") # separate the data from the target attributes X = dataset[:,0:7] y = dataset[:,8] print("\n调用scikit的朴素贝叶斯算法包GaussianNB ") model = GaussianNB() start_time = time.time() model.fit(X, y) print('training took %fs!' % (time.time() - start_time)) print(model) expected = y predicted = model.predict(X) print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted)) print("\n调用scikit的朴素贝叶斯算法包MultinomialNB ") model = MultinomialNB(alpha=1) start_time = time.time() model.fit(X, y) print('training took %fs!' % (time.time() - start_time)) print(model) expected = y predicted = model.predict(X) print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted)) print("\n调用scikit的朴素贝叶斯算法包BernoulliNB ") model = BernoulliNB(alpha=1, binarize=0.0) start_time = time.time() model.fit(X, y) print('training took %fs!' % (time.time() - start_time)) print(model) expected = y predicted = model.predict(X) print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted)) print("\n调用scikit的KNeighborsClassifier ") model = KNeighborsClassifier() start_time = time.time() model.fit(X, y) print('training took %fs!' % (time.time() - start_time)) print(model) expected = y predicted = model.predict(X) print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted)) print("\n调用scikit的LogisticRegression(penalty='l2') ") model = LogisticRegression(penalty='l2') start_time = time.time() model.fit(X, y) print('training took %fs!' % (time.time() - start_time)) print(model) expected = y predicted = model.predict(X) print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted)) print("\n调用scikit的RandomForestClassifier(n_estimators=8) ") model = RandomForestClassifier(n_estimators=8) start_time = time.time() model.fit(X, y) print('training took %fs!' % (time.time() - start_time)) print(model) expected = y predicted = model.predict(X) print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted)) print("\n调用scikit的tree.DecisionTreeClassifier() ") model = tree.DecisionTreeClassifier() start_time = time.time() model.fit(X, y) print('training took %fs!' % (time.time() - start_time)) print(model) expected = y predicted = model.predict(X) print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted)) print("\n调用scikit的GradientBoostingClassifier(n_estimators=200) ") model = GradientBoostingClassifier(n_estimators=200) start_time = time.time() model.fit(X, y) print('training took %fs!' % (time.time() - start_time)) print(model) expected = y predicted = model.predict(X) print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted)) print("\n调用scikit的SVC(kernel='rbf', probability=True) ") model = SVC(kernel='rbf', probability=True) start_time = time.time() model.fit(X, y) print('training took %fs!' % (time.time() - start_time)) print(model) expected = y predicted = model.predict(X) print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted))
朴素贝叶斯分类算法的sklearn实现
- 背景 《机器学习实战》当中,用python根据贝叶斯公式实现了基本的分类算法。现在来看看用sklearn,如何实现。还拿之前的例子,对帖子的分类。数据如下: 补充:题目的值左边是几个人的评论,右边是评论属于侮辱类(1)、正常类(0),需要进行文本分类,且再有新的文本过来时能自动划分至0或1。
- 分类
(1)算法的准备
通过查看sklearn的训练模型函数,
fit(X, Y)
,发现只需要准备两个参数。一个是数据的矩阵,另一个是数据的分类数组。首先就是将以上的文本转化成矩阵。 在前一章其实已经讲解过如何将文本转化成矩阵。这里将示意的再补充下。 a. 首先选取所有的单词,形成列,也可理解为属性。例如: b. 其次将遍历每个文本,填满上述列的值。文本出现过列的次,填一。没有出现过填0。比如第一句就是:my dog has flea problems help please,可表示为: 同理所有的文本都可如此表示,所以就形成了一个数字的矩阵。 (2)beyes模型的选择 在完成数据的准备以后,就可以直接调用sklearn的模型和函数完成模型的训练啦。但在beyes模型的选择的时候发现,beyes下有多个模型可选择,所以这个会让人纠结。接下来共同了解下这些模型: a. 高斯模型(GaussianNB) 高斯模型是对于每个属性的值是连续的,且服从高斯分布时可使用: 比如人的身高,比如花的高度等等。当然你也可将这些数据离散化,比如按等距划分、等频划分成离散的值,但可能效果都没有直接用高斯模型来计算的好。- 用法:
class sklearn.naive_bayes.GaussianNB
- 参数:无 b. 多项式模型(MultinominalNB) 如果大部分是多元离散值,则采用多项式模型要好些。多项式模型,通常就是构造参数向量,然后通过极大似然估计来寻求参数的最有值。 这里只简单的略列一些公式,具体可查询更多资料。从这个计算过程中可得出,这里引入啦一个平滑先验值alpha,这个值在模型训练的时候也会用到。通常alpha0,可引入不在训练集的特征,尤其当alpha=1,成为拉普拉丝平滑。具体alpha取值对模型的影响可附件的图。
- 用法:
class sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
- 参数:
alpha
:浮点数,就是上述说的引入平滑的值;fit_prior
:bool值,如果为True,则不用去学习P(y=ck),以均匀分布替代,否则则去学习P(y=ck)(不懂)class_prior
:一个数组。它指定了每个分类的先验概率P(y=c1), P(y=c2)…..,若指定了该参数,则每个分类的先验概率无需学习 (不懂) c. 伯努利模型(BernoulliNB) 如果特征值为二元离散值或是稀疏的多元离散值,则可采用伯努利模型。
- 公式:
class sklearn.naive_bayes.BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)
- 参数:
binarize
:一个浮点数或者None,如果为浮点数则以该数值为界,特征值大于它的取1,小于的为0 。如果为None,假定原始数据已经二值化- 其它参数同上。 通过以上的模型对比和分析,由于文本分析转化后是很多二项取值的稀疏矩阵,因此选取伯努利模型效果会更佳。 补充:alpha、binarize值对模型效果的影响
- 用法:
贝叶斯网络和贝叶斯分类算法的区别
- 贝叶斯网络是:一种概率网络,它是基于概率推理的图形化网络,而贝叶斯公式则是这个概率网络的基础。贝叶斯网络是基于概率推理的数学模型,所谓概率推理就是通过一些变量的信息来获取其他的概率信息的过程,基于概率推理的贝叶斯网络(Bayesian network)是为了解决不定性和不完整性问题而提出的,它对于解决复杂设备不确定性和关联性引起的故障有很的优势,在多个领域中获得广泛应用。
- 贝叶斯分类算法是:统计学的一种分类方法,它是一类利用概率统计知识进行分类的算法。在许多场合,朴素贝叶斯(Naïve Bayes,NB)分类算法可以与决策树和神经网络分类算法相媲美,该算法能运用到大型数据库中,而且方法简单、分类准确率高、速度快。
- 贝叶斯网络和贝叶斯分类算法的区别:由于贝叶斯定理假设一个属性值对给定类的影响独立于其它属性的值,而此假设在实际情况中经常是不成立的,因此其分类准确率可能会下降。为此,就衍生出许多降低独立性假设的贝叶斯分类算法,如TAN(tree augmented Bayes network)算法。 贝叶斯分类算法是统计学的一种分类方法,它是一类利用概率统计知识进行分类的算法。在许多场合,朴素贝叶斯(Naïve Bayes,NB)分类算法可以与决策树和神经网络分类算法相媲美,该算法能运用到大型数据库中,而且方法简单、分类准确率高、速度快。 由于贝叶斯定理假设一个属性值对给定类的影响独立于其它属性的值,而此假设在实际情况中经常是不成立的,因此其分类准确率可能会下降。为此,就衍生出许多降低独立性假设的贝叶斯分类算法,如TAN(tree augmented Bayes network)算法。