ベイズの定理の公式は非常に単純です。
。多くの場合、分類の問題を解決するために使用されます。
中国語の名前の方が優れており、英語ではNaive Bayes、Naive Bayesと呼ばれます。Naiveの意味は誰もが知っています。NaiveBayesの単純さは、すべての属性(つまり機能)が相互に独立しているという仮定に反映されています。次のように表すことができます。
このことから、以前のベイズの定理は次のように表すことができます。
作る
最大のカテゴリーYはサンプルです
それが属するカテゴリー。
そして、各サンプルについて、
ラベルが付いていません
変更されたので、比較してください
それでおしまい
'''
ナイーブベイズモデル
'''
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from collections import defaultdict
from sklearn.cross_validation import train_test_split
def load_data():'''
アイリスデータをロードする
'''
data =load_iris()return data['data'],data['target']classNBClassifier(object):
def __init__(self):
self.y =[]#ラベルコレクション
self.x =[]#各属性の値のセット
self.py =defaultdict(float)#ラベルの確率分布
self.pxy =defaultdict(dict)#各ラベルの下の各属性の確率分布
self.n =5#グレード数
def prob(self,element,arr):'''
要素がリストに表示される頻度を計算します
'''
prob =0.0for a in arr:if element == a:
prob +=1/len(arr)if prob ==0.0:
prob =0.001return prob
def get_set(self,x,y):
self.y =list(set(y))for i inrange(x.shape[1]):
self.x.append(list(set(x[:,i])))#各列の値セットを記録します
def fit(self,x,y):'''
トレーニングモデル
'''
x = self.preprocess(x)
self.get_set(x,y)
#1. pを取得(y)for yi in self.y:
self.py[yi]= self.prob(yi,y)
#2. pを取得(x|y)for yi in self.y:for i inrange(x.shape[1]):
sample = x[y==yi,i]#ラベルyiの下のサンプル
# 列の確率分布を取得します
pxy =[self.prob(xi,sample)for xi in self.x[i]]
self.pxy[yi][i]= pxy
print("train score",self.score(x,y))
def predict_one(self,x):'''
単一のサンプルを予測する
'''
max_prob =0.0
max_yi = self.y[0]for yi in self.y:
prob_y = self.py[yi]for i inrange(len(x)):
prob_x_y = self.pxy[yi][i][self.x[i].index(x[i])]#p(xi|y)
prob_y *= prob_x_y#pを計算する(x1|y)p(x2|y)...p(xn|y)p(y)if prob_y > max_prob:
max_prob = prob_y
max_yi = yi
return max_yi
def predict(self,samples):'''
予測機能
'''
samples = self.preprocess(samples)
y_list =[]for m inrange(samples.shape[0]):
yi = self.predict_one(samples[m,:])
y_list.append(yi)return np.array(y_list)
def preprocess(self,x):'''
さまざまな機能の値セットのサイズに大きな違いがあるため、確率行列の一部がまばらになり、データのセグメンテーションが必要になります
'''
for i inrange(x.shape[1]):
x[:,i]= self.step(x[:,i],self.n)return x
def step(self,arr,n):'''
nレベルに分割
'''
ma =max(arr)
mi =min(arr)for i inrange(len(arr)):for j inrange(n):
a = mi +(ma-mi)*(j/n)
b = mi +(ma-mi)*((j+1)/n)if arr[i]>= a and arr[i]<= b:
arr[i]= j+1breakreturn arr
def score(self,x,y):
y_test = self.predict(x)
score =0.0for i inrange(len(y)):if y_test[i]== y[i]:
score +=1/len(y)return score
if __name__ =="__main__":
x,y =load_data()
x_train,x_test,y_train,y_test =train_test_split(x,y,test_size =0.5,random_state =100)
clf =NBClassifier()
clf.fit(x_train,y_train)
score = clf.score(x_test,y_test)print('test score',score)
ソースコードアドレス: