2016-07-27 26 views
6

我想學習樸素貝葉斯模型的問題,其中類是布爾值(需要兩個值之一)。某些功能是布爾型的,但其他功能是分類的,並且可以具有少量值(〜5)。如何使用具有(多個)分類功能的sklearn.naive_bayes?

如果我所有的功能都是布爾值,那麼我想使用sklearn.naive_bayes.BernoulliNB。看來很清楚,sklearn.naive_bayes.MultinomialNB而不是我想要的。

一個解決方案是將我的分類特徵分成布爾特徵。例如,如果變量「X」的值爲「紅色」,「綠色」,「藍色」,我可以有三個變量:「X是紅色」,「X是綠色」,「X是藍色」。這違反了給定類的變量的條件獨立性的假設,所以它看起來完全不合適。

另一種可能性是將變量編碼爲實值變量,其中0.0表示紅色,1.0表示綠色,2.0表示綠色,2.0表示藍色。這似乎也完全不適合使用GaussianNB(出於顯而易見的原因)。

我想要做的事情似乎並不奇怪,但我不明白如何將它適合sklearn給我的樸素貝葉斯模型。編寫代碼很容易,但如果可能的話,我更喜歡使用sklearn,原因很明顯(大多數:爲了避免bug)。

[編輯解釋爲什麼我不認爲多項NB是我想要的東西]:

我的理解是,在多項NB特徵向量在於k觀察到令牌多少次的計數IID樣本。

我的理解是,這適合於存在基礎文檔類的分類文檔,然後假定文檔中的每個詞都是從特定於該類的分類分佈中繪製的。一個文檔將具有k標記,特徵向量的長度等於詞彙大小,並且特徵計數的總和將是k

在我的情況下,我有一些bernoulli變量,加上幾個分類的變量。但是這裏沒有「計數」的概念。

例如:班級是喜歡或不喜歡數學的人。預測因子是大學專業(絕對)和他們是否去研究生院(布爾)。

我不認爲這符合多項式,因爲這裏沒有任何計數。

+0

你能詳細說明爲什麼Multinomial樸素貝葉斯不適合你嗎? –

回答

8

一些功能是布爾型的,但其他功能是分類的,可以採用少量的值(〜5)。

這是一個有趣的問題,但它實際上是多單多了一個:

  1. 如何應對NB一個明確的功能。
  2. 如何處理NB中的非齊次特徵(並且,我將在下文中指出,即使兩個分類特徵也是非齊次的)。
  3. 如何在sklearn中做到這一點。

首先考慮單個分類功能。 NB假設/簡化了這些功能是獨立的。你將它轉換成幾個二進制變量的想法正是dummy variables。顯然,這些虛擬變量是獨立的。你的想法然後對結果進行伯努利注意隱式假定獨立性。雖然衆所周知,實踐中,NB在面對因變量時不一定會中斷,但沒有理由試圖將問題轉化爲NB的最壞配置,特別是因爲多項NB是一個非常簡單的選擇。相反,假設使用虛擬變量將單個分類變量轉換爲多列數據集後,可以使用多項式NB。的理論多項式NB states

隨着多項式事件模型,將樣品(特徵向量)表示與特定事件已經由多項式...其中,p i是該事件發生我的概率產生的頻率。一個特徵向量...就是一個直方圖,其中x i {\ displaystyle x_ {i}} x_ {i}計算事件i在特定實例中被觀察到的次數。這是通常用於文檔分類的事件模型,其中事件表示單個文檔中詞的出現(請參閱一攬子文字假設)。

因此,在這裏,您的單個分類變量的每個實例都是一個「長度爲1的段落」,並且分佈是完全多項式的。具體而言,每行在一個位置上有1個,其餘的爲1,因爲長度爲1的段落必須只有一個字,所以這些就是頻率。

請注意,從sklearn的多項式NB的角度來看,數據集是5列的事實現在不意味着獨立性假設。


現在考慮的情況下,你必須包括幾個特徵的數據集:

  1. 範疇
  2. 伯努利
  3. 正常

下使用NB的很假設,這些變量是獨立的。因此,你可以做到以下幾點:

  1. 建立一個NB分類爲單獨的分類數據的每個,使用虛擬變量和多項NB。
  2. 建立一個NB分類器所有伯努利數據一次 - 這是因爲sklearn的伯努利NB是簡單的幾個單特徵伯努利NB的捷徑。
  3. 與2相同的所有正常功能。

通過獨立性的定義,實例的概率是這些分類器對實例的概率的乘積。

+0

感謝您的留言! 我更新了我的問題,解釋爲什麼我不認爲多項式NB適合。 我可能是錯的,錯過了一些東西,或者是將我的問題轉化爲多項式NB的巧妙方法。但基本的多項式設置對我來說似乎是錯誤的? 再次感謝! –

+0

@NedRuggeri查看更新。 –

+0

很好的回答!後續問題:我不確定如何乘以不同NB分類器的概率是合適的。例如:讓我們考慮一個目標類'k'。我們用伯努利特徵建立一個分類器,得到'P(k | X_ber)= P(k).P(X_ber | k)/ Z'。利用分類特徵的第二分類器,我們得到'P(k | X_cat)= P(k).P(X_cat | k)/ Z'。將這些結果與分子中先前'P(k)'的平方相乘,而期望值爲P(k | X_ber,X_cat)= P(k).P(X_ber | k).P(X_cat | k)/ Z'。我們是否應該在相乘之後進行分割? – dhrumeel

相關問題