机器学习贝叶斯模型
貝葉斯模型
1、什么是貝葉斯:
? 貝葉斯是用來描述兩個條件概率直接的關系
? 貝葉斯定理是關于隨機事件A和B的條件概率(或邊緣概率)的一則定理。其中P(A|B)是在B發(fā)生的情況下A發(fā)生的可能性。
? 機器學習中:
? 貝葉斯方法把計算“具有某特征的條件下屬于某類”的概率轉(zhuǎn)換成需要計算“屬于某類的條件下具有某特征”的概率,屬于監(jiān)督學習。
? 舉例說明:
? 一座別墅在過去的 20 年里一共發(fā)生過 2 次被盜,別墅的主人有一條狗,狗平均每周晚上叫 3 次,在盜賊入侵時狗叫的概率被估計為 0.9,問題是:在狗叫的時候發(fā)生入侵的概率是多少?
我們假設 A 事件為狗在晚上叫,B 為盜賊入侵,則以天為單位統(tǒng)計,P(A) = 3/7,P(B) = 2/(20365) = 2/7300,P(A|B) = 0.9,按照公式很容易得出結(jié)果:P(B|A) = 0.9(2/7300) / (3/7) = 0.00058
2、樸素貝葉斯及原理
? 樸素的概念:獨立性假設,假設各個特征之間是獨立不相關的
? 樸素貝葉斯的思想基礎是這樣的:對于給出的待分類樣本特征x,求解在此樣本出現(xiàn)的條件下各個類別出現(xiàn)的概率,哪個最大,就認為此待分類樣本屬于哪個類別。
3、高斯分布樸素貝葉斯
? 高斯分布就是正態(tài)分布
? 用途:
? 用于一般分類問題
? 特征值為連續(xù)型變量:
? 期望連續(xù)型的數(shù)據(jù)符合正態(tài)分布的
? 高斯模型假設某一特征屬于某一類別的觀測值符合高斯分布,比如身高小于160,160~170和170以上
4、多項式分布樸素貝葉斯
? 用途:適用于文本數(shù)據(jù)(特征表示的是次數(shù),例如某個詞語的出現(xiàn)次數(shù)
? 特點:文本分類,特征是單詞,值是單詞的出現(xiàn)次數(shù)
5、伯努利分布樸素貝葉斯
? 用途:適用于伯努利分布,也適用于文本數(shù)據(jù)(此時特征表示的是是否出現(xiàn),例如某個詞語的出現(xiàn)為1,不出現(xiàn)為0)
? 特點:特征值取bool類型,文本分類中表示一個值(單詞)有沒有出現(xiàn)過
? 伯努利分布:伯努利分布指的是對于隨機變量X有, 參數(shù)為p(0<p<1),如果它分別以概率p和1-p取1和0為值。
? 伯努利分布是一個離散型機率分布,是N=1時二項分布的特殊情況
? 伯努利分布與多項式分布:伯努利分布絕大多數(shù)情況下表現(xiàn)不如多項式分布,但有的時候伯努利分布表現(xiàn)得要比多項式分布要好,尤其是對于小數(shù)量級的文本數(shù)據(jù)
6、樸素貝葉斯模型的基本使用
? 樸素貝葉斯是分類模型
# 模型的導入,分別導入的是多項式分布、高斯分布、伯努利分布 from sklearn.naive_bayes import MultinomialNB, GaussianNB, BernoulliNB # 實例化模型 mnb = MultinomialNB() gnb = GaussianNB() bnb = BernoulliNB() # 訓練數(shù)據(jù)以及預測數(shù)據(jù) mnb.fit(train,target) mnb.predict(X_test) # 泛化誤差與經(jīng)驗誤差 mnb.score(X_test,y_test) mnb.score(X_train,y_train)gnb.fit(train,target) bnb.fit(train,target)7、詞頻集轉(zhuǎn)換
? 樸素貝葉斯模型中最常用的是多項式分布樸素貝葉斯模型,而該模型的特點是:適用于文本數(shù)據(jù)(特征表示的是次數(shù),例如某個詞語的出現(xiàn)次數(shù)
? 所以該模型處理的數(shù)據(jù)經(jīng)常是文本文件,并且統(tǒng)計特征的次數(shù)(文本中單詞出現(xiàn)的次數(shù)),所以在處理數(shù)據(jù)時往往需要將文本中的單詞按需獲得并統(tǒng)計次數(shù)。機器學習sklearn包含了用于做“詞頻集”轉(zhuǎn)換的幾類庫,具體使用如下:
# 詞頻集轉(zhuǎn)換 # 導包,CountVectorizer,TfidfTransformer往往一起使用,而TfidfVectorizer是他倆功能的綜合,能單獨使用 from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer, TfidfTransformer1、CountVectorizer()
txt = ['hello world hello MR.zhang','world cup hello world','cup cup hello cup' ] # 創(chuàng)建實例對象, # 并將數(shù)據(jù)進行詞頻的轉(zhuǎn)換,具體操作如下(即統(tǒng)計數(shù)據(jù)中的每行中每個單詞出現(xiàn)的次數(shù)) cv = CountVectorizer() matrix = cv.fit_transform(txt)? CountVectorizer工作原理
? 1、將數(shù)據(jù)集中所有出現(xiàn)過的單詞作為獨立的特征,
? 2、上面的txt集中,用逗號隔開每一組數(shù)據(jù),將每組數(shù)據(jù)可理解為單獨的一行
? 3、統(tǒng)計每一組數(shù)據(jù)集中,每個單詞出現(xiàn)的次數(shù),記錄在行和列對應的
2、TfidfTransformer()
# 實例化TfidfTransformer(),計算逆文本頻率指數(shù)(ft-idf) tf = TfidfTransformer() tf_data = tf.fit_transform(matrix)? TF-IDF是一種用于信息檢索與數(shù)據(jù)挖掘的常用加權(quán)技術,是一種統(tǒng)計方法。字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加
? **TF-IDF基本思想:**如果某個詞或短語在一篇文章中出現(xiàn)的頻率TF高,并且在其他文章中很少出現(xiàn),則認為此詞或者短語具有很好的類別區(qū)分能力,適合用來分類。
# 將數(shù)據(jù)集轉(zhuǎn)換成DataFrame類型,進一步進行數(shù)據(jù)分析 tf_df = DataFrame(data=tf_data.toarray(), columns=cv.get_feature_names()) tf_df.head()? 至此,文本數(shù)據(jù)基本準備完畢,則可用貝葉斯模型進行建模工作
3、TfidfVectorizer()
? TfidfVectorizer是CountVectorizer和TfidfTransformer工作的一個綜合過程
# tf對象一步到位,直接將數(shù)據(jù)轉(zhuǎn)換成TF-IDF tf = TfidfVectorizer() data = tf.fit_transform(txt).toarray() DataFrame(data=data, columns=tf.get_feature_names())4、文本數(shù)據(jù)轉(zhuǎn)換過程
? 1、確認停用詞、詞組
? 2、詞頻向量轉(zhuǎn)換(TF-IDF)TfidfTransformer CounterVectorizer 或者 TfidfVectorizer()
? 3、訓練預測
8、結(jié)巴分詞(jieba)
1、使用背景
? 在進行詞頻集的轉(zhuǎn)換時,只能轉(zhuǎn)換英語文本,因為英文單詞之間是用空格隔開的,會默認用分開。但是漢語不行,所以中文文本類數(shù)據(jù)集不能使用以上詞頻分詞的方法,此處引入專門用于中文詞頻分詞的結(jié)巴分詞
? 安裝:pin install jieba
? 導入:import jieba
2、分詞模式
? 結(jié)巴中文分詞支持的三種分詞模式包括:
? (1) 精確模式:試圖將句子最精確地切開,適合文本分析;
? (2) 全模式:把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義問題;
? (3) 搜索引擎模式:在精確模式的基礎上,對長詞再次切分,提高召回率,適合用于搜索引擎分詞。
3、分詞方法
? 1)jieba.cut() 生成迭代器對象
? 2)jieba.lcut() 生成列表對象(常用)
? 3)jieba.cut_for_search() 搜索引擎模式
? 參數(shù):
? cut_all=True 全模式
? cut_all=False 精確模式(常用)
4、新詞識別
? jieba分詞可以識別一些詞典中不存在的詞。但并不一定都會識別出來。比如“蛤跟”,為了解決這個問題,jieba中可以自定義一個詞典,使得分詞過程中避免將這些詞分開
? 自定義詞典
# 將自定義的文辭文件導入,并使用 jieba.load_userdict('worddic.txt') # 進行分詞,并將列表里的元素用“/”拼接起來 "/".join(jieba.lcut(text))5、關鍵詞提取
? 用于提取文本中重要的一些詞
import jieba.analyse jieba.analyse.extract_tags(sentence, topK)- sentence 待提取的文本
- topK 返回幾個TF-IDF權(quán)重最大的關鍵詞,默認值為20個
- TF: 詞頻,即某個詞在文檔中出現(xiàn)的次數(shù)
- IDF:逆文檔頻率,在詞頻相同的基礎上,常見的詞分配較小的權(quán)重,不常見的詞分配較大的權(quán)重,這個權(quán)重就是逆文檔頻率。
- TF-IDF:就是TF和IDF的乘積,這個值越大,說明對應的詞越重要
6、去除停用詞
? 在信息檢索中,為節(jié)省存儲空間和提高搜索效率,在處理自然語言數(shù)據(jù)(或文本)之前或之后會自動過濾掉某些字或詞,比如“的”、“是”、“而且”、“但是”、”非常“等。這些字或詞即被稱為Stop Words(停用詞)。
text = "在京教中心,沒有什么女朋友是一頓燒烤哄不好的。" stop_words = ["在",",","的","是","。"] word_list = jieba.lcut(text) # 用message將去除停用詞后的文本拼接起來 message = "" for word in word_list:if word not in stop_words:message += word7、使用sklearn計算TF-IDF值
? 分詞完成的數(shù)據(jù)集message就可以用詞頻集進行轉(zhuǎn)換進入后期的預測工作
9、詞云的展示
? “詞云”就是對網(wǎng)絡文本中出現(xiàn)頻率較高的“關鍵詞”予以視覺上的突出,形成“關鍵詞云層”或“關鍵詞渲染”,從而過濾掉大量的文本信息,使瀏覽網(wǎng)頁者只要一眼掃過文本就可以領略文本的主旨。
? 安裝:pin install wordcloud
? 導入:import wordcloud
1、詞頻統(tǒng)計
# 詞頻統(tǒng)計(數(shù)據(jù)加載),word_list是經(jīng)過詞頻轉(zhuǎn)換的數(shù)據(jù)集 counter = collections.Counter(word_list) # 用來提取數(shù)據(jù)集中最高頻出現(xiàn)的n個詞。 count_top10 = counter.most_common(n=10) count_top102、加載詞云顯示對象
# 加載詞云顯示對象(格式的加載)wc = wordcloun.WordClound(font_path="自定義字體的路徑", max_words=30, # 字體的個數(shù)的上限max_font_size=100, # 字體的最大字號min_font_size=10,mask="設置背景圖片") # 顯示會按此背景圖片的樣式顯示3、加載資源
collections庫,這個庫是python 自帶的
# 導入 import collections # 字(詞)頻統(tǒng)計,dict(s)將s轉(zhuǎn)換為字典類型。 counter = collections.Counter(dict(s)) wc.generate_from_frequencies(詞頻的統(tǒng)計量Counter對象) # 加載文字資源 wc.recolor(color_func=image_colors) # 加載顏色資源,其中image_colors的獲取如下: # 解析背景圖片顏色 image_colors = wordcloud.ImageColorGenerator(plt.imread('圖片路徑'))4、顯示詞云
plt.imshow()總結(jié)
- 上一篇: 字符串跟列表的恩怨、set集合、数据转换
- 下一篇: 实训一 机床夹具认识