樸素貝葉斯演算法
樸素
假定特徵與特徵之間是相互獨立的
貝葉斯公式
公式分為三個部分:
- P(C):每個文件類別的概率(某文件類別數/總文件數量)
- P(W│C):給定類別下特徵(被預測文件中出現的詞)的概率P(F1,F2,…) 預測文件中每個詞的概率
- 計算方法:P(F1│C)=Ni/N (訓練文件中去計算)
- Ni為該F1詞在C類別所有文件中出現的次數
- N為所屬類別C下的文件所有詞出現的次數和
- 計算方法:P(F1│C)=Ni/N (訓練文件中去計算)
如果計算兩個類別概率比較:
所以我們只要比較前面的大小就可以,得出誰的概率大
有的時候會出現為0的情況,而我們知道為0的情況不大可能出現,因此需要引進另一個引數,防止出現0
拉普拉斯平滑係數
目的:防止計算出的分類概率為0
API
- sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
- 樸素貝葉斯分類
- alpha:拉普拉斯平滑係數
案例-新聞分類
分析
-
分割資料集
-
tfidf進行的特徵抽取
- 樸素貝葉斯預測
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
def nb_news():
#獲取資料集
news=fetch_20newsgroups(subset="all")
#劃分資料集
x_train,x_test,y_train,y_test=train_test_split(news.data,news.target)
#文字特徵抽取
transfer=TfidfVectorizer()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)
#樸素貝葉斯
estimator=MultinomialNB()
estimator.fit(x_train,y_train)
#模型評估
# 方法1:直接比對真實值和預測值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比對真實值和預測值:\n", y_test == y_predict)
# 方法2:計算準確率
score = estimator.score(x_test, y_test)
print("準確率為:\n", score)
return None
if __name__ == '__main__':
nb_news()
結果為:
總結
- 優點:
- 樸素貝葉斯模型發源於古典數學理論,有穩定的分類效率。
- 對缺失資料不太敏感,演算法也比較簡單,常用於文字分類。
- 分類準確度高,速度快
- 缺點:
- 由於使用了樣本屬性獨立性的假設,所以如果特徵屬性有關聯時其效果不好
決策樹
認識決策樹
決策樹分類原理詳解
問題:如何對這些客戶進行分類預測?你是如何去劃分?
有可能你的劃分是這樣的
那麼我們怎麼知道這些特徵哪個更好放在最上面,那麼決策樹的真是劃分是這樣的
原理
資訊熵,資訊增益
資訊熵的定義
總結(重要)
- 資訊和消除不確定性是相聯絡的
當我們得到的額外資訊(球隊歷史比賽情況等等)越多的話,那麼我們猜測的代價越小(猜測的不確定性減小)
問題: 回到我們前面的貸款案例,怎麼去劃分?可以利用當得知某個特徵(比如是否有房子)之後,我們能夠減少的不確定性大小。越大我們可以認為這個特徵很重要。那怎麼去衡量減少的不確定性大小呢?
決策樹的劃分依據之一------資訊增益
定義與公式
特徵A對訓練資料集D的資訊增益g(D,A),定義為集合D的資訊熵H(D)與特徵A給定條件下D的資訊條件熵H(D|A)之差,即公式為:
公式的詳細解釋:
貸款特徵重要計算
我們以年齡特徵來計算:
1、g(D, 年齡) = H(D) -H(D|年齡) = 0.971-[5/15H(青年)+5/15H(中年)+5/15H(老年]
2、H(D) = -(6/15log(6/15)+9/15log(9/15))=0.971
3、H(青年) = -(3/5log(3/5) +2/5log(2/5))
H(中年)=-(3/5log(3/5) +2/5log(2/5))
H(老年)=-(4/5og(4/5)+1/5log(1/5))
我們以A1、A2、A3、A4代表年齡、有工作、有自己的房子和貸款情況。最終計算的結果g(D, A1) = 0.313, g(D, A2) = 0.324, g(D, A3) = 0.420,g(D, A4) = 0.363。所以我們選擇A3 作為劃分的第一個特徵。這樣我們就可以一棵樹慢慢建立
決策樹API
- class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)
- 決策樹分類器
- criterion:預設是’gini’係數,也可以選擇資訊增益的熵’entropy’
- max_depth:樹的深度大小
- random_state:隨機數種子
- 其中會有些超引數:max_depth:樹的深度大小
- 其它超引數我們會結合隨機森林講解
案例
鳶尾花決策樹分析
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier,export_graphviz
import pydotplus
def tree():
"""
用決策樹對鳶尾花分類
"""
#獲取資料集
iris=load_iris()
#劃分資料集
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=22)
#決策樹預估器
estimator=DecisionTreeClassifier(criterion="entropy")
estimator.fit(x_train,y_train)
# 模型評估
# 方法1:直接比對真實值和預測值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比對真實值和預測值:\n", y_test == y_predict)
# 方法2:計算準確率
score = estimator.score(x_test, y_test)
print("準確率為:\n", score)
#視覺化決策樹
dot_data=export_graphviz(estimator,out_file=None,feature_names=iris.feature_names)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf("iris.pdf")
return None
if __name__ == '__main__':
tree()
結果為:
視覺化展示:
泰坦尼克號乘客生存預測
相關資料與說明:https://www.kaggle.com/zephyrzhan522/titanic-prediction-dl-vs-ml
分析
- 選擇我們認為重要的幾個特徵 ['pclass', 'age', 'sex']
- 填充缺失值
- 特徵中出現類別符號,需要進行one-hot編碼處理(DictVectorizer)資料集劃分
- x.to_dict(orient="records") 需要將陣列特徵轉換成字典資料
- 決策樹分類預測
步驟
讀取資料
抽取特徵:
填充缺失值並轉換為字典資料
資料集劃分以及相關資料的轉化
決策樹預估以及視覺化
視覺化展示:
決策樹總結
- 優點:
- 簡單的理解和解釋,樹木視覺化。
- 缺點:
- 決策樹學習者可以建立不能很好地推廣資料的過於複雜的樹,這被稱為過擬合。
- 改進:
- 減枝cart演算法(決策樹API當中已經實現,隨機森林引數調優有相關介紹)
- 隨機森林
注:企業重要決策,由於決策樹很好的分析能力,在決策過程應用較多, 可以選擇特徵
整合學習方法之隨機森林
什麼是整合學習方法
整合學習通過建立幾個模型組合的來解決單一預測問題。它的工作原理是生成多個分類器/模型,各自獨立地學習和作出預測。這些預測最後結合成組合預測,因此優於任何一個單分類的做出預測。
什麼是隨機森林
隨機森林是一個包含多個決策樹的分類器,並且其輸出的類別是由個別樹輸出的類別的眾數而定。
例如, 如果你訓練了5個樹, 其中有4個樹的結果是True, 1個數的結果是False, 那麼最終投票結果就是True
隨機森林原理過程
學習演算法根據下列演算法而建造每棵樹:
- 用N來表示訓練用例(樣本)的個數,M表示特徵數目。採取bootstrap抽樣
- 1、一次隨機選出一個樣本,重複N次, (有可能出現重複的樣本)
- 2、隨機去選出m個特徵, m <<M,建立決策樹
為什麼採用BootStrap抽樣
- 為什麼要隨機抽樣訓練集?
- 如果不進行隨機抽樣,每棵樹的訓練集都一樣,那麼最終訓練出的樹分類結果也是完全一樣的
- 為什麼要有放回地抽樣?
- 如果不是有放回的抽樣,那麼每棵樹的訓練樣本都是不同的,都是沒有交集的,這樣每棵樹都是“有偏的”,都是絕對“片面的”(當然這樣說可能不對),也就是說每棵樹訓練出來都是有很大的差異的;而隨機森林最後分類取決於多棵樹(弱分類器)的投票表決。
API
-
class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’, max_depth=None, bootstrap=True, random_state=None, min_samples_split=2)
- 隨機森林分類器
- n_estimators:integer,optional(default = 10)森林裡的樹木數量120,200,300,500,800,1200
- criteria:string,可選(default =“gini”)分割特徵的測量方法
- max_depth:integer或None,可選(預設=無)樹的最大深度 5,8,15,25,30
- max_features="auto”,每個決策樹的最大特徵數量
- If "auto", then
max_features=sqrt(n_features)
. - If "sqrt", then
max_features=sqrt(n_features)
(same as "auto"). - If "log2", then
max_features=log2(n_features)
. - If None, then
max_features=n_features
.
- If "auto", then
- bootstrap:boolean,optional(default = True)是否在構建樹時使用放回抽樣
- min_samples_split:節點劃分最少樣本數
- min_samples_leaf:葉子節點的最小樣本數
- 超引數:n_estimator, max_depth, min_samples_split,min_samples_leaf
案例
還是剛剛的泰坦尼克號,用隨機森林進行預測
結果為:
總結
- 在當前所有演算法中,具有極好的準確率
- 能夠有效地執行在大資料集上,處理具有高維特徵的輸入樣本,而且不需要降維
- 能夠評估各個特徵在分類問題上的重要性
分類演算法總結