• 日本語
    • English (英語)
Avinton JapanAvinton JapanAvinton JapanAvinton Japan
  • サービス
    • Avinton Data Platform
    • エッジ AIカメラ
    • AIサービス開発
    • 画像認識PoC
  • 最新情報
  • アカデミー
  • 採用情報
    • Avintonで働く魅力
    • 求人
    • よくある質問
  • 企業情報
    • 会社概要
    • 代表からご挨拶
    • CSR(企業の社会的責任)
  • お問い合わせ

機械学習入門者向け Naive Bayes(単純ベイズ)アルゴリズムに触れてみる

  • Python3.6 と OpenCV のインストール (Ubuntu18.04LTS)
  • ルーティング
  • 見た目を美しくしてみましょう
  • NAT
  • 三目並べ – 2.〇×を交互にゲーム盤に入るようにしよう
  • カート内のアイテム個数を変更
  • 三目並べ – 3.勝敗がつくようにしよう
  • EC2からS3へ自動でぽいぽいアップロードするスクリプトの作成
  • 三目並べ – 4.「スタート」「リセット」ボタンをつけよう
  • 三目並べ – 5.先攻後攻を決めて、コンピュータ対戦にしよう(前編)
  • カートの設置
  • Ruby on Rails を MySQLでセットアップ
  • レイアウト調整
  • 機械学習入門者向け Support Vector Machine (SVM) に触れてみる
  • AWSアカウントの作成と必ずやるべきセキュリティ対策
  • VLAN
  • テスト
  • 機械学習を用いた画像分類
  • Ruby on Railsによる簡単なウェブアプリケーション
  • 正規表現とパイプ
  • 機械学習エンジニアに必要なスキル
  • Ubuntuの設定
  • PostgreSQL Setup
  • REDIS
  • Amazon EC2 インスタンスの初期設定をしよう
  • Pythonの設定
  • GNS3のセットアップ
  • viエディタ
  • AWSのEC2インスタンスでWordPressブログを公開してみよう
  • Pythonでデータベースを操作する
  • Python2.7とOpenCVのインストール
  • ファイル操作コマンド
  • OpenCVのテストプログラム
  • グループとユーザー
  • Pythonで画像を分類するプログラムを作成する
  • AWS CLIをインストールしてコマンド操作しよう
  • Virtualisation and Container (仮想化とコンテナ) – Ansible, Docker and Kubernetes
  • Windows Server 2012 R2 Hyper-V
  • 困った時に使うコマンド
  • PacketTracerのセットアップ
  • 一般グループのユーザーとグループ
  • AWS Route 53を使って独自ドメインのWebページを表示させてみよう
  • プライバシーポリシー
  • VMware ESXi サーバー構築
  • 三目並べ – 6.先攻後攻を決めて、コンピュータ対戦にしよう(後編)
  • フロントエンド開発のための環境構築
  • フロントエンドのデモンストレーション
  • APIのデモンストレーション
  • CISCO 1800ルータセットアップ
  • ファイル検索コマンド
  • ESXi – Switchの追加とVLAN
  • 質問
  • 仮想化環境のディスク容量を拡張する
  • ユーザー権限とアクセス権
  • 三目並べ – 0.導入
  • テキスト処理
  • ESXi - VyOS
  • データベースへのデータロード
  • 機械学習入門者向け Naive Bayes(単純ベイズ)アルゴリズムに触れてみる
  • CCNA
  • ESXi – 小規模ネットワーク 構築
  • ファイル管理
  • 機械学習入門者向け ChainerRLでブロック崩しの学習
  • AWS CLIを使ってEC2のファイルをS3へアップロードしよう
  • CSV import & export – Node.js, mySQL – 1
  • 機械学習入門者向け ランダムフォレストによる Kaggle Titanic生存者予測
  • CSV import & export – Node.js, mySQL – 2
  • PCからルータ、スイッチへのSSH接続設定
  • 【Python入門】Python Numpy チュートリアル
  • SQL 便利な関数
  • PostgreSQLによるデータ分析
  • 機械学習入門者向け 分類と回帰の違いをプログラムを書いて学ぼう
  • NodeJSでWebアプリケーション開発 – React編
  • Pythonによるマルチスレッドプログラミング実践
  • Certbotを使ってSSL証明書を発行し、HTTP通信を暗号化しよう
  • DockerとApacheを使ってWebサーバーを構築しよう
  • NodeJSでWebアプリケーション開発 – React編
  • Ruby on Rails インストール
  • AmazonEC2とVPCでネットワークとサーバーを構築しよう
  • AWS入門者向け 初心者が最初に理解すべきEC2とVPCの基本的な用語解説
  • Linuxとは
  • Pandasによる構造化データ分析
  • カート機能作成
  • Ruby on Rails Academy
  • ショッピングアプリケーション作成
  • ダイナミックルーティング
  • PostgreSQL – Python – Apache – Bootstrap
  • 三目並べ – 1.ゲーム盤を作ろう
Home Academy 機械学習入門者向け Naive Bayes(単純ベイズ)アルゴリズムに触れてみる

Naive Bayes

今回はベイズの定理という数学(確率論)の定理をもとにした、Naive Bayes アルゴリズムと呼ばれる教師あり学習アルゴリズムについて説明します。

これは分類タスク向けのアルゴリズムで、文書データに対してよい結果を出すことが知られています。

用意してある、Jupyter notebookをダウンロードして実際にコードを書きながら学習することができます。
今回は、下記にコード例も最後に載せてあるので、ぜひ自分の手で実行して理解を深めてみてください。

ベイズの定理とは

機械学習のタスクでは、データセットが与えられたときに、それをもとにした推定がいくつかある中で、どの推定が最もらしいかということがよく問題になります。

例えば分類タスクでは、そのデータ点(サンプル)がどれに分類されるのかというのが、ここでいう推定ということになります。

このような、どの推定が最もらしいか判断するときに使えるのが、ベイズの定理と呼ばれる定理です。

ベイズの定理の式

[math] \underbrace{P(H|D)}_{結果が起きた時の原因の確率} = \underbrace{ \frac {P(D|H) \, P(H)}{P(D)}}_{各値はデータから計算できる値} [/math]

[math]P(H|D) [/math] データD(結果)が与えられたときの、そのデータ(結果)に対する原因の推定Hが正しい確率。
(事後確率と呼ばれる。)
[math] P(D|H) [/math] 原因の推定Hが正しいとしたときの、データD(結果)の確率。
[math] P(H) [/math] データ(結果)に関係なく、原因の推定Hが正しい確率。
(推定Hの事前確率と呼ばれる。)
[math] P(D) [/math] 原因の推定に関係ない、データD(結果)の確率。
(データDの事前確率と呼ばれる。)

この式のここでの意味としては、結果の確率(事前確率、データからわかる) [math] P(H) [/math], [math] P(D) [/math], [math] P(D|H) [/math] がわかっていれば、その結果となった原因の確率(事後確率) [math] P(H|D) [/math] がわかるということです。

つまり、ある種の結果であるデータが与えられれば、そのデータから計算あるいは予想できる量を用いて、その結果となった原因の確率値が計算できるということになります。
こうして各原因の推定に対してそれぞれ確率(事後確率) [math] P(H|D) [/math] を計算すれば、その値が最も高いものが、与えられたデータ(結果)において最も確からしい原因の推定結果、ということになります。

例えば、
ある街で、火事が起こる確率が[math]P(Fire) = 0.01[/math] で、煙が上がっているのを見る確率が[math]P(Smoke) = 0.1[/math] だとします。また火事の90%で煙が上るとすると、[math](P(Smoke|Fire) = 0.9)[/math] 煙が見えたときに実際にそれが火事が原因である事後確率は、ベイズの定理より

[math] P(Fire|Smoke) = \frac{P(Fire)\, P(Smoke|Fire)} {P(Smoke)} = \frac{0.01 * 0.9}{0.1} = 0.09 = 9% [/math]

ということになります。

煙が見えた時に火事が起こっている(家事が煙の原因である)確率の推定結果

このようにして各原因の推定が正しい確率を計算していきます。

Naive Bayesアルゴリズムとは

そしてこのベイズの定理をもとにしたのが、Naive Bayesアルゴリズムです。データが与えられたときの全ての推定の確率を計算し、最も確率の高いものを推定結果として出力します。
Naive Bayesは、とてもシンプルですが、現実世界の多くの複雑な問題に対してうまく機能します。
CPUとメモリに関してリソースが限られている場合に使用でき、さらにトレーニング時間が重要である場合、Naive Bayesは非常に迅速にトレーニングできるので便利です。

なおこのアルゴリズムでは、データの特徴量は独立で、互いに相関がないと仮定します。つまり各特徴量が独立に推定結果に影響します。これはとても強い仮定で、実データでは成り立たないことも多いです。

実はこれがNaiveと名前につく所以でもあるのですが、その強い仮定(制約)にもかかわらず、この仮定が成り立たないであろう実データでも、驚くほどよい結果を出すというのがこのアルゴリズムの優秀な点です。

またその結果が、他のより複雑なアルゴリズムを越えることも多々あるという点も注目に値します。

アルゴリズムの長所と短所

以下にNaive Bayesアルゴリズムの長所と短所をまとめます。

長所
  • 単純(実装も簡単)かつ強力
  • とても大きなデータセットに対しても有効
  • 高速で計算資源も少なくてよい
  • 少ないトレーニングデータでも性能が出る
  • 重要でない特徴量の影響を受けにくい
短所
  • 各特徴量が独立であると仮定しなければならない(実データでは成り立たないことも多い)

Naive Bayesアルゴリズムの応用先

そして以下に応用先をまとめます。
上であげた長所から、リアルタイムでの処理や文書データによく用いられています。

リアルタイム予測

Naive Bayes アルゴリズム リアルタイム予測
実用例として、電車の混雑状況や、津波・地震などの災害予測、株価のリアルタイム予測などがあり、リアルタイムで状況を予測する機能です。

 

 

 

テキスト分類

テキスト分類 Naive Bayes
テキスト分類とは、与えられた文書(Webページなど)をあらかじめ与えられたいくつかのカテゴリ(クラス)に自動分類することです。テキスト分類は、対象とするテキストによって幅広い応用ができます。例えば、すでに実用化されている機能としては、

    • 電子メール

受診したメールを「スパム」と「それ以外」というカテゴリへ自動分類して「スパム」をゴミ箱へ捨てる、スパムフィルタ機能。

    • Webページ

「政治・経済」「科学・学問」「コンピュータ・IT」「ゲーム・アニメ」などのカテゴリへ自動分類(はてなブックマーク)。

    • ニュース記事

記事を、「興味あり」「興味なし」というカテゴリへ自動分類して「興味あり」のニュース記事だけおすすめ(情報推薦・情報フィルタリング)に表示。

などがあります。

レコメンドシステム

例えば、よくネットショッピングをしている時に見かける、「あなたの検索したアイテムを買った人は、このアイテムも買っています」という表現です。
それまでの利用者の行動を蓄積し、機械が学習することで、あなたに合うと思われるアイテムなどを勧めてくれます。

センチメント分析

センチメント分析 Naive Bayesセンチメント分析とは、あるトピックに対して、その文章が肯定的であるか否定的であるか、あるいは中立的であるかを判断するものです。特定のテーマに対して、人々がどのように感じているかを分析する際に用いられます。

 

 

Jupyter Notebook上で実際に体験


ここでは実際にScikit learnで実装したコード例を載せておきます。ぜひ実際に実行して、その手軽さを実感してみてください。

Naive Bayesの中には実はいくつかタイプがあるのですが、ここではGaussianモデルと呼ばれるものを用いています。

内容としては、自分で用意した2次元のトレーニングデータセットをもとに、新しい2次元データをlabel1かlabel2に分類するというシンプルなものです。

実際の実行は他の機械学習Academy同様、こちらのJupyter Notebookをダウンロードしてその中で行ってください。

*Jupyter Notebook使用は、Anacondaがダウンロード済みである必要があります。
Anacondaダウンロード方法は機械学習を用いた画像分類体験をご覧ください。

Code Example

まずは必要なライブラリをインポートします。
Scikit learnからGaussianNB(Gaussian型Naive Bayes)を呼んでいます。

# 必要なライブラリのインポート
from sklearn.naive_bayes import GaussianNB
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

2次元のトレーニングデータを自前で用意します。
xがデータ、yがそのlabel(1 or 2)になります。

#トレーニングデータセットの用意
x = np.array([[-2,6], [0,6], [0,7], [-2,5], [-3,3], [-1,0], [-2,0], [-3,1], [-1,4], [0,3], [0,1], [-1,7], [-3,5], [-4,3], [-2,0], [-3,7], [1,5], [1,2], [-2,3], [2,3], [-4,0], [-1,3], [1,1], [-2,2], [2,7], [-4,1]])
y = np.array([2, 1, 2, 1, 1, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1, 2, 1, 2, 2])

用意したトレーニングデータを2次元平面に描画して、可視化してみましょう。

# グラフ描画に向けてのデータの整形
data = np.hstack((x, y.reshape(y.shape[0],1)))
# print(data)

data1 = data[np.where(data[:,2]==1)]
data2 = data[np.where(data[:,2]==2)]
# print(data1)
# print(data2)

# matplotlibを用いたデータの可視化(グラフ化)
plt.close("all")
plt.scatter(data1[:,0], data1[:,1], c="tab:blue")
plt.scatter(data2[:,0], data2[:,1], c="tab:red")
plt.show()

多少の外れ値はありますが、全体として中心の青(label1)のデータ点の集まりを赤(label2)のデータが囲んでいるような構造が見えます。

それではこのトレーニングデータを用いて、Gaussian Naive Bayesを学習させます。
学習はほぼ一瞬で終わります。

# モデルの学習
model = GaussianNB()
model.fit(x, y)
print("Model fitted.")

次にテストデータを用意し、それをグラフに描画してみましょう。

# テストデータの用意
test_data = np.array([[0,4], [1,0]])

# matplotlibを用いたデータの可視化(グラフ化)
plt.close("all")
plt.scatter(data1[:,0], data1[:,1], c="tab:blue")
plt.scatter(data2[:,0], data2[:,1], c="tab:red")
plt.scatter(test_data[:,0], test_data[:,1], c="k" )
plt.show()

黒の点がテストデータ[0,4]と[1,0]になります。
[0,4]は青(label1)のデータ点の集まりの中に位置し、[1,0]は外側の赤(label2)のデータのあたりに位置しています。

それではテストデータを学習したモデルに与えて分類させてみます。

# テストデータの分類
test_label = model.predict(test_data)
print("Label of test data", test_data[0], ":", test_label[0])
print("Label of test data", test_data[1], ":", test_label[1])

用意したテストデータ[0,4]はlabel1に、[1,0]はlabel2に分類されていることがわかります。
この結果から、青(label1)のデータの外側に赤(label2)のデータというトレーニングデータの構造を、モデルがうまく掴んでいるであろうことがわかります。
他にもトレーニングデータを変えてみたり、テストデータを変えてみたりして色々な設定で動かしてみてましょう。アルゴリズムの特徴をつかむのに役に立つはずです。

まとめ

今回はベイズの定理という、数学(確率)の定理を用いた教師あり学習アルゴリズムの1つ、Naive Bayesについて、Example code付きで見てきました。

主な利用先は分類問題で、単純(実装も簡単)かつ大きなデータセットに対しても高速に計算ができるのが特徴です。

コードに関してはぜひ色々なデータを自分で設定してみて、アルゴリズムの特徴をつかんでみてください。

あなたも、Avintonでこのような最先端技術に日常的に
取り組んでみませんか?

優秀なエンジニアの成長を導きながら、AIやビッグデータなどの最先端技術を活用していくことが私たちのビジョンです。
Avintonの充実した技術研修でスキルアップを図り、あなたのキャリア目標を達成しませんか?

採用情報

採用情報

採用情報

Search

タグ

2017 2018 AI Avinton Avinton Academy Avinton Japan Avintonジャパン DX HTML Linux Python Ruby Webエンジニア アビントン アビントンジャパン アヴィントン アヴィントンジャパン イベント インフラエンジニア エンジニア グローバル サーバーエンジニア データサイエンス データサイエンティスト データベース データ解析 ニュービジネス研究会 ネットワークエンジニア ビックデータ ベンチャー 勉強会 就活 就職活動 成長 技術インターン 採用 新規事業 横浜 機械学習 機械学習エンジニア 派遣 第二新卒 経営者交流会 英語 起業
© 2020 Avinton | All Rights Reserved | プライバシーポリシー
  • サービス
    • Avinton Data Platform
    • エッジ AIカメラ
    • AIサービス開発
    • 画像認識PoC
  • 最新情報
  • アカデミー
  • 採用情報
    • Avintonで働く魅力
    • 求人
    • よくある質問
  • 企業情報
    • 会社概要
    • 代表からご挨拶
    • CSR(企業の社会的責任)
  • お問い合わせ
  • 日本語
    • English (英語)
Avinton Japan