bayes分類python,bayes分類器設計實驗身高體重

本文目錄一覽:

python sklearn 樸素貝葉斯多分類怎麼做

用的過程是這樣考慮的,xpath 是你需要知道文檔結構,而beautifulsoup 是不知道的時候去嘗試找某些標籤。 說的不對的話請輕噴,用的場景不同。

python scikit-learn 有什麼算法

1,前言

很久不發文章,主要是Copy別人的總感覺有些不爽,所以整理些乾貨,希望相互學習吧。不啰嗦,進入主題吧,本文主要時說的為樸素貝葉斯分類算法。與邏輯回歸,決策樹一樣,是較為廣泛使用的有監督分類算法,簡單且易於理解(號稱十大數據挖掘算法中最簡單的算法)。但其在處理文本分類,郵件分類,拼寫糾錯,中文分詞,統計機器翻譯等自然語言處理範疇較為廣泛使用,或許主要得益於基於概率理論,本文主要為小編從理論理解到實踐的過程記錄。

2,公式推斷

一些貝葉斯定理預習知識:我們知道當事件A和事件B獨立時,P(AB)=P(A)(B),但如果事件不獨立,則P(AB)=P(A)P(B|A)。為兩件事件同時發生時的一般公式,即無論事件A和B是否獨立。當然也可以寫成P(AB)=P(B)P(A|B),表示若要兩件事同事發生,則需要事件B發生後,事件A也要發生。

由上可知,P(A)P(B|A)= P(B)P(A|B)

推出P(B|A)=

其中P(B)為先驗概率,P(B|A)為B的後驗概率,P(A|B)為A的後驗概率(在這裡也為似然值),P(A)為A的先驗概率(在這也為歸一化常量)。

由上推導可知,其實樸素貝葉斯法就是在貝葉斯定理基礎上,加上特徵條件獨立假設,對特定輸入的X(樣本,包含N個特徵),求出後驗概率最大值時的類標籤Y(如是否為垃圾郵件),理解起來比邏輯回歸要簡單多,有木有,這也是本算法優點之一,當然運行起來由於得益於特徵獨立假設,運行速度也更快。

. 參數估計

3,參數估計

由上面推斷出的公式,我們知道其實樸素貝葉斯方法的學習就是對概率P(Y=ck)和P(X(j)=x(j)|Y=ck)的估計。我們可以用極大似然估計法估計上述先驗概率和條件概率。

其中I(x)為指示函數,若括號內成立,則計1,否則為0。李航的課本直接給出了用極大似然(MLE)估計求出的結果,並沒給推導過程,

我們知道,貝葉斯較為常見的問題為0概率問題。為此,需要平滑處理,主要使用拉普拉斯平滑,如下所示:

K是類的個數,Sj是第j維特徵的最大取值。實際上平滑因子λ=0即為最大似然估計,這時會出現提到的0概率問題;而λ=1則避免了0概率問題,這種方法被稱為拉普拉斯平滑。

4,算法流程

5,樸素貝葉斯算法優缺點

優點:樸素貝葉斯模型發源於古典數學理論,有着堅實的數學基礎,以及穩定的分類效率

需調參較少,簡單高效,尤其是在文本分類/垃圾文本過濾/情感判別等自然語言處理有廣泛應用。

在樣本量較少情況下,也能獲得較好效果,計算複雜度較小,即使在多分類問題。

無論是類別類輸入還是數值型輸入(默認符合正態分布)都有相應模型可以運用。

缺點:0概率問題,需要平滑處理,通常為拉普拉斯平滑,但加一平滑不一定為效果最好,

樸素貝葉斯有分布獨立的假設前提,生活中較少完全獨立,在屬性個數比較多或者屬性之間相關性較大時,NBC模型的分類效率比不上決策樹模型。而在屬性相關性較小時,NBC模型的性能最為良好。

模型注意點:

1, 大家也知道,很多特徵是連續數值型的,一般選擇使用樸素貝葉斯高斯模型。

2, 為避免0概率事件,記得平滑,簡單一點可以用『拉普拉斯平滑』。先處理處理特徵,把相關特徵去掉,

3, 樸素貝葉斯分類器一般可調參數比較少,需集中精力進行數據的預處理等特徵工程工作。

6,Scikit-learn三大樸素貝葉斯模型

Scikit-learn裡面有3種不同類型的樸素貝葉斯(:

1, 高斯分布型模型:用於classification問題,假定屬性/特徵是服從正態分布的,一般用在數值型特徵。,

2, 多項式型模型:用於離散值模型里。比如文本分類問題裡面我們提到過,我們不光看詞語是否在文本中出現,也得看出現的次數。如果總詞數為n,出現詞數為m的話,說起來有點像擲骰子n次出現m次這個詞的場景。

3, 伯努利模型:這種情況下,就如提到的bag ofwords處理方式一樣,最後得到的特徵只有0(沒出現)和1(出現過)。

7. Scikit-learn算法實踐

小編通過實現樸素貝葉斯三種模型以及主要分類算法,對比發現跟SVM,隨機森林,融合算法相比,貝葉斯差距明顯,但其時間消耗要遠低於上述算法,以下為主要算法主要評估指標)。

8. Python代碼

# -*-coding: utf-8 -*-

importtime

fromsklearn import metrics

fromsklearn.naive_bayes import GaussianNB

fromsklearn.naive_bayes import MultinomialNB

fromsklearn.naive_bayes import BernoulliNB

fromsklearn.neighbors import KNeighborsClassifier

fromsklearn.linear_model import LogisticRegression

fromsklearn.ensemble import RandomForestClassifier

fromsklearn import tree

fromsklearn.ensemble import GradientBoostingClassifier

fromsklearn.svm import SVC

importnumpy as np

importurllib

# urlwith dataset

url =”-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data”

#download the file

raw_data= urllib.request.urlopen(url)

#load the CSV file as a numpy matrix

dataset= np.loadtxt(raw_data, delimiter=”,”)

#separate the data from the target attributes

X =dataset[:,0:7]

#X=preprocessing.MinMaxScaler().fit_transform(x)

#print(X)

y =dataset[:,8]

print(“\n調用scikit的樸素貝葉斯算法包GaussianNB “)

model= GaussianNB()

start_time= time.time()

model.fit(X,y)

print(‘training took %fs!’ % (time.time() – start_time))

print(model)

expected= y

predicted= model.predict(X)

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

print(“\n調用scikit的樸素貝葉斯算法包MultinomialNB “)

model= MultinomialNB(alpha=1)

start_time= time.time()

model.fit(X,y)

print(‘training took %fs!’ % (time.time() – start_time))

print(model)

expected= y

predicted= model.predict(X)

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

print(“\n調用scikit的樸素貝葉斯算法包BernoulliNB “)

model= BernoulliNB(alpha=1,binarize=0.0)

start_time= time.time()

model.fit(X,y)

print(‘training took %fs!’ % (time.time() – start_time))

print(model)

expected= y

predicted= model.predict(X)

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

print(“\n調用scikit的KNeighborsClassifier “)

model= KNeighborsClassifier()

start_time= time.time()

model.fit(X,y)

print(‘training took %fs!’ % (time.time() – start_time))

print(model)

expected= y

predicted= model.predict(X)

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

print(“\n調用scikit的LogisticRegression(penalty=’l2′) “)

model= LogisticRegression(penalty=’l2′)

start_time= time.time()

model.fit(X,y)

print(‘training took %fs!’ % (time.time() – start_time))

print(model)

expected= y

predicted= model.predict(X)

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

print(“\n調用scikit的RandomForestClassifier(n_estimators=8)  “)

model= RandomForestClassifier(n_estimators=8)

start_time= time.time()

model.fit(X,y)

print(‘training took %fs!’ % (time.time() – start_time))

print(model)

expected= y

predicted= model.predict(X)

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

print(“\n調用scikit的tree.DecisionTreeClassifier() “)

model= tree.DecisionTreeClassifier()

start_time= time.time()

model.fit(X,y)

print(‘training took %fs!’ % (time.time() – start_time))

print(model)

expected= y

predicted= model.predict(X)

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

print(“\n調用scikit的GradientBoostingClassifier(n_estimators=200) “)

model= GradientBoostingClassifier(n_estimators=200)

start_time= time.time()

model.fit(X,y)

print(‘training took %fs!’ % (time.time() – start_time))

print(model)

expected= y

predicted= model.predict(X)

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

print(“\n調用scikit的SVC(kernel=’rbf’, probability=True) “)

model= SVC(kernel=’rbf’, probability=True)

start_time= time.time()

model.fit(X,y)

print(‘training took %fs!’ % (time.time() – start_time))

print(model)

expected= y

predicted= model.predict(X)

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

“””

# 預處理代碼集錦

importpandas as pd

df=pd.DataFrame(dataset)

print(df.head(3))

print(df.describe())##描述性分析

print(df.corr())##各特徵相關性分析

##計算每行每列數據的缺失值個數

defnum_missing(x):

return sum(x.isnull())

print(“Missing values per column:”)

print(df.apply(num_missing, axis=0)) #axis=0代表函數應用於每一列

print(“\nMissing values per row:”)

print(df.apply(num_missing, axis=1).head()) #axis=1代表函數應用於每一行”””

樸素貝葉斯分類算法的sklearn實現

1、背景

《機器學習實戰》當中,用python根據貝葉斯公式實現了基本的分類算法。現在來看看用sklearn,如何實現。還拿之前的例子,對帖子的分類。數據如下:

補充:題目的值左邊是幾個人的評論,右邊是評論屬於侮辱類(1)、正常類(0),需要進行文本分類,且再有新的文本過來時能自動劃分至0或1。

2、分類

(1)算法的準備

通過查看sklearn的訓練模型函數,fit(X, Y),發現只需要準備兩個參數。一個是數據的矩陣,另一個是數據的分類數組。首先就是將以上的文本轉化成矩陣。

在前一章其實已經講解過如何將文本轉化成矩陣。這裡將示意的再補充下。

a.首先選取所有的單詞,形成列,也可理解為屬性。例如:

b.其次將遍歷每個文本,填滿上述列的值。文本出現過列的次,填一。沒有出現過填0。比如第一句就是:my dog has flea problems help please,可表示為:

同理所有的文本都可如此表示,所以就形成了一個數字的矩陣。

(2)beyes模型的選擇

在完成數據的準備以後,就可以直接調用sklearn的模型和函數完成模型的訓練啦。但在beyes模型的選擇的時候發現,beyes下有多個模型可選擇,所以這個會讓人糾結。接下來共同了解下這些模型:

a.高斯模型(GaussianNB)

高斯模型是對於每個屬性的值是連續的,且服從高斯分布時可使用:

比如人的身高,比如花的高度等等。當然你也可將這些數據離散化,比如按等距劃分、等頻劃分成離散的值,但可能效果都沒有直接用高斯模型來計算的好。

用法:class sklearn.naive_bayes.GaussianNB

參數:無

b.多項式模型(MultinominalNB)

如果大部分是多元離散值,則採用多項式模型要好些。多項式模型,通常就是構造參數向量,然後通過極大似然估計來尋求參數的最有值。

這裡只簡單的略列一些公式,具體可查詢更多資料。從這個計算過程中可得出,這裡引入啦一個平滑先驗值alpha,這個值在模型訓練的時候也會用到。通常alpha0,可引入不在訓練集的特徵,尤其當alpha=1,成為拉普拉絲平滑。具體alpha取值對模型的影響可附件的圖。

用法:class sklearn.naive_bayes.MultinomialNB(alpha=1.0,fit_prior=True,class_prior=None) 

參數:

alpha:浮點數,就是上述說的引入平滑的值;

fit_prior:bool值,如果為Ture,則不用去學習P(y=ck),以均勻分布替代,否則則去學習P(y=ck)(不懂)

class_prior:一個數組。它指定了每個分類的先驗概率P(y=c1),P(y=c2)…..,若指定了該參數 

則每個分類的先驗概率無需學習 (不懂)

c.伯努利模型(BernoulliNB)

如果特徵值為二元離散值或是稀疏的多元離散值,則可採用伯努利模型。

公式:class sklearn.naive_bayes.BernoulliNB(alpha=1.0,binarize=0.0,fit_prior=Ture, 

class_prior=None) 

參數:

binarize:一個浮點數或者None,如果為浮點數則以該數值為界,特徵值大於它的取1,小於的為0 。如果為None,假定原始數據已經二值化 

其它參數同上。

通過以上的模型對比和分析,由於文本分析轉化後是很多二項取值的稀疏矩陣,因此選取伯努利模型效果會更佳。

補充:alpha、binarize值對模型效果的影響

貝葉斯網絡和貝葉斯分類算法的區別

1、貝葉斯網絡是:一種概率網絡,它是基於概率推理的圖形化網絡,而貝葉斯公式則是這個概率網絡的基礎。貝葉斯網絡是基於概率推理的數學模型,所謂概率推理就是通過一些變量的信息來獲取其他的概率信息的過程,基於概率推理的貝葉斯網絡(Bayesian network)是為了解決不定性和不完整性問題而提出的,它對於解決複雜設備不確定性和關聯性引起的故障有很的優勢,在多個領域中獲得廣泛應用。

2、貝葉斯分類算法是:統計學的一種分類方法,它是一類利用概率統計知識進行分類的算法。在許多場合,樸素貝葉斯(Naïve Bayes,NB)分類算法可以與決策樹和神經網絡分類算法相媲美,該算法能運用到大型數據庫中,而且方法簡單、分類準確率高、速度快。

3、貝葉斯網絡和貝葉斯分類算法的區別:由於貝葉斯定理假設一個屬性值對給定類的影響獨立於其它屬性的值,而此假設在實際情況中經常是不成立的,因此其分類準確率可能會下降。為此,就衍生出許多降低獨立性假設的貝葉斯分類算法,如TAN(tree augmented Bayes network)算法。

貝葉斯分類算法是統計學的一種分類方法,它是一類利用概率統計知識進行分類的算法。在許多場合,樸素貝葉斯(Naïve Bayes,NB)分類算法可以與決策樹和神經網絡分類算法相媲美,該算法能運用到大型數據庫中,而且方法簡單、分類準確率高、速度快。

由於貝葉斯定理假設一個屬性值對給定類的影響獨立於其它屬性的值,而此假設在實際情況中經常是不成立的,因此其分類準確率可能會下降。為此,就衍生出許多降低獨立性假設的貝葉斯分類算法,如TAN(tree augmented Bayes network)算法。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/231577.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-11 01:05
下一篇 2024-12-11 01:05

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29

發表回復

登錄後才能評論