机器学习第11天:朴素贝叶斯模型 - 垃圾短信识别
- 🔗 運(yùn)行環(huán)境:python3
- 🚩 作者:K同學(xué)啊
- 🥇 精選專欄:《深度學(xué)習(xí)100例》
- 🔥 推薦專欄:《新手入門深度學(xué)習(xí)》
- 📚 選自專欄:《Matplotlib教程》
- 🧿 優(yōu)秀專欄:《Python入門100題》
文章目錄
- 一、樸素貝葉斯原理解析
- 1. 條件概率
- 2. 貝葉斯定理
- 3. 樸素貝葉斯分類
- 二、代碼實(shí)現(xiàn)
- 1. 導(dǎo)入數(shù)據(jù)
- 2. 進(jìn)行分詞
- 3. 導(dǎo)入停用詞
- 4. 模型訓(xùn)練and預(yù)測(cè)打分
一、樸素貝葉斯原理解析
1. 條件概率
2. 貝葉斯定理
貝葉斯定理之所以有用,是因?yàn)槲覀冊(cè)谏钪薪?jīng)常遇到這種情況,我們可以很容易直接得出 P(X|Y) ,P(Y|X)則很難得出,但我們更關(guān)心 P(Y|X) ,則貝葉斯定理就為我們打通從P(X|Y) 到 P(Y|X) 的道路。
3. 樸素貝葉斯分類
樸素貝葉斯是一種基于貝葉斯定理的簡(jiǎn)單概率分類器
樸素貝葉斯思想基礎(chǔ):對(duì)于給出的待分類項(xiàng),求解在此出現(xiàn)的條件下各個(gè)類別出現(xiàn)的概率,哪個(gè)最大,就認(rèn)為此待分類項(xiàng)屬于哪個(gè)類別。
實(shí)例分析,現(xiàn)在有這樣一份數(shù)據(jù),問(wèn)題是:當(dāng)男生向女生求婚時(shí),女生是否會(huì)同意呢?
將問(wèn)題聚焦到:當(dāng)男生的四個(gè)特點(diǎn)分別是不帥,性格不好,身高矮,不上進(jìn)時(shí),女生是否會(huì)嫁呢?
問(wèn)題變成了一個(gè)典型的分類問(wèn)題,轉(zhuǎn)為數(shù)學(xué)問(wèn)題就是比較p(嫁|(不帥、性格不好、身高矮、不上進(jìn)))與p(不嫁|(不帥、性格不好、身高矮、不上進(jìn)))的概率,誰(shuí)的概率大,就能給出嫁與者不嫁的答案!。聯(lián)系樸素貝葉斯公式:
接下來(lái),我們只需要求p(不帥、性格不好、身高矮、不上進(jìn)|嫁)、p(不帥、性格不好、身高矮、不上進(jìn))、p(嫁)這三者就可以得到p(嫁|(不帥、性格不好、身高矮、不上進(jìn))的概率了,進(jìn)而就可以得到我們的預(yù)測(cè)結(jié)果。
二、代碼實(shí)現(xiàn)
- 語(yǔ)言環(huán)境:Python3.6.5
- 編譯器:jupyter notebook
- 代碼|數(shù)據(jù):微信公眾號(hào)(K同學(xué)啊)中回復(fù):第10天
這篇文章中,我們將通過(guò)貝葉斯模型來(lái)識(shí)別垃圾短信,這里也將引入分詞、tfidf等概念,相對(duì)于之前的文章上了一個(gè)臺(tái)階。
1. 導(dǎo)入數(shù)據(jù)
import pandas as pd data=pd.read_table('../data/noteData.txt',sep='\t',header=None,nrows = 10000,names=["標(biāo)簽","短信內(nèi)容"]) data.head()我們的數(shù)據(jù)分為兩部分,一部分是數(shù)據(jù)標(biāo)簽0代表正常短信,1代表垃圾短信。另外一部分為短信內(nèi)容。
看一下數(shù)據(jù)形狀,一共有7萬(wàn)多條數(shù)據(jù),這條我僅取用其中1萬(wàn)條
2. 進(jìn)行分詞
import jieba data['分詞后數(shù)據(jù)']=data["短信內(nèi)容"].apply(lambda x:' '.join(jieba.cut(x))) data.head()
這里我采用結(jié)巴分詞,將句子切分為單詞。
結(jié)巴分詞的作用是什么呢?如下
分詞前:我來(lái)到北京清華大學(xué)
分詞后:我 / 來(lái)到 / 北京 / 清華大學(xué)
這里做為自然語(yǔ)言處理方面的內(nèi)容不做過(guò)多介紹,在后面NLP系列在詳細(xì)介紹,不太明白我們可以跳過(guò),不影響大局。
3. 導(dǎo)入停用詞
f = open('../data/my_stop_words.txt','r') my_stop_words_data = f.readlines() f.close() my_stop_words_list=[] for each in my_stop_words_data:my_stop_words_list.append(each.strip('\n'))什么是停用詞呢?簡(jiǎn)單來(lái)講就是對(duì)我們理解語(yǔ)意無(wú)關(guān)緊要的字或者詞(例如下面這些),為了防止這些字詞對(duì)后面的訓(xùn)練造成影響,需要先剔除這些字詞。
:$ 0 1 2 3 4 5 6 7 8 9 ? _ “ ” 、 。 《 》 一 一些 一何 一切 一則 一方面 一旦 一來(lái) 一樣 一般 一轉(zhuǎn)眼 萬(wàn)一 上 上下 下 不 不僅 不但 不光 不單 不只 不外乎 不如 不妨 不盡 不盡然 不得 不怕 不惟 不成 不拘 不料 呃 嘔 唄 嗚 嗚呼…
4. 模型訓(xùn)練and預(yù)測(cè)打分
from sklearn.model_selection import StratifiedKFold from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.pipeline import PipelineX = data['分詞后數(shù)據(jù)'] y = data['標(biāo)簽']skf = StratifiedKFold(n_splits=10, random_state=1, shuffle=True)for train_index, test_index in skf.split(X, y):X_train, X_test = X[train_index], X[test_index]y_train, y_test = y[train_index], y[test_index]pipeline = Pipeline([('vect', TfidfVectorizer(stop_words=my_stop_words_list)),('clf', MultinomialNB(alpha=1.0))])pipeline.fit(X_train,y_train)#進(jìn)行預(yù)測(cè)predict = pipeline.predict(X_test)score = pipeline.score(X_test,y_test) print(score) """ 輸出: 0.948051948051948 0.949050949050949 0.955044955044955 0.954045954045954 0.951048951048951 0.9469469469469469 0.950950950950951 0.948948948948949 0.9419419419419419 0.944944944944945 """對(duì)最后部分代碼進(jìn)行一些補(bǔ)充說(shuō)明,
TfidfVectorizer相當(dāng)于先后調(diào)用CountVectorizer和TfidfTransformer兩種方法。CountVectorizer用于將文本從標(biāo)量轉(zhuǎn)換為向量,TfidfTransformer則將向量文本轉(zhuǎn)換為tf-idf矩陣。如何簡(jiǎn)單來(lái)理解這個(gè)方法呢?一句話,讓我們的預(yù)測(cè)更加準(zhǔn)確的一種數(shù)據(jù)預(yù)處理方法。
埋坑成功,tfidf后面展開講解,貪多嚼不爛啊,不要想了。關(guān)于StratifiedKFold可以看我這篇文章:機(jī)器學(xué)習(xí)第7天:K折交叉驗(yàn)證(StratifiedKFold與KFold比較)
看一下我們最后的預(yù)測(cè)效果
data["數(shù)據(jù)類型"] = pipeline.predict(X) #lambda x:x+1 if not 2==1 else 0 data['數(shù)據(jù)類型']=data["數(shù)據(jù)類型"].apply(lambda x:"垃圾短信" if x==1 else "正常短信") data.head()申明一下,這個(gè)里面是有垃圾短信的啊,它們只是沒顯示出來(lái),在微信公眾號(hào)后臺(tái)回復(fù)第10天拿到數(shù)據(jù)和代碼你就知道了。
總結(jié)
以上是生活随笔為你收集整理的机器学习第11天:朴素贝叶斯模型 - 垃圾短信识别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 机器学习第10天:模型评价方法及代码实现
- 下一篇: neuralcoref使用教程-指代消解