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