• 日本語
    • English (英語)
Avintonジャパン株式会社Avintonジャパン株式会社Avintonジャパン株式会社Avintonジャパン株式会社
  • サービス
    • Avinton Data Platform
    • エッジAIカメラ
    • プライベートクラウド
    • AIサービス開発
    • AI画像解析 – 無償PoC
  • 最新情報
    • ニュースリリース&イベント情報
    • 技術ブログ&インタビュー
  • アカデミー
    • Avintonアカデミー
    • Academy on Campus
  • 採用情報
    • Avintonで働く魅力
    • 新卒採用
    • プロジェクトコーディネーター職紹介
    • 求人
    • よくある質問
  • 企業情報
    • 会社概要
    • 代表からご挨拶
    • SDGsへの貢献
  • お問い合わせ

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

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

  • データが与えられたときの全ての推定の確率を計算し、最も確率の高いものを推定結果として出力
  • 非常にシンプルだが、現実世界の多くの複雑な問題に対してうまく機能
  • CPUとメモリに関してリソースが限られている場合に使用でき、さらにトレーニング時間が重要である場合、非常に迅速にトレーニングできて便利
  • データの特徴量は独立で、互いに相関がないと仮定しており、各特徴量が独立に推定結果に影響するため、とても強い仮定において実データでは成り立たないこともある
  • 強い仮定(制約)にもかかわらず、仮定が成り立たないであろう実データでも、驚くほどよい結果を出す
  • その結果が、他のより複雑なアルゴリズムを越えることも多々ある

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

以下に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)を呼んでいます。

 

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

 

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

1
#トレーニングデータセットの用意 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次元平面に描画して、可視化してみましょう。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# グラフ描画に向けてのデータの整形
 
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を学習させます。 学習はほぼ一瞬で終わります。

 

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

 

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

1
2
3
4
5
6
7
8
9
# テストデータの用意
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)のデータのあたりに位置しています。 それではテストデータを学習したモデルに与えて分類させてみます。

1
2
3
4
# テストデータの分類
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の充実した技術研修でスキルアップを図り、あなたのキャリア目標を達成しませんか?

採用情報

採用情報

採用情報

Avinton SDGs

SDGsへの貢献

Search

タグ

AI AI Big Data Big Data ccna Digital Transformation DX IoT LPIC Python Ruby SDGs Webエンジニア イベント インタビュー インフラエンジニア エンジニア オンラインセミナー キャリアチェンジ サーバーエンジニア システム開発 セミナー データサイエンス データサイエンティス データベース データ分析 データ解析 ネットワークエンジニア ビックデータ ボランティア 人工知能 勉強会 営業 就職活動 技術インターン 採用 新卒 新卒採用 新規事業 機械学習 派遣 深層学習 社員インタビュー 経営者交流会 転職
© 2022 Avinton | All Rights Reserved | プライバシーポリシー
  • サービス
    • Avinton Data Platform
    • エッジAIカメラ
    • プライベートクラウド
    • AIサービス開発
    • AI画像解析 – 無償PoC
  • 最新情報
    • ニュースリリース&イベント情報
    • 技術ブログ&インタビュー
  • アカデミー
    • Avintonアカデミー
    • Academy on Campus
  • 採用情報
    • Avintonで働く魅力
    • 新卒採用
    • プロジェクトコーディネーター職紹介
    • 求人
    • よくある質問
  • 企業情報
    • 会社概要
    • 代表からご挨拶
    • SDGsへの貢献
  • お問い合わせ
  • 日本語
    • English (英語)
Avintonジャパン株式会社