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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/4/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习第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天:朴素贝叶斯模型 - 垃圾短信识别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。