日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习第11天:朴素贝叶斯模型 - 垃圾短信识别

發(fā)布時(shí)間:2025/4/5 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习第11天:朴素贝叶斯模型 - 垃圾短信识别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • 🔗 運(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ù),問題是:當(dāng)男生向女生求婚時(shí),女生是否會(huì)同意呢?

將問題聚焦到:當(dāng)男生的四個(gè)特點(diǎn)分別是不帥,性格不好,身高矮,不上進(jìn)時(shí),女生是否會(huì)嫁呢?

問題變成了一個(gè)典型的分類問題,轉(zhuǎn)為數(shù)學(xué)問題就是比較p(嫁|(不帥、性格不好、身高矮、不上進(jìn)))與p(不嫁|(不帥、性格不好、身高矮、不上進(jìn)))的概率,誰的概率大,就能給出嫁與者不嫁的答案!。聯(lián)系樸素貝葉斯公式:

接下來,我們只需要求p(不帥、性格不好、身高矮、不上進(jìn)|嫁)、p(不帥、性格不好、身高矮、不上進(jìn))、p(嫁)這三者就可以得到p(嫁|(不帥、性格不好、身高矮、不上進(jìn))的概率了,進(jìn)而就可以得到我們的預(yù)測(cè)結(jié)果。

二、代碼實(shí)現(xiàn)

  • 語言環(huán)境:Python3.6.5
  • 編譯器:jupyter notebook
  • 代碼|數(shù)據(jù):微信公眾號(hào)(K同學(xué)啊)中回復(fù):第10天

這篇文章中,我們將通過貝葉斯模型來識(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萬多條數(shù)據(jù),這條我僅取用其中1萬條

2. 進(jìn)行分詞

import jieba data['分詞后數(shù)據(jù)']=data["短信內(nèi)容"].apply(lambda x:' '.join(jieba.cut(x))) data.head()


這里我采用結(jié)巴分詞,將句子切分為單詞。
結(jié)巴分詞的作用是什么呢?如下

分詞前:我來到北京清華大學(xué)
分詞后:我 / 來到 / 北京 / 清華大學(xué)

這里做為自然語言處理方面的內(nèi)容不做過多介紹,在后面NLP系列在詳細(xì)介紹,不太明白我們可以跳過,不影響大局。

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)單來講就是對(duì)我們理解語意無關(guān)緊要的字或者詞(例如下面這些),為了防止這些字詞對(duì)后面的訓(xùn)練造成影響,需要先剔除這些字詞。

:$ 0 1 2 3 4 5 6 7 8 9 ? _ “ ” 、 。 《 》 一 一些 一何 一切 一則 一方面 一旦 一來 一樣 一般 一轉(zhuǎ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ǔ)充說明,

TfidfVectorizer相當(dāng)于先后調(diào)用CountVectorizer和TfidfTransformer兩種方法。CountVectorizer用于將文本從標(biāo)量轉(zhuǎn)換為向量,TfidfTransformer則將向量文本轉(zhuǎn)換為tf-idf矩陣。如何簡(jiǎn)單來理解這個(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è)里面是有垃圾短信的啊,它們只是沒顯示出來,在微信公眾號(hào)后臺(tái)回復(fù)第10天拿到數(shù)據(jù)和代碼你就知道了。


總結(jié)

以上是生活随笔為你收集整理的机器学习第11天:朴素贝叶斯模型 - 垃圾短信识别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。