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