Linux_mv命令移動資料夾下所有檔案以及“Argument list too long”問題的解決方法
阿新 • • 發佈:2020-12-29
樸素貝葉斯
- 概率【瞭解】
- 一件事情發生的可能性
- 聯合概率【知道】
- 包含多個條件,且所有條件同時成立的概率
- 條件概率【知道】
- 事件A在另外一個事件B已經發生條件下的發生概率
- 貝葉斯公式【掌握】
案例:商品評論情感分析
程式碼實現 import pandas as pd import numpy as np import jieba import matplotlib.pyplot as plt from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB 1)獲取資料 # 載入資料 data = pd.read_csv("./data/書籍評價.csv", encoding="gbk") data 2)資料基本處理 # 2.1) 取出內容列,對資料進行分析 content = data["內容"] content.head() # 2.2) 判定評判標準 -- 1好評;0差評 data.loc[data.loc[:, '評價'] == "好評", "評論標號"] = 1 # 把好評修改為1 data.loc[data.loc[:, '評價'] == '差評', '評論標號'] = 0 # data.head() good_or_bad = data['評價'].values # 獲取資料 print(good_or_bad) # ['好評' '好評' '好評' '好評' '差評' '差評' '差評' '差評' '差評' '好評' '差評' '差評' '差評'] # 2.3) 選擇停用詞 # 載入停用詞 stopwords=[] with open('./data/stopwords.txt','r',encoding='utf-8') as f: lines=f.readlines() print(lines) for tmp in lines: line=tmp.strip() print(line) stopwords.append(line) # stopwords # 檢視新產生列表 #對停用詞表進行去重 stopwords=list(set(stopwords))#去重 列表形式 print(stopwords) # 2.4) 把“內容”處理,轉化成標準格式 comment_list = [] for tmp in content: print(tmp) # 對文字資料進行切割 # cut_all 引數預設為 False,所有使用 cut 方法時預設為精確模式 seg_list = jieba.cut(tmp, cut_all=False) print(seg_list) # <generator object Tokenizer.cut at 0x0000000007CF7DB0> seg_str = ','.join(seg_list) # 拼接字串 print(seg_str) comment_list.append(seg_str) # 目的是轉化成列表形式 # print(comment_list) # 檢視comment_list列表。 # 2.5) 統計詞的個數 # 進行統計詞個數 # 例項化物件 # CountVectorizer 類會將文字中的詞語轉換為詞頻矩陣 con = CountVectorizer(stop_words=stopwords) # 進行詞數統計 X = con.fit_transform(comment_list) # 它通過 fit_transform 函式計算各個詞語出現的次數 name = con.get_feature_names() # 通過 get_feature_names()可獲取詞袋中所有文字的關鍵字 print(X.toarray()) # 通過 toarray()可看到詞頻矩陣的結果 print(name) # 2.6)準備訓練集和測試集 # 準備訓練集 這裡將文字前10行當做訓練集 後3行當做測試集 x_train = X.toarray()[:10, :] y_train = good_or_bad[:10] # 準備測試集 x_text = X.toarray()[10:, :] y_text = good_or_bad[10:] 3)模型訓練 # 構建貝葉斯演算法分類器 mb = MultinomialNB(alpha=1) # alpha 為可選項,預設 1.0,新增拉普拉修/Lidstone 平滑引數 # 訓練資料 mb.fit(x_train, y_train) # 預測資料 y_predict = mb.predict(x_text) #預測值與真實值展示 print('預測值:',y_predict) print('真實值:',y_text) 4)模型評估 mb.score(x_text, y_text)
API:sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
- 樸素貝葉斯分類
- alpha:拉普拉斯平滑係數
樸素貝葉斯演算法總結
1.樸素貝葉斯優缺點
- 優點:
- 樸素貝葉斯模型發源於古典數學理論,有穩定的分類效率
- 對缺失資料不太敏感,演算法也比較簡單,常用於文字分類
- 分類準確度高,速度快
- 缺點:
- 由於使用了樣本屬性獨立性的假設,所以如果特徵屬性有關聯時其效果不好
- 需要計算先驗概率,而先驗概率很多時候取決於假設,假設的模型可以有很多種,因此在某些時候會由於假設的先驗模型的原因導致預測效果不佳;
樸素貝葉斯內容彙總
2.1 NB的原理
樸素貝葉斯法是基於貝葉斯定理與特徵條件獨立假設的分類方法。
- 對於給定的待分類項x,通過學習到的模型計算後驗概率分佈,
- 即:在此項出現的條件下各個目標類別出現的概率,將後驗概率最大的類作為x所屬的類別。
2.2 樸素貝葉斯樸素在哪裡?
在計算條件概率分佈P(X=x∣Y=c_k)時,NB引入了一個很強的條件獨立假設,即,當Y確定時,X的各個特徵分量取值之間相互獨立。
2.3 為什麼引入條件獨立性假設?
為了避免貝葉斯定理求解時面臨的組合爆炸、樣本稀疏問題。
假設條件概率分為
2.4 在估計條件概率P(X∣Y)時出現概率為0的情況怎麼辦?
解決這一問題的方法是採用貝葉斯估計。
簡單來說,引入λ,
- 當λ=0時,就是普通的極大似然估計;
- 當λ=1時稱為拉普拉斯平滑。
2.5 為什麼屬性獨立性假設在實際情況中很難成立,但樸素貝葉斯仍能取得較好的效果?
- 人們在使用分類器之前,首先做的第一步(也是最重要的一步)往往是特徵選擇,這個過程的目的就是為了排除特徵之間的共線性、選擇相對較為獨立的特徵;
- 對於分類任務來說,只要各類別的條件概率排序正確,無需精準概率值就可以得出正確分類;
- 如果**屬性間依賴對所有類別影響相同,或依賴關係的影響能相互抵消,**則屬性條件獨立性假設在降低計算複雜度的同時不會對效能產生負面影響。
2.6 樸素貝葉斯與LR的區別?
2.6.1 簡單說明
- 區別一:
- 樸素貝葉斯是生成模型,
- 根據已有樣本進行貝葉斯估計學習出先驗概率P(Y)和條件概率P(X|Y),
- 進而求出聯合分佈概率P(XY),
- 最後利用貝葉斯定理求解P(Y|X),
- 而LR是判別模型,
- 根據極大化對數似然函式直接求出條件概率P(Y|X);
- 區別二:
- 樸素貝葉斯是基於很強的條件獨立假設(在已知分類Y的條件下,各個特徵變數取值是相互獨立的),
- 而LR則對此沒有要求;
- 樸素貝葉斯是生成模型,
- 區別三:
- 樸素貝葉斯適用於資料集少的情景,
- 而LR適用於大規模資料集。
補充知識點:
從概率框架的角度來理解機器學習;主要有兩種策略:
第一種:給定 x, 可通過直接建模 P(c |x) 來預測 c,這樣得到的是"判別式模型" (discriminative models);
第二種:也可先對聯合概率分佈 P(x,c) 建模,然後再由此獲得 P(c |x), 這樣得到的是"生成式模型" (generative models) ;
顯然,前面介紹的邏輯迴歸、決策樹、都可歸入判別式模型的範疇,還有後面學到的BP神經網路支援向量機等;
對生成式模型來說,必然需要考慮
2.6.2 進一步說明
前者是生成式模型,後者是判別式模型,二者的區別就是生成式模型與判別式模型的區別。
- 首先,Navie Bayes通過已知樣本求得先驗概率P(Y), 及條件概率P(X|Y), 對於給定的例項,計算聯合概率,進而求出後驗概率。也就是說,它嘗試去找到底這個資料是怎麼生成的(產生的),然後再進行分類。哪個類別最有可能產生這個訊號,就屬於那個類別。
- 優點: 樣本容量增加時,收斂更快;隱變數存在時也可適用。
- 缺點:時間長;需要樣本多;浪費計算資源
- 相比之下,Logistic迴歸不關心樣本中類別的比例及類別下出現特徵的概率,它直接給出預測模型的式子。設每個特徵都有一個權重,訓練樣本資料更新權重w,得出最終表示式。
- 優點:
- 直接預測往往準確率更高;
- 簡化問題;
- 可以反應資料的分佈情況,類別的差異特徵;
- 適用於較多類別的識別。
- 缺點
- 收斂慢;
- 不適用於有隱變數的情況。
- 優點: