Bayesci çıkarıma dayalı sınıflandırma modeli (kod makalesi) Makine öğreniminde karşılaşacağınız "çukurlar"

Dünün "Bayesci Çıkarıma Dayalı Sınıflandırma Modeli (Teori)" ni dikkatlice okuduysanız, Naive Bayes'in Bayesci çıkarıma dayalı üretken bir model olduğunu, l'nin kategori etiketimiz olduğunu varsayarak açıkça bileceksiniz. , X bizim örneğimizdir. Örnek kategorisinin son olasılığını elde etmek için, Bayes teoremine göre, sadece sınıf koşullu olasılığını P (x | l) değil, aynı zamanda önceki olasılık P (l) 'yi de hesaplamamız gerekir:

Naive Bayes tarafından sunulan öznitelik bağımsızlık varsayımı, önceki olasılığı basit ve hesaplanabilir kılar, çünkü öznitelik bağımsızlığı varsayımı altında şunları bulacağız:

Başka bir deyişle, sınıf koşullu olasılık, koşullu olasılık özniteliğinin çarpımına eşittir. Naive Bayes uygulama sürecinde, koşullu olasılık ve önceki olasılık tahminimiz, büyük sayılar teoremine dayalı bir sayma problemi haline gelecektir.

Yapmamız gereken ilk şey, verilerin kendisini analiz etmek ve işlemek, kategorinin frekans oranını öncelikli olasılık olarak kullanmak ve farklı kategorilerdeki her bir özelliğin koşullu olasılığını koşullu olasılık olarak kullanmak ve ardından yeni örneklemin sonsal olasılığını tahmin etmektir.

Tüm süreci göstermek için IRIS verilerini örnek olarak alalım. IRIS verilerinde 150 örnek vardır ve toplamda üç kategori vardır: Setosa, versicolor ve virginica. Öncelikle kategorinin önceki olasılığını hesaplamamız gerekir. Gerçek süreç, kategorilerimizin oranıdır:

itibaren sklearn.datasets ithalat load_iris

itibaren koleksiyonlar ithalat Sayaç

data = load_iris ()

X = data.data

y = data.target

d = Sayaç (y)

P1 = d / len (y)

P2 = d / len (y)

P3 = d / len (y)

Her kategorinin önceki olasılığını alacağız:

P (setosa)

P (çok renkli)

P (virginica)

0.3333

0.3333

0.3333

Üç kategorinin tek tip olduğu ve her kategorideki örnek sayısının eşit olduğu, yani 50 olduğu görülebilir. Daha sonra, IRIS verilerinin 4 niteliğe sahip olduğunu göreceğiz: çanak çömlek uzunluğu, yay genişliği, petal uzunluğu, petal genişliği. Her özelliğin sınıf koşullu olasılığını tahmin etmemiz gerekiyor. Koşullu olasılık, belirli bir sınıftaki belirli bir özelliğin olasılığıdır.Gerçek hesaplamalarda, aynı sınıftayız ve örneği A özniteliğiyle böleriz A özniteliğinin sınıf koşullu olasılığını elde etmek için bu sınıfın toplam örnek sayısı:

...

# Setosa kategorisindeki sepal uzunluğun koşullu olasılığını hesaplayın ve sözlük olarak kaydedin

D_sepallength_setosa = {}

X_setosa = X

d = Sayaç (X_setosa) # Sapal uzunluk özniteliğinin değerini say

için k, v içinde d.items ():

D_sepallength_setosa = v / X_setosa.shape

...

Sepal uzunluk özniteliğinin değerinin koşullu olasılığını setosa kategorisi altında elde edebilirsiniz:

İçinde: D_sepallength_setosa

Dışarı:

{4.2999999999999998: 0.02,

4,4000000000000004: 0,06,

4,5: 0,02,

4,5999999999999996: 0,08,

4,7000000000000002: 0,04,

4,7999999999999998: 0,1,

4,9000000000000004: 0,08,

5.0: 0.16,

5,0999999999999996: 0,16,

5,2000000000000002: 0,06,

5,2999999999999998: 0,02,

5.4000000000000004: 0.1,

5.5: 0.04,

5.7000000000000002: 0.04,

5,7999999999999998: 0,02}

Sözlüğün anahtarı setosa sınıfındaki farklı sepal uzunluk değerlerine karşılık gelir ve sözlüğün değerleri karşılık gelen koşullu olasılıklara karşılık gelir. Benzer şekilde, farklı kategorilerde ayrı ayrı uzunluktaki farklı değerlerin koşullu olasılığını elde edebiliriz, sadece ihtiyacımız olan:

# Kategoriyi değiştir

X_versicolor = X

X_virginica = X

Aynı kategorideki farklı özniteliklerin koşullu olasılıklarını elde etmek için sadece şunlara ihtiyacımız var:

# Değiştir özelliği

d = Sayaç (X_setosa)

...

d = Sayaç (X_setosa)

Bunların arasında, saymak için python'un standart kütüphane koleksiyonlarında Counter sınıfını kullanıyoruz.Tüm kategorilerdeki tüm özellik değerlerinin koşullu olasılıklarını almamız gerekiyor.Toplam 12 hesaplama gerekiyor.Tabii ki iki döngü yazabiliriz ( Biri kategorileri döngüye sokmak için kullanılır ve diğeri özellikleri döngüye sokmak için kullanılır) Tüm veriler hesaplanır ve kaydedilir Yeni bir örnekle karşılaşıldığında, arka olasılığı tahmin etmek için ihtiyacımız olanı doğrudan çıkarırız.

Ancak daha zarif bir şekilde, saf Bayes sınıflandırıcı için bir sınıf yazıyoruz ve sayma işlevini kapsıyoruz. İlk olarak, verileri okumak için bir işlev kullanmamız gerekir:

def getdata (veriler):

dönüş (dict ())

Bunların arasında, her bir özelliği bir liste olarak getdata fonksiyonumuza aktarıyoruz ve döndürülen şey bir sözlük, yani verilere karşılık gelen özellik değeri bir kez görünüyor. Daha sonra, gelen veriler üzerinde kademeli öğrenme yapmalıyız. Temel ihtiyaçlarımızın üç noktası var:

Her kategorideki kategori sayısını ve örnek sayısını elde edin ve kaydedin

Her kategorideki özellik değerlerinin sayısını ve farklı özellik değerlerinin oluşum sayısını elde edin ve kaydedin

Her veri kümesini eğitin ve yukarıdaki iki hedefi güncelleyin

Bu nedenle kolayca yazabiliriz:

sınıf Bayes:

def __init __ (self, getdata):

self.getdata = getdata

self.fn = {} # Her kategorinin özellik değerlerinin sayısını sayın

self.cn = {} # Her kategorideki örneklerin sayısını sayın

def cn_change (öz, etiket):

self.cn.setdefault (etiket, 0)

self.cn + = 1

def fn_change (öz, n, f, etiket):

self.fn.setdefault (n, {})

self.fn.setdefault (f, {})

self.fn.setdefault (etiket, 0)

self.fn + = 1

def f_count (öz, f, etiket):

Eğer f içinde self.fn ve etiket içinde self.fn:

dönüş (self.fn)

dönüş (0)

def label_count (self, etiket):

Eğer etiket içinde self.cn:

dönüş (self.cn)

dönüş (0)

def label_total (kendi):

dönüş (toplam (self.cn.values ()))

def tren (kişi, öğe, etiket):

data = self.getdata (öğe)

için n, f içinde zip (aralık (len (veri)), veri):

self.fn_change (n, f, etiket)

self.cn_change (etiket)

IRIS verilerini sınıflandırıcımıza aktarır ve eğitiriz:

itibaren sklearn.datasets ithalat load_iris

data = load_iris ()

X = data.data

y = data.target

bayes = Bayes (getdata)

için ben içinde aralık (uzunluk (y)):

bayes.train (X , y )

Sınıfın bayes örneğinin yöntemini cn olarak adlandırıyoruz ve şunu elde ediyoruz:

İçinde: bayes.cn

Çıkış: {0: 50, 1: 50, 2: 50}

# Kategori 0, kategori 1 ve kategori 2'de 50 örnek olduğunu gösterir

Sözlük elde etmek için bayes yöntemine fn diyoruz.Çok büyük olduğu için burada hepsini genişletmek sakıncalı ama yapısı:

{.....

3: {5.0999999999999996: {0: 8, 1: 1, 2: 4}}

......}

# 3. özellikteki 5.0999 değerinin kategori 0'da 8 kez, kategori 1'de 1 kez ve kategori 2'de 4 kez göründüğünü belirtir

Şimdiye kadar, temel sayma işlevini uyguladık ve örnek girdikçe sayımız kademeli olarak güncellenecek, ancak arka olasılığı tahmin etmek için Bayes'i kullanmalıyız, bu nedenle önceki hesaplamamızı olasılığa dönüştürmemiz gerekiyor. Bu nedenle, sınıfımıza işlevsellik eklemeye devam ediyoruz:

def piror (kendisi, etiket):

dönüş (self.cn/self.label_total ())

def likeihood (self, n, f, label):

Eğer f içinde self.fn:

Eğer etiket içinde self.fn:

p = self.fn / self.cn

dönüş (p)

dönüş (0)

def test (kişi, öğe, etiket):

data = self.getdata (öğe)

p_lh = 1

için n, f içinde zip (aralık (len (veri)), veri):

p_lh * = self.likeihood (n, f, etiket)

p_pir = self.piror (etiket)

dönüş (p_lh * p_pir)

Sırasıyla test örneğinin önceki olasılığını, olasılığını ve son olasılığını elde etmek için üç işlev ekledik. Bayes'in test yöntemini çağırırsak, yeni örneğin posterior olasılığı çıktı olur. Örneğin, öznitelikleri ayrı ayrı hesaplayabiliriz Örneklemin farklı kategoriler altındaki son olasılığı:

İçinde: bayes.test (, 0)

Çıkış: 0.0

İçinde: bayes.test (, 1)

Çıkan: 1.5999999999999998e-07

İçinde: bayes.test (, 2)

Çıkan: 7.04e-06

Yeni örneğin kategori 2 (virginica) altında daha yüksek bir posterior olasılığa sahip olduğunu fark edebiliriz ve yeni örneğin virginica'ya ait olma olasılığının daha yüksek olduğunu söyleyebiliriz. Ama aynı zamanda, kategori 0 (setosa) altındaki yeni örneğin posterior olasılığının sıfır olduğunu da fark edeceğiz Bu, yeni örneklemin asla setosa olamayacağı anlamına mı geliyor?

Tabii ki hayır, bunun nedeni aslında Naive Bayes yöntemini kullandığımızda, birden çok özelliğin koşullu olasılıklarının ortak olasılığını hesaplamamız gerektiğidir. Ancak eğitim setimizin örnek çeşitliliği yeterince zengin değilse, test örneğimizdeki bazı öznitelik değerlerinin eğitim örnekleminin belirli bir sınıfında görünmemesi muhtemeldir. Ortak olasılığı çözme olasılığını çarpma önermesi altında, belirli bir öznitelik değeri Bir özelliğin koşullu olasılığı sıfır ise, bütünün sıfır olmasına neden olur ki bu o kadar da makul değildir.

Bu durumdan kaçınmak için, Laplacian düzeltmesini tanıtıyoruz Basit bir ifadeyle, koşullu olasılığı sıfıra eşit olmaya zorlamak, böylece yukarıdaki durumun meydana gelmesinden kaçınmaktır.

Bu gerçeği net bir şekilde açıklamak için, basit bir ikili sınıflandırma problemi düşünün. kullanırız

Veri setinde evet olarak işaretlenmiş örnek sayısını temsil eder, D toplam örnek sayısını temsil eder,

Kategori sayısını temsil eder. Laplace düzeltmesine göre, önceki olasılıktaki değişiklik:

Kullanmaya devam ediyoruz

Veri setinin evet olarak işaretlendiğini ve değerin ilk öznitelikten alındığını belirtmek için

Numune sayısı,

İlk özniteliğin olası değerlerinin sayısını gösterir, ardından Laplace düzeltmesinde olasılık değişikliği şu şekildedir:

Gerçek durumda, eğitim örneklerinin çeşitliliğini ve zenginliğini bilmiyoruz. Laplacian düzeltmesini daha iyi tanıtabiliriz ve Laplacian düzeltmesinin etkisi eğitim seti arttıkça daha da küçülecektir. Laplace'ın arka olasılık tahminini etkileyeceğinden endişelenmeyin. Bu düzeltmeyi uygulamaya koymak için, yalnızca aşağıdakileri değiştirmemiz gerekiyor:

def piror (kendisi, etiket):

dönüş ((self.cn + 1 ) / (self.label_total () + len (self.cn)))

def likeihood (self, n, f, label):

Eğer f içinde self.fn:

Eğer etiket içinde self.fn:

p = (self.fn + 1 ) / (self.cn + len (self.fn))

dönüş (p)

dönüş ( 1 /(self.cn+len(self.fn)))

Değişikliklerimizi Bayes sınıfına kaydedin ve öznitelik değerleri farklı kategorilerde olan örneklerin posterior olasılığını hesaplamaya devam ediyoruz:

İçinde: bayes.test (, 0)

Çıkan: 2.406815330836021e-07

İçinde: bayes.test (, 1)

Çıkan: 2.5672696862250893e-07

İçinde: bayes.test (, 2)

Çıkan: 3.850904529337635e-06

0 kategorisi altındaki yeni örneklemin olasılığının artık sıfır olmadığını görmek hoş bir sürpriz olabilir.Daha sağlam, naif bir Bayes sınıflandırıcı elde ettik, etkisini gözlemlemek için sadece farklı verilere uygulamamız gerekiyor Saf Bayes sınıflandırıcısının kendisinin ayarlanacak hiperparametreleri olmadığını belirtmek gerekir.Sadece özniteliklerin bağımsızlığını varsayar, ancak basit ve güçlü bir kategori olarak kabul edilebilecek istenmeyen postaları filtrelemede çok etkilidir. Sınıflandırıcı.

Çekirdeği okuyun

Sınıf İPUÇLARI

Saf Bayes sınıflandırıcısını python ile oluşturduğumuzda, herhangi bir kitaplık kullanmadık (popüler sklearn dahil) Bu makaleyi dikkatlice okumak kod becerinizi geliştirecektir. Aslında, çalışmamızı hızlandırmak için numpy kullanabiliriz, çünkü ilişkiyi yapısal anlaşılma kolaylığı için bir sözlük olarak ifade ettim, hatta onu bir veya daha fazla matris olarak ifade edebiliriz.

Örneklemin belirli bir kategoriye ait olup olmadığını arka olasılığın büyüklüğüne göre yargılayabiliriz, ancak pratikte ikisinin son olasılıkları çok yakındır. Hiçbir şeyi yargılamamak ve diğer modelleri kullanmak veya Bütünleşik öğrenme, yargılamaya yardımcı olmak için kullanılır, bu nedenle genellikle arka olasılığın mutlak eşiğini ve farklı kategorilerin arka olasılığının göreceli eşiğini belirlememiz gerekir.

Bu makalede kullanılan Bayes sınıflandırıcısının yalnızca ayrık öznitelik değerlerini işlemek için uygun olduğu ve sürekli öznitelik değerlerini işleyemediği görülebilir, çünkü kesikli öznitelik değerleri olasılığı tahmin etmek için frekansı kullanabilirken sürekli öznitelik değerleri Genellikle test örneklerinin öznitelik değerlerinden hiçbiri eğitim setinde görünmez. Olasılık fonksiyonunu temsil edecek bir dağılım varsaymamız gerekir. Aynı zamanda, dağılımın parametreleri de tahmin etmemiz gereken görev olur. Maksimum olasılık tahmini arkasında gizlidir. Bu, bir sonraki bölümde çözülecek problem olan bir tür parametre tahmin yöntemini temsil eder, bu yüzden bizi izlemeye devam edin.

Yazar: Head & Shoulders olmadan keşiş

Yeniden yazdırmanız gerekirse, lütfen arka planda bir mesaj bırakın ve yeniden yazdırma şartnamelerine uyun.

28 "Xueba Notes" Hangzhou'da sergileniyor. Bakalım Xueba ile senin arandaki fark ne?
önceki
"Çalışkanlık" ülkede bir ilk! 2018 metro raporu yayınlandı, Pekin hattı en "kalabalık" oldu
Sonraki
Şangay Otomobil Fuarı'nın yeni enerji bölümünü açmak için bütçeyi tutarken panik yapmayın / kalbinizde okuyun
Çerçevesiz kapılar, spor otomobil sırtları, 300.000'den fazla Volkswagen pick-up arabaya değer mi?
Yağış ve soğutmanın gönderildiğini ve Pekin'deki en yüksek sıcaklığın yarın yalnızca 9 olacağını unutmayın.
Bugün Çekirdek Ses | Yapay zekanın çizim yeteneğinizi tek tuşla nasıl kurtarabileceğini görün?
Fabrika Direktörü: SMLZ'nin kendi kendine kapanması kuruldu
Uzun süredir konuşulan Samsung S8 nihayet burada, ne söylemek istersiniz?
AI öğrenmenin "engelleyicisi" nasıl kırılır?
Yeryüzündeki tüm insanların "gökyüzüne uçurduğu" kutsal araba GK5'in gerçekten de hiçbir kusuru yok mu?
Huawei cep telefonları, Apple ve Samsung'un iç pazar payını neden ele geçirebilir?
Pennsylvania Üniversitesi: İsimlerinizi Tanıyın? Anlamsal bir ilişkisel adaptasyon oyunu
Hepsi anılar! Hadım edilen telefon işlevlerine bakın
2018 Q1 çeyrek cep telefonu satışları sıralaması İLK5: Yerli cep telefonları üç koltuk işgal ediyor
To Top