Day15ナイーブベイズ|機械学習を得るために100日

Day15には、敬意を示すために、ナイーブベイズ、トニー卿を初めて目に、学習を開始します。

トーマス・ベイズ(トーマス・ベイズ)、イギリスの神学者、数学者、数学的な統計学者や哲学者、司祭をした、1702年にロンドンで生まれた。1742年には王立協会になった、1763年4月7日死。ベイズ確率論および2(ベイズとブレーズパスカルブレーズパスカル)の文字のいずれかの統計の早期開発に大きな影響を与えました。

ベイズ数学の確率論の主要な研究。彼は確率論の基礎理論、およびベイズ統計理論を作成するための最初の帰納的推論などの統計的推論、統計的推定のための統計的決定機能が貢献しました。この分野での1763年出版された作品は、近代的な確率論と数理統計学のアクションのために非常に重要があります。ベイズ「チャンスの教義で問題を解決に向けたエッセイは、」1758年に発表され、ベイズで使用される用語の多くは、まだ使われています。ベイズ統計的推論の主な貢献は、「逆確率」概念の使用であり、それはそれとして、一般的なベイズ推定法を提案しました。

統計的確率の基礎のI.レビュー

独立したイベント:1つの実験において、イベントの発生は、別のイベントの発生確率に影響を与えませんが、二人はどんな関係を持っていません。A1、A2、A3 ...独立した、A1〜しばらく発生確率の場合:

条件付き確率:Aは、シンボルによって表されるイベントBの発生確率のイベント状態を指します。

合計確率式:イベントA1、A2、A3 ...イベント・グループが完了を構成する、すなわち、それらは互換性のない二十から二、ω-コーパスであり、であるか、及びP(AI)> 0の場合、任意のBのための試験は、次のとおり

他の確率的、会場に興味がある私たち。

[]復習ノートの簡単な確率1--独立した事象の確率

[]リフレッシャー確率は、古典的な、一般的注意します2--

3--ノート確率幾何学的な確率モデル[新しい学習]

[]リフレッシャーノート4--重要確率式

[]リフレッシャー確率分布確率ノート5--

第二に、ベイズの定理

ベイズの定理(ベイズの規則):が有限であり、互いに素イベントB1、B2···、Bkのk個の場合、及び、P(B1)+ P(B2)+···+ P(Bk)の= 1と観測可能なイベントA、そこです。

これは、ベイズ式です:

P(Biが)事前確率、新たなデータの前に得られた仮説の確率、すなわちです。

P(バイ| A)事後確率、新たなデータが観測された後に仮説が計算されること、すなわち確率です。

P(A | Biが)、すなわち、仮説のデータを得る確率尤度です。

P(A)は、正規化定数、任意の仮定で得られたデータの、すなわち、確率です。

それは複雑ではありませんことを証明

図1は、条件付確率の定義によれば、事象Aの確率は、イベントBで発生です。

図2に示すように、同じ確率、イベントBの発生の条件でイベントAで:

3.これらの二つの式の組み合わせは、我々が得ます:

P(A)が非ゼロの場合4、P(A)を分割同じ式の両側に、我々は、ベイズの定理を得ます。

Bが前提に表示され、Aが発生する確率は、Bの発生現れる確率で割っの前提の下での発生確率を乗じBの発生確率に等しいです。接点A及びBを介して、すなわち別のイベントが発生した場合にイベントの確率から計算され、ソースからの結果に戻る(すなわち、逆の確率)。

ベイズ式や理論やメソッドのセットは、このように統計的確率がベイズと呼ばれ、開発、および確率学校は思考の全く異なる方法があります。

周波数学校:研究はイベント自体だったので、研究者は順番に、それだけに試行錯誤のアプローチは、結果を取得することができます。たとえば:あなたはコインを投げたときにフェイスアップの確率を計算したい場合は、私たちは、周波数が確率フェイスアップ顔アップのときの数が無限大になる傾向投げる、コイントスを維持する必要があります。

ベイズ学校:あなたは情報収集事前知識を使用することができますし、彼を記述し、それを証明する証拠の一部を使用するので、研究は、物事のオブザーバービューでした。小さなコインが均一であることを知っている場合、またはそのようなコイントスとして、次の時間がスロー結果が正または負であり得られる50%の信頼水準(確率分布)であり、最も一般的なコインのは、この均一の外であってもよいですなボブとしての信念は、ランダムにそうすることによって、1000年、調査結果を投げ、その後、証拠によって彼らの事前知識を検証。(改変が存在する、硬貨が不足で、一貫性のない材料を発見したような、そのような手順です)

例えば

ボックスのそれぞれに設置2個のボール100、ボックス70赤いボール、グリーンボール30、ボックスB赤いボール30、70グリーンボールが存在すると仮定する。従って、元のボックスに、次にボールの色のメモを取り、ボールが記録赤いボールは、4個の緑色のボールを得るために12回、8回繰り返して、ボックスを選択し、ランダムに仮定する。質問は、あなたはどのくらいのボックス選択ボックスである確率であると思いますか?

AとBの事前確率の先頭を選択して、それがランダムであるので、(これが第二の選挙ベイズの定理特殊な形式です)、50%の2つのボックス、第二の選挙です。それは次のとおりです。

P(A)= 0.5、P(B)= 1 - P(A)。

そして、赤いボールの場合にボールを思い付く、私たちは事前確率ボックスを選択し、更新するために、この情報に基づいている必要があります。

P(A |赤いボール1)= P(赤いボール| A)×P(A)/(P(赤いボール| A)×P(A)+(P(赤いボール| P×B)(B)) )

P(赤いボール| A):ボックス内の赤いボールの確率を取得します

P(赤いボール| B):Bを取得するためのボックス内の赤いボールの確率

従って赤いボールの場合には、事前確率選択ボックスをに変更することができます。

P(A |赤いボール1)= 0.7×0.5 /(0.7×0.5 + 0.3×0.5)= 0.7

赤いボールが出現した後、すなわち、およびBボックスがチェックされている事前確率を読み取るように改正されました。

P(A)= 0.7、P(B)= 1 - P(A)= 0.3。

96.7%を:あなたは改正8個の赤のボール(増加の確率)を通過するまで繰り返し、4の後にこの緑色のボールは、次のように確率にボックスを選択し、(確率の減少)を改正しました。

この問題を解決するためのPythonコード:

def bayesFunc(pIsBox1, pBox1, pBox2):
return (pIsBox1 * pBox1)/((pIsBox1 * pBox1) + (1 - pIsBox1) * pBox2)
def redGreenBallProblem():
pIsBox1 = 0.5
# consider 8 red ball
for i in range(1, 9):
pIsBox1 = bayesFunc(pIsBox1, 0.7, 0.3)
print " After red %d > in 甲 box: %f" % (i, pIsBox1)
# consider 4 green ball
for i in range(1, 5):
pIsBox1 = bayesFunc(pIsBox1, 0.3, 0.7)
print " After green %d > in 甲 box: %f" % (i, pIsBox1)
redGreenBallProblem()

結果は以下の通りであります:

After red 1 > in 甲 box: 0.700000
After red 2 > in 甲 box: 0.844828
After red 3 > in 甲 box: 0.927027
After red 4 > in 甲 box: 0.967365
After red 5 > in 甲 box: 0.985748
After red 6 > in 甲 box: 0.993842
After red 7 > in 甲 box: 0.997351
After red 8 > in 甲 box: 0.998863
After green 1 > in 甲 box: 0.997351
After green 2 > in 甲 box: 0.993842
After green 3 > in 甲 box: 0.985748
After green 4 > in 甲 box: 0.967365

もちろん、あなたは赤いボールの出現は、ボックスを選択する確率、および緑色のボールは逆に増加することがわかります。

第三に、ナイーブベイズアルゴリズム

ナイーブベイズ(ナイーブベイズ)と特徴計算による分類は、分類は、それは確率論に基づく機械学習であることに大きな可能性を選択する確率に基づくベイズ条件付き独立性の仮定の分類に特徴があります。分類。目標は分類を決定することであるため、それはまた、教師付き学習の一環です。ナイーブベイズの仮定様々な特徴は、そのプレーンと呼ばれる独立しています。これは、大幅確率を計算する難しさを減らすこと、お互いに影響を与えていないさまざまな機能を想定し、機能の独立性の仮定に基づいて、簡単な操作が簡単です。

  1. 次のようにナイーブベイズアルゴリズムの実装プロセスは、
    1)設定
    項目については、分類されるXの特徴的な特性です、

2)として設定されたカテゴリは次のとおりです。

3)ベイズ式に従って計算します

場合は4)
そしてxがこれに属する
カテゴリ。

  1. ナイーブベイズガウシアン(典型的には連続的な場合に使用される特性属性)

    1は、ベイズ式を用いナイーブベイズアルゴリズムであり、それは変更を加えていないため、上記処理アルゴリズムは、見ることができます。

    離散データ機能の条件付き確率を計算するには大数の法則(周波数の代わりの思考確率)を使用することができます。しかし、どのようにそれを連続的な特徴に対処するには?ここでは、一般的にガウスナイーブベイズを使用しています。

いわゆるガウスナイーブベイズ、属性がガウス分布と連続値である場合、値を直接条件付き確率分布を用いて計算することができることを特徴とするガウス確率式です。

![](https://img2018.cnblogs.com/blog/743008/201908/743008-20190805191943676-1417644618.png)

此时,我们只需要计算各个类别下的特征划分的均值和标准差.
  1. (一般離散特性属性の場合に使用される)、ナイーブベイズ多項式

    ナイーブベイズ、パラメータ、多項式オベイ分布特性こと、多項式と呼ばれ、このように各カテゴリyの
    確率θyi| nは、特性の数は、P(Y XI)であり、。

  1. (一般的に欠損値の場合に使用)ベルヌーイナイーブベイズ

    多項式モデル、ベルヌーイモデルは、離散的な機能の場合にも適用することが、違いは、各機能のベルヌーイモデル値は、文書内の1と0(テキスト分類において、例えば、ワードとすることができます前記値1または0)が発生していました。

第四に、実際のナイーブベイズ

sklearnナイーブベイズの3種類があります。

ガウス分布:分類問題、正規分布の性質/特性を仮定。

多項式タイプ:モデル年のための離散的な値。このような私たちは先に述べたテキスト分類問題として、私たちは言葉だけでも、出現回数に依存し、テキストで表示されません。単語の総数がNである場合、mは単語の数が表示され、その後、シーンサイコロn回のようなビットM倍ワードが表示されています。

ベルヌーイタイプ:結果として得られる特徴のみ0(無表示)および1(現れ)。

ミニマリストのスターターをScikit、学習

我々は分類アイリスデータセットを用いて、実施例1

from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import cross_val_score
from sklearn import datasets
iris = datasets.load_iris()
gnb = GaussianNB()
scores=cross_val_score(gnb, iris.data, iris.target, cv=10)
print("Accuracy:%.3f"%scores.mean())

出力:精度:0.953

例2 Kaggleゲームの「サンフランシスコの犯罪カテゴリ予測因子」

题目背景:『水深火热』的大米国,在旧金山这个地方,一度犯罪率还挺高的,然后很多人都经历过大到暴力案件,小到东西被偷,车被划的事情。当地警方也是努力地去总结和想办法降低犯罪率,一个挑战是在给出犯罪的地点和时间的之后,要第一时间确定这可能是一个什么样的犯罪类型,以确定警力等等。后来干脆一不做二不休,直接把12年内旧金山城内的犯罪报告都丢带Kaggle上,说『大家折腾折腾吧,看看谁能帮忙第一时间预测一下犯罪类型』。犯罪报告里面包括日期,描述,星期几,所属警区,处理结果,地址,GPS定位等信息。当然,分类问题有很多分类器可以选择,我们既然刚讲过朴素贝叶斯,刚好就拿来练练手好了。

(1) 首先我们来看一下数据

import pandas as pd  
import numpy as np  
from sklearn import preprocessing  
from sklearn.metrics import log_loss  
from sklearn.cross_validation import train_test_split
train = pd.read_csv('/Users/liuming/projects/Python/ML数据/Kaggle旧金山犯罪类型分类/train.csv', parse_dates = ['Dates'])  
test = pd.read_csv('/Users/liuming/projects/Python/ML数据/Kaggle旧金山犯罪类型分类/test.csv', parse_dates = ['Dates'])  
train  


我们依次解释一下每一列的含义:

Date: 日期
Category: 犯罪类型,比如 Larceny/盗窃罪 等.
Descript: 对于犯罪更详细的描述
DayOfWeek: 星期几
PdDistrict: 所属警区
Resolution: 处理结果,比如说『逮捕』『逃了』
Address: 发生街区位置
X and Y: GPS坐标
train.csv中的数据时间跨度为12年,包含了将近90w的记录。另外,这部分数据,大家从上图上也可以看出来,大部分都是『类别』型,比如犯罪类型,比如星期几。
(2)特征预处理
sklearn.preprocessing模块中的 LabelEncoder函数可以对类别做编号,我们用它对犯罪类型做编号;pandas中的get_dummies( )可以将变量进行二值化01向量,我们用它对”街区“、”星期几“、”时间点“进行因子化。

#对犯罪类别:Category; 用LabelEncoder进行编号  
leCrime = preprocessing.LabelEncoder()  
crime = leCrime.fit_transform(train.Category)   #39种犯罪类型  
#用get_dummies因子化星期几、街区、小时等特征  
days=pd.get_dummies(train.DayOfWeek)  
district = pd.get_dummies(train.PdDistrict)  
hour = train.Dates.dt.hour  
hour = pd.get_dummies(hour)  
#组合特征  
trainData = pd.concat([hour, days, district], axis = 1)  #将特征进行横向组合  
trainData['crime'] = crime   #追加'crime'列  
days = pd.get_dummies(test.DayOfWeek)  
district = pd.get_dummies(test.PdDistrict)  
hour = test.Dates.dt.hour  
hour = pd.get_dummies(hour)  
testData = pd.concat([hour, days, district], axis=1)  
trainData 

特征预处理后,训练集feature,如下图所示:

(3) 建模

from sklearn.naive_bayes import BernoulliNB
import time
features=['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'BAYVIEW', 'CENTRAL', 'INGLESIDE', 'MISSION',  
 'NORTHERN', 'PARK', 'RICHMOND', 'SOUTHERN', 'TARAVAL', 'TENDERLOIN']  
X_train, X_test, y_train, y_test = train_test_split(trainData[features], trainData['crime'], train_size=0.6)  
NB = BernoulliNB()  
nbStart = time.time()  
NB.fit(X_train, y_train)  
nbCostTime = time.time() - nbStart  
#print(X_test.shape)  
propa = NB.predict_proba(X_test)   #X_test为263415*17;那么该行就是将263415分到39种犯罪类型中,每个样本被分到每一种的概率  
print("朴素贝叶斯建模%.2f秒"%(nbCostTime))  
predicted = np.array(propa)  
logLoss=log_loss(y_test, predicted)  
print("朴素贝叶斯的log损失为:%.6f"%logLoss)  

输出:
朴素贝叶斯建模0.55秒
朴素贝叶斯的log损失为:2.582561

例3 文本分类——垃圾邮件过滤

收集数据:提供文本文件
准备数据:将文本文件解析成词条向量
分析数据;检查词条确保解析的正确性
训练算法:使用之前建立的trainNB0()函数
测试算法:使用classifyNB(),并且构建一个新的测试函数来计算文档集的错误率
使用算法:构建一个完整的程序对一组文档进行分类,将错分的文档输出到屏幕上

准备数据:切分文本

使用正则表达式切分,其中分隔符是除单词、数字外的任意字符

import re
mySent = 'This book is the best book on Python or M.L. I have ever laid eyes upon.'
regEx = re.compile('\\W*')
listOfTokens = regEx.split(mySent)
# 去掉长度小于0的单词,并转换为小写
[tok.lower() for tok in listOfTokens if len(tok) > 0]
[out]
['this', 'book', 'is', 'the', 'best', 'book', 'on', 'python', 'or', 'm', 'l', 'i', 'have', 'ever', 'laid', 'eyes', 'upon']

切分邮件

emailText = open('email/ham/6.txt').read()
listOfTokens = regEx.split(emailText)

测试算法:使用朴素贝叶斯进行交叉验证

import randomdef textParse(bigString):
    '''
    字符串解析
    '''
    import re    # 根据非数字字母的任意字符进行拆分
    listOfTokens = re.split(r'\W*', bigString)    # 拆分后字符串长度大于2的字符串,并转换为小写
    return [tok.lower() for tok in listOfTokens if len(tok) > 2]def spamTest():
    '''
    贝叶斯分类器对垃圾邮件进行自动化处理
    '''
    docList = []
    classList = []
    fullText = []    for i in range(1, 26):        # 读取spam文件夹下的文件,并转换为特征和标签向量
        wordList = textParse(open('email/spam/%d.txt' % i).read())
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(1)        # 读取ham文件夹下的文件,并转换为特征和标签向量
        wordList = textParse(open('email/ham/%d.txt' % i).read())
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(0)    # 转换为词列表
    vocabList = createVocabList(docList)    # 初始化训练集和测试集
    trainingSet = range(50);
    testSet = []    # 随机抽取测试集索引
    for i in range(10):
        randIndex = int(random.uniform(0, len(trainingSet)))
        testSet.append(trainingSet[randIndex])        del(trainingSet[randIndex])

    trainMat = []
    trainClasses = []    # 构造训练集
    for docIndex in trainingSet:
        trainMat.append(setOfWords2Vec(vocabList, docList[docIndex]))
        trainClasses.append(classList[docIndex])    # 朴素贝叶斯分类模型训练
    p0V, p1V, pSpam = trainNB0(np.array(trainMat), np.array(trainClasses))
    errorCount = 0

    # 朴素贝叶斯分类模型测试
    for docIndex in testSet:
        wordVector = setOfWords2Vec(vocabList, docList[docIndex])        if classifyNB(np.array(wordVector), p0V, p1V, pSpam) != classList[docIndex]:
            errorCount += 1
            print 'classification error', docList[docIndex]    print 'the error rate is: ',float(errorCount)/len(testSet)

由于SpamTest()构造的测试集和训练集是随机的,所以每次运行的分类结果可能不一样。如果发生错误,函数会输出错分文档的词表,这样就可以了解到底哪篇文档发生了错误。这里出现的错误是将垃圾邮件误判为了正常邮件。

import randomdef textParse(bigString):
    '''
    字符串解析
    '''
    import re    # 根据非数字字母的任意字符进行拆分
    listOfTokens = re.split(r'\W*', bigString)    # 拆分后字符串长度大于2的字符串,并转换为小写
    return [tok.lower() for tok in listOfTokens if len(tok) > 2]def spamTest():
    '''
    贝叶斯分类器对垃圾邮件进行自动化处理
    '''
spamTest()
[out]
classification error ['benoit', 'mandelbrot', '1924', '2010', 'benoit', 'mandelbrot', '1924', '2010', 'wilmott', 'team', 'benoit', 'mandelbrot', 'the', 'mathematician', 'the', 'father', 'fractal', 'mathematics', 'and', 'advocate', 'more', 'sophisticated', 'modelling', 'quantitative', 'finance', 'died', '14th', 'october', '2010', 'aged', 'wilmott', 'magazine', 'has', 'often', 'featured', 'mandelbrot', 'his', 'ideas', 'and', 'the', 'work', 'others', 'inspired', 'his', 'fundamental', 'insights', 'you', 'must', 'logged', 'view', 'these', 'articles', 'from', 'past', 'issues', 'wilmott', 'magazine']
the error rate is:  0.1spamTest()
[out]
the error rate is:  0.0

参考文献:

https://blog.csdn.net/fisherming/article/details/79509025
https://blog.csdn.net/qq_32241189/article/details/80194653
http://blog.csdn.net/kesalin/article/details/40370325

おすすめ

転載: www.cnblogs.com/jpld/p/11305018.html