朴素贝叶斯算法(Naive Bayesian algorithm) 是应用最为广泛的分类算法之一。
朴素贝叶斯方法是在贝叶斯算法的基础上进行了相应的简化,即假定给定目标值时属性之间相互条件独立
。也就是说没有哪个属性变量对于决策结果来说占有着较大的比重,也没有哪个属性变量对于决策结果占有着较小的比重。虽然这个简化方式在一定程度上降低了贝叶斯分类算法的分类效果,但是在实际的应用场景中,极大地简化了贝叶斯方法的复杂性。
对于给定的训练集,首先基于特征条件独立假设学习输入输出的联合概率分布(朴素贝叶斯法这种通过学习得到模型的机制,显然属于生成模型);然后基于此模型,对给定的输入 x,利用贝叶斯定理求出后验概率最大的输出 y。
贝叶斯公式推导示例 :
已知某学校学生总人数为U,其中男生 : 60 % 60 \% 60%,女生 : 40 % 40 \% 40%
男生总是穿长裤, 女生则一半穿长裤一半穿裙子
正向概率: 随机选取一个学生, 他 (她) 穿长裤的概率和穿裙子的概率是多大
逆向概率: 迎面走来一个穿长裤的学生, 你只看得见他 (她) 穿的是否长裤, 而无法确定他 (她) 的性别, 你能够推断出他(她)是女生的概率是多大吗?
穿长裤的(男生): U ∗ P ( B o y ) ∗ P ( P a n t s ∣ B o y ) U * P( Boy) * P (Pants \mid Boy) U∗P(Boy)∗P(Pants∣Boy)
P ( \mathrm{P}( P( Boy) 是男生的概率 = 60 % =60 \% =60%
P \mathrm{P} P (Pants|Boy) 是条件概率, 即在 Boy 这个条件下穿长裤的概 率是多大, 这里是 100 % 100 \% 100%, 因为所有男生都穿长裤
穿长裤的(女生) : U ∗ P ( G i r l ) ∗ P ( P a n t s ∣ G i r l ) U * P(Girl) *P( Pants \mid Girl) U∗P(Girl)∗P(Pants∣Girl)
求解: 穿长裤的人里面有多少女生
穿长裤总数: U ∗ P ( B o y ) ∗ P ( P a n t s ∣ B o y ) + U ∗ P ( G i r l ) ∗ P ( P a n t s ∣ G i r l ) U * P( Boy ) * P(Pants \mid Boy )+U * P( Girl ) * P( Pants \mid Girl ) U∗P(Boy)∗P(Pants∣Boy)+U∗P(Girl)∗P(Pants∣Girl)
P ( G i r l ∣ P a n t s ) = U ∗ P ( G i r l ) ∗ P ( P a n t s ∣ G i r l ) / P( Girl|Pants )=U * P(G i r l) * P( Pants \mid Girl ) / P(Girl∣Pants)=U∗P(Girl)∗P(Pants∣Girl)/ 穿长裤总数
U ∗ P ( G i r l ) ∗ P ( P a n t s ∣ G i r l ) / [ U ∗ P ( B o y ) ∗ P ( P a n t s ∣ B o y ) + U ∗ P ( G i r l ) ∗ P ( P a n t s ∣ G i r l ) ] U^{*} P( Girl ) * P( Pants \mid Girl ) /[U * P( Boy ) * P( Pants \mid Boy )+U * P( Girl ) * P( Pants \mid Girl )] U∗P(Girl)∗P(Pants∣Girl)/[U∗P(Boy)∗P(Pants∣Boy)+U∗P(Girl)∗P(Pants∣Girl)]
= P ( G i r l ) ∗ P ( P a n t s ∣ G i r l ) / [ P ( B o y ) ∗ P ( P a n t s ∣ B o y ) + P ( G i r l ) ∗ P ( P a n t s ∣ G i r l ) ] = P( Girl ) * P( Pants \mid Girl ) /[ P( Boy ) * P( Pants \mid Boy )+P( Girl ) * P( Pants \mid Girl )] =P(Girl)∗P(Pants∣Girl)/[P(Boy)∗P(Pants∣Boy)+P(Girl)∗P(Pants∣Girl)]
可以发现最终结果与总人数无关。
由以上示例可推导出贝叶斯公式,此公式将 P ( A ∣ B ) P(A|B) P(A∣B)与 P ( B ∣ A ) P(B|A) P(B∣A)联系起来。
贝叶斯定理
:贝叶斯理论是以18世纪的一位神学家托马斯.贝叶斯(Thomas Bayes)命名。通常,事件A在事件B (发生) 的条件下的概率, 与事件B在事件A (发生) 的条件下的概率是不一样的。然而,这两者是有确是的关系的,贝叶斯定理就是这种关系的阵述。
P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A \mid B)=\frac{P(B \mid A) P(A)}{P(B)} P(A∣B)=P(B)P(B∣A)P(A)
朴素贝叶斯方法是其于贝叶斯定理和特征条件独立
假设的分类方法。对于给定的训练数据集,首先其于特征条件独立假设学习输入输出的联合概率分布;然后基于此模型,对于给定的输入 x x x ,通过学习到的模型计算后验概率分布 P ( Y = c k ∣ X = P\left(Y=c_{k} \mid X=\right. P(Y=ck∣X= x x x ),将后验概率最大的类作为 x x x 的类输出。其中后验概率计算根据贝叶斯定理进行:
条件概率(条件独立):
P ( X = x ∣ Y = c k ) = P ( X ( 1 ) = x ( 1 ) , … , X ( n ) = x ( n ) ∣ Y = c k ) = ∏ j = 1 n P ( X ( j ) = x j ∣ Y = c k ) P\left(X=x \mid Y=c_{k}\right)=P\left(X^{(1)=} x^{(1)}, \ldots, X^{(n)=} x^{(n)} \mid Y=c_{k}\right)=\prod_{j=1}^{n} P\left(X^{(j)}=x^{j} \mid Y=c_{k}\right) P(X=x∣Y=ck)=P(X(1)=x(1),…,X(n)=x(n)∣Y=ck)=j=1∏nP(X(j)=xj∣Y=ck)
P ( Y = c k ∣ X = x ) = P ( X = x ∣ Y = c k ) P ( Y = c k ) ∑ k P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) P\left(Y=c_{k} \mid X=x\right)=\frac{P\left(X=x \mid Y=c_{k}\right) P\left(Y=c_{k}\right)}{\sum_{k} P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} \mid Y=c_{k}\right)} P(Y=ck∣X=x)=∑kP(Y=ck)∏jP(X(j)=x(j)∣Y=ck)P(X=x∣Y=ck)P(Y=ck)
然后,最后的朴素贝叶斯分类模型为:
y = f ( x ) = arg max c k P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) ∑ k P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) y=f(x)=\operatorname{arg \ max}_{c_{k}} \frac{P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} \mid Y=c_{k}\right)}{\sum_{k} P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} \mid Y=c_{k}\right)} y=f(x)=arg maxck∑kP(Y=ck)∏jP(X(j)=x(j)∣Y=ck)P(Y=ck)∏jP(X(j)=x(j)∣Y=ck)
针对贝叶斯定理,由于所有类别的全概 P ( x ) P(x) P(x)部分相同,那么
y = arg max c k P ( Y = c k ) ∏ j = 1 d P ( X ( j ) = x ( j ) ∣ Y = c k ) y=\operatorname{arg \ max}_{c_{k}}{P\left(Y=c_{k}\right) \prod_{j=1}^d P\left(X^{(j)}=x^{(j)} \mid Y=c_{k}\right)} y=arg maxckP(Y=ck)j=1∏dP(X(j)=x(j)∣Y=ck)
极大似然估计(Maximum Likelihood Estimation,MLE)和贝叶斯估计(Bayesian Estimation)是统计推断中两种最常用的参数估计方法。
以西瓜书机器学习示例来了解朴素贝叶斯算法过程
数据集:
测试数据:
概率分布函数
对连续属性可考虑概率密度函数, 假定 p ( x i ∣ c ) ∼ N ( μ c , i , σ c , i 2 ) p\left(x_{i} \mid c\right) \sim \mathcal{N}\left(\mu_{c, i}, \sigma_{c, i}^{2}\right) p(xi∣c)∼N(μc,i,σc,i2), 其中 μ c , i \mu_{c, i} μc,i 和 σ c , i 2 \sigma_{c, i}^{2} σc,i2 分别是第 c c c 类样本在第 i i i 个属性上取值的均值和方差, 则有
p ( x i ∣ c ) = 1 2 π σ c , i exp ( − ( x i − μ c , i ) 2 2 σ c , i 2 ) p\left(x_{i} \mid c\right)=\frac{1}{\sqrt{2 \pi} \sigma_{c, i}} \exp \left(-\frac{\left(x_{i}-\mu_{c, i}\right)^{2}}{2 \sigma_{c, i}^{2}}\right) p(xi∣c)=2πσc,i1exp(−2σc,i2(xi−μc,i)2)
对离散属性而言, 令 D c , x i D_{c, x_{i}} Dc,xi 表示 D c D_{c} Dc 中在第 i i i 个属性上取值为 x i x_{i} xi 的样本组成的 集合, 则条件概率 P ( x i ∣ c ) P\left(x_{i} \mid c\right) P(xi∣c) 可估计为
P ( x i ∣ c ) = ∣ D c , x i ∣ ∣ D c ∣ P\left(x_{i} \mid c\right)=\frac{\left|D_{c, x_{i}}\right|}{\left|D_{c}\right|} P(xi∣c)=∣Dc∣∣Dc,xi∣
若某个属性值在训练集中没有与某个类同时出现过, 则直接基于进行概率估计, 再根据朴素贝叶斯进行判别将出现问题. 例如, 在使用西瓜数据集训练朴素贝叶斯分类器时, 对一个 “敲声=清脆” 的测试例, 有
P 清晰|是 = P ( 敲声 = 清脆 ∣ 好瓜 = 是 ) = 0 8 = 0 , P_{\text {清晰|是 }}=P(\text { 敲声 }=\text { 清脆 } \mid \text { 好瓜 }=\text { 是 })=\frac{0}{8}=0, P清晰|是 =P( 敲声 = 清脆 ∣ 好瓜 = 是 )=80=0,
由于朴素贝叶斯的连乘式计算出的概率值为零, 因此, 无论该样本的其他属性是什 么, 哪怕在其他属性上明显像好瓜, 分类的结果都将是 “好瓜=否”, 这显然不太合理.
为了避免其他属性携带的信息被训练集中末出现的属性值“抺去”, 在估计概率值时通常要进行 “平滑”, 常用 “拉普拉斯修正” . 具体来说, 令 N N N 表示训练集 D D D 中可能的类别数, N i N_{i} Ni 表示第 i i i 个属性可能的取值数, 参数估计修正为
P ^ ( c ) = ∣ D c ∣ + 1 ∣ D ∣ + N , P ^ ( x i ∣ c ) = ∣ D c , x i ∣ + 1 ∣ D c ∣ + N i . \begin{aligned} \hat{P}(c) &=\frac{\left|D_{c}\right|+1}{|D|+N}, \\ \hat{P}\left(x_{i} \mid c\right) &=\frac{\left|D_{c, x_{i}}\right|+1}{\left|D_{c}\right|+N_{i}} . \end{aligned} P^(c)P^(xi∣c)=∣D∣+N∣Dc∣+1,=∣Dc∣+Ni∣Dc,xi∣+1.
先验概率可估计为
P ^ ( 好瓜 = 是 ) = 8 + 1 17 + 2 ≈ 0.474 , P ^ ( 好瓜 = 否 ) = 9 + 1 17 + 2 ≈ 0.526 . \hat{P}(\text { 好瓜 }=\text { 是 })=\frac{8+1}{17+2} \approx 0.474, \hat{P}(\text { 好瓜 }=\text { 否 })=\frac{9+1}{17+2} \approx 0.526 \text {. } P^( 好瓜 = 是 )=17+28+1≈0.474,P^( 好瓜 = 否 )=17+29+1≈0.526.
P 青绿 ∣ 是 和 P 青绿 ∣ 否 P_{\text {青绿}\mid \text{是}}和P_{\text {青绿}\mid \text{否}} P青绿∣是和P青绿∣否可估计为
P ^ 青绿 ∣ 是 = P ^ ( 色泽 = 青绿 ∣ 好瓜 = 是 ) = 3 + 1 8 + 3 ≈ 0.364 \hat{P}_{\text {青绿}\mid \text{是}}=\hat{P}(\text { 色泽 }=\text { 青绿 } \mid \text { 好瓜 }=\text { 是 })=\frac{3+1}{8+3} \approx 0.364 P^青绿∣是=P^( 色泽 = 青绿 ∣ 好瓜 = 是 )=8+33+1≈0.364
P ^ 青绿 ∣ 否 = P ^ ( 色泽 = 青绿 ∣ 好瓜 = 否 ) = 3 + 1 9 + 3 ≈ 0.333. \hat{P}_{\text {青绿 }\mid \text { 否 }}=\hat{P}(\text { 色泽 }=\text { 青绿 } \mid \text { 好瓜 }=\text { 否 })=\frac{3+1}{9+3} \approx 0.333 . P^青绿 ∣ 否 =P^( 色泽 = 青绿 ∣ 好瓜 = 否 )=9+33+1≈0.333.
P ^ 清脆|是 = P ^ ( 敲声 = 清脆 ∣ 好瓜 = 是 ) = 0 + 1 8 + 3 ≈ 0.091. \hat{P}_{\text {清脆|是}}=\hat{P}(\text { 敲声 }=\text { 清脆 } \mid \text { 好瓜 }=\text { 是 })=\frac{0+1}{8+3} \approx 0.091 . P^清脆|是=P^( 敲声 = 清脆 ∣ 好瓜 = 是 )=8+30+1≈0.091.
拉普拉斯修正避免了因训练集样本不充分而导致概率估值为零的问题, 并且在训练集变大时, 修正过程所引入的先验(prior)的影响也会逐渐变得可忽略, 使得估值渐趋向于实际概率值.
优点
缺点
常用的有3个朴素贝叶斯的分类算法:
算法名称 | 适用条件 |
---|---|
高斯分布的朴素贝叶斯(GaussianNB) | 样本特征的分布大部分是连续值,适合正态分布 |
多项式分布的朴素贝叶斯(MultinomialNB) | 样本特征的分大部分是多元离散值,适合二项式分布 |
伯努利分布的朴素贝叶斯(BernoulliNB) | 样本特征是二元离散值或者很稀疏的多元离散值,适合二项分布 |
naive_bayes.GaussianNB
参数:
先验概率priors,对应 Y Y Y的各个类别的先验概率 P ( Y = c k ) P(Y=c_k) P(Y=ck) 。这个值默认不给出,如果不给出此时 P ( Y = c k ) = m k / m P(Y=c_k)=m k / m P(Y=ck)=mk/m 。
其中 m m m 为训练集样本总数量, m k m k mk 为输出为第 k k k 类别的训练集样本数。
预测方法:
重要方法:
partial_fit:如果训练集数据量非常大,一次不能全部载入内存的时候。可以把训练集分成若干等分,重复调用partial_fit来一步步的学习训练集。
naive_bayes.MultinomialNB
参数:
alpha浮点型可选参数,默认为1.0,其实就是添加拉普拉斯平滑,如果这个参数设置为0,就是不添加平滑;布尔参数fit_prior表示是否要考虑先验概率,如果是false, 则所有的样本类别输出都有相同的类别先验概率。否则可以自己用第三个参数class_prior输入先验概率,或者不输入第三个参数 class_priori让MultinomialNB自己从训练集样本来计算先验概率,此时的先验概率为 P ( Y = c k ) = m k / m \mathrm{P}(\mathrm{Y}=\mathrm{c_k})=\mathrm{mk} / \mathrm{m} P(Y=ck)=mk/m 。其中 m \mathrm{m} m 为训练集样本总数量, m k \mathrm{mk} mk 为输出为第k类别的训练集样本数。
fit_prior | class_prior | 最终先验概率 |
---|---|---|
False | 填或不填没有意义 | P ( Y = c k ) = 1 / k P ( Y = c k ) = 1 / k P(Y=c_k)=1 / k P(Y=c_k)=1 / k P(Y=ck)=1/kP(Y=ck)=1/k |
True | 不填 | P ( Y = c k ) = m k / m P ( Y = c k ) = m k / m P(Y=c_k)=mk / m P(Y=c_k)=mk / m P(Y=ck)=mk/mP(Y=ck)=mk/m |
True | 填 | P ( Y = c k ) = p ( Y = c k ) = c l a s s _ p r i o r P(Y=c_k)=p(Y=c_k)=class\_prior P(Y=ck)=p(Y=ck)=class_prior |
naive_bayes.BernoulliNB
BernoulliNB一共有4个参数,其中3个参数的名字和意义和MultinomialNB完全相同。唯一增加的一个参数是binarize。这个参数主要是用来帮BernoulliNB处理二项分布的,可以是数值或者不输入。如果不输入,则BernoulliNB认为每个数据特征都已经是二元的。否则的话,小于binarize的会归为一类,大于binarize的会归为另外一类。
在使用BernoulliNB的fit或者partial_fit方法拟合数据后,我们可以进行预测。此时预测有三种方法,包括predict,predict_log_proba和predict_proba。方法和GaussianNB完全一样。
数据来源情感分析-朴素贝叶斯
import pandas as pd
data = pd.read_excel('data_test_train.xlsx')
data.head()
comment sentiment
0 口味:不知道是我口高了,还是这家真不怎么样。??我感觉口味确实很一般很一般。上菜相当快,我敢... 0
1 菜品丰富质量好,服务也不错!很喜欢! 1
2 说真的,不晓得有人排队的理由,香精香精香精香精,拜拜! 0
3 菜量实惠,上菜还算比较快,疙瘩汤喝出了秋日的暖意,烧茄子吃出了大阪烧的味道,想吃土豆片也是口... 1
4 先说我算是娜娜家风荷园开业就一直在这里吃??每次出去回来总想吃一回??有时觉得外面的西式简餐... 1
#根据需要做处理,去重、去除停用词
# jieba分词
import jieba
def chinese_word_cut(mytext):
return " ".join(jieba.cut(mytext))
data['cut_comment'] = data.comment.apply(chinese_word_cut)
data.head()
comment ... cut_comment
0 口味:不知道是我口高了,还是这家真不怎么样。??我感觉口味确实很一般很一般。上菜相当快,我敢... ... 口味 : 不 知道 是 我口 高 了 , 还是 这家 真 不怎么样 。 ? ? 我 感觉 口...
1 菜品丰富质量好,服务也不错!很喜欢! ... 菜品 丰富 质量 好 , 服务 也 不错 ! 很 喜欢 !
2 说真的,不晓得有人排队的理由,香精香精香精香精,拜拜! ... 说真的 , 不 晓得 有人 排队 的 理由 , 香精 香精 香精 香精 , 拜拜 !
3 菜量实惠,上菜还算比较快,疙瘩汤喝出了秋日的暖意,烧茄子吃出了大阪烧的味道,想吃土豆片也是口... ... 菜量 实惠 , 上菜 还 算 比较 快 , 疙瘩汤 喝出 了 秋日 的 暖意 , 烧茄子 吃...
4 先说我算是娜娜家风荷园开业就一直在这里吃??每次出去回来总想吃一回??有时觉得外面的西式简餐... ... 先说 我 算是 娜娜 家风 荷园 开业 就 一直 在 这里 吃 ? ? 每次 出去 回来 总...
CountVectorizer参数:
CountVectorizer(input='content', encoding='utf-8', decode_error='strict', strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, stop_words=None,
token_pattern='(?u)\b\w\w+\b', ngram_range=(1, 1), analyzer='word', max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, dtype=<class 'numpy.int64'>)
参数 | 作用 |
---|---|
analyzer | 一般使用默认,可设置为string类型,如’word’, ‘char’, ‘char_wb’,还可设置为callable类型,比如函数是一个callable类型 |
preprocessor | 设为None或callable类型 |
tokenizer | 设为None或callable类型 |
ngram_range | 词组切分的长度范围,待详解 |
stop_words | 设置停用词,设为english将使用内置的英语停用词,设为一个list可自定义停用词,设为None不使用停用词,设为None且max_df∈[0.7, 1.0)将自动根据当前的语料库建立停用词表 |
lowercase | 将所有字符变成小写 |
token_pattern | 过滤规则,表示token的正则表达式,需要设置analyzer == ‘word’,默认的正则表达式选择2个及以上的字母或数字作为token,标点符号默认当作token分隔符,而不会被当作token |
max_df | 可以设置为范围在[0.0 1.0]的float,也可以设置为没有范围限制的int,默认为1.0。这个参数的作用是作为一个阈值,当构造语料库的关键词集的时候,如果某个词的document frequence大于max_df,这个词不会被当作关键词。如果这个参数是float,则表示词出现的次数与语料库文档数的百分比,如果是int,则表示词出现的次数。如果参数中已经给定了vocabulary,则这个参数无效 |
min_df | 类似于max_df,不同之处在于如果某个词的document frequence小于min_df,则这个词不会被当作关键词 |
max_features | 默认为None,可设为int,对所有关键词的term frequency进行降序排序,只取前max_features个作为关键词集 |
vocabulary | 默认为None,自动从输入文档中构建关键词集,也可以是一个字典或可迭代对象? |
binary | 默认为False,一个关键词在一篇文档中可能出现n次,如果binary=True,非零的n将全部置为1,这对需要布尔值输入的离散概率模型的有用的 |
dtype | 使用CountVectorizer类的fit_transform()或transform()将得到一个文档词频矩阵,dtype可以设置这个矩阵的数值类型 |
属性表 | 作用 |
---|---|
vocabulary_ | 词汇表;字典型 |
get_feature_names() | 所有文本的词汇;列表型 |
stop_words_ | 返回停用词表 |
方法表 | 作用 |
---|---|
fit_transform(X) | 拟合模型,并返回文本矩阵 |
fit(raw_documents[, y]) | Learn a vocabulary dictionary of all tokens in the raw documents. |
fit_transform(raw_documents[, y]) | Learn the vocabulary dictionary and return term-document matrix. |
from sklearn.feature_extraction.text import CountVectorizer
def get_custom_stopwords(stop_words_file):
with open(stop_words_file) as f:
stopwords = f.read()
stopwords_list = stopwords.split('\n')
custom_stopwords_list = [i for i in stopwords_list]
return custom_stopwords_list
stop_words_file = '哈工大停用词表.txt'
stopwords = get_custom_stopwords(stop_words_file)
vect = CountVectorizer(max_df = 0.8,
min_df = 3,
token_pattern=u'(?u)\\b[^\\d\\W]\\w+\\b',
stop_words=frozenset(stopwords))
X = data['cut_comment']
y = data.sentiment
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=22)
test = pd.DataFrame(vect.fit_transform(X_train).toarray(), columns=vect.get_feature_names())
test.head()
ipad ok ps wifi 一下 一个个 一个半 一个多 ... 麻酱 麻麻 黄瓜 黄盖 黄色 黏糊糊 黑椒 默默
0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0
3 0 1 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0
from sklearn.naive_bayes import MultinomialNB
nb = MultinomialNB()
X_train_vect = vect.fit_transform(X_train)
nb.fit(X_train_vect, y_train)
train_score = nb.score(X_train_vect, y_train)
train_score
训练得分
0.899375
X_test_vect = vect.transform(X_test)
nb.score(X_test_vect, y_test)
0.8275
data = pd.read_excel("data.xlsx")
data['cut_comment'] = data.comment.apply(chinese_word_cut)
X=data['cut_comment']
X_vec = vect.transform(X)
nb_result = nb.predict(X_vec)
data['nb_result'] = nb_result
test = pd.DataFrame(vect.fit_transform(X).toarray(), columns=vect.get_feature_names())
test.head()
# 结果写入excel
data.to_excel("data_result.xlsx",index=False)
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
texts=["orange banana apple grape","banana apple apple","grape", 'orange apple']
cv = CountVectorizer()
cv_fit=cv.fit_transform(texts)
print(cv.vocabulary_)
print(cv_fit)
print(cv_fit.toarray())
输出如下:
{'orange': 3, 'banana': 1, 'apple': 0, 'grape': 2} #这里是根据首字母顺序,将texts变量中所有单词进行排序,apple首字母为a所以 # 排第一,banana首字母为b所以排第二
(0, 2) 1 # (0, 2) 1 中0表示第一个字符串"orange banana apple grape";2对应上面的'grape': 2;1表示出现次数1。整体理 # 解为第一字符串的顺序为二的词语在出现次数为1
(0, 0) 1
(0, 1) 1
(0, 3) 1
(1, 0) 2
(1, 1) 1
(2, 2) 1
(3, 0) 1
(3, 3) 1
[[1 1 1 1] # 第一个字符串,排名0,1,2,3词汇(apple,banana,grape,orange)出现的频率都为1
[2 1 0 0] #第二个字符串,排名0,1,2,3词汇(apple,banana,grape,orange)出现的频率为2,1,00
[0 0 1 0]
[1 0 0 1]]