• 日本語
    • English (英語)
Avinton JapanAvinton JapanAvinton JapanAvinton Japan
  • サービス
    • Avinton Data Platform
    • エッジAIカメラ
      • 自動車ナンバープレート自動認識システム
    • プライベートクラウド
    • AIサービス開発
    • AIカメラ/画像解析無料体験版
  • 最新情報
    • ニュースリリース&イベント情報
    • 技術ブログ&インタビュー
  • アカデミー
    • Avintonアカデミー
    • Academy on Campus
    • Academy with Platform
  • 採用情報
    • Avintonジャパン 採用ページ
    • 求人一覧
    • よくある質問
    • 新卒採用
  • 企業情報
    • 会社概要
    • 代表からご挨拶
    • SDGsへの貢献
  • お問い合わせ

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

  • ルーティング
  • データベースの命名規則
  • 三目並べ – 2.〇×を交互にゲーム盤に入るようにしよう
  • 三目並べ – 3.勝敗がつくようにしよう
  • クリーンコード(Clean Code)
  • 三目並べ – 4.「スタート」「リセット」ボタンをつけよう
  • 三目並べ – 5.先攻後攻を決めて、コンピュータ対戦にしよう(前編)
  • インフラストラクチャー(サーバー、コンポーネント、RAID)
  • 機械学習入門者向け Support Vector Machine (SVM) に触れてみる
  • YOLOv8を用いた物体検出
  • 正規表現とパイプ
  • 機械学習エンジニアに必要なスキル
  • 軽量版Kubernetesディストリビューション – k0s クラスターの構築
  • ファイル操作コマンド
  • グループとユーザー
  • 困った時に使うコマンド
  • 一般グループのユーザーとグループ
  • プライバシーポリシー
  • 三目並べ – 6.先攻後攻を決めて、コンピュータ対戦にしよう(後編)
  • フロントエンド開発のための環境構築
  • ファイル検索コマンド
  • 質問
  • 仮想化環境のディスク容量を拡張する
  • ユーザー権限とアクセス権
  • データ分析基礎 – Part1
  • 三目並べ – 0.導入
  • テキスト処理
  • データベースへのデータロード
  • 機械学習概要1
  • 機械学習入門者向け Naive Bayes(単純ベイズ)アルゴリズムに触れてみる
  • ファイル管理
  • SSHを使用してホストOSからゲストOSに接続する
  • 機械学習入門者向け ChainerRLでブロック崩しの学習
  • 機械学習入門者向け ランダムフォレストによる Kaggle Titanic生存者予測
  • 機械学習概要2
  • データ分析基礎 – Part 2
  • 機械学習入門者向け 分類と回帰の違いをプログラムを書いて学ぼう
  • フロントエンドのWeb開発について
  • ダイナミックルーティング
  • 三目並べ – 1.ゲーム盤を作ろう
  • 【Python入門】Python Numpy チュートリアル
  • Amazon EC2 インスタンスの初期設定をしよう
  • AmazonEC2とVPCでネットワークとサーバーを構築しよう
  • Apache NiFi Exercise
  • Apache NiFi データパイプライン基礎
  • Apache NiFiの環境設定
  • Apache Spark 基礎
  • Apache SparkとApache Zeppelinの概要と環境構築
  • Apache Superset maptoolの使い方
  • Apache Superset 基礎
  • Apache Superset 概要と環境構築
  • Apache Zeppelin 基本機能
  • APIのデモンストレーション
  • Avinton Academy コンテンツガイド
  • AWS CLIをインストールしてコマンド操作しよう
  • AWS CLIを使ってEC2のファイルをS3へアップロードしよう
  • AWS Route 53を使って独自ドメインのWebページを表示させてみよう
  • AWSアカウントの作成と必ずやるべきセキュリティ対策
  • AWSのEC2インスタンスでWordPressブログを公開してみよう
  • AWS入門者向け 初心者が最初に理解すべきEC2とVPCの基本的な用語解説
  • CCNA
  • Certbotを使ってSSL証明書を発行し、HTTP通信を暗号化しよう
  • CISCO 1800ルータセットアップ
  • CSV import & export – Node.js, mySQL – 1
  • CSV import & export – Node.js, mySQL – 2
  • Docker Compose(Nginx + Flask + MySQL)演習
  • Docker Engineのubuntu上へのinstall
  • Docker 概要とセットアップ
  • Docker, Kubernetesの学び方について
  • Dockerコンテナイメージの最適化/ベストプラクティス
  • DockerとApacheを使ってWebサーバーを構築しよう
  • EC2からS3へ自動でぽいぽいアップロードするスクリプトの作成
  • ESP32-CAMのサンプルアプリケーションを実行する
  • 01 – Sparkfun Inventor’s Kit の準備
  • 02 – Sparkfun Inventor’s KitでLチカ
  • 03 ポテンショメータでLEDの点滅間隔をアナログ入力する
  • 04 フォトレジスタで明るさに反応するシステムをつくる
  • 05 LCDに文字列を表示する
  • 06 – BME280とLCDを組み合わせて温度計をつくる
  • ESP32とArduino IDE/PlatfromIOでHello Worldアプリケーションの実行
  • ESP32と超音波センサー HC-SR04 で物体の距離を計測する
  • ESXi – Switchの追加とVLAN
  • ESXi – VyOS
  • ESXi – 小規模ネットワーク 構築
  • Gitとは
  • VS CodeでGitHub Copilotを設定する
  • VSCode リモート開発環境
  • GNS3のセットアップ
  • Kubernetesクラスター上へのOpenVINOモデルサーバーを使用したサンプルアプリケーションのデプロイ
  • Linuxとは
  • NAT
  • NodeJSでWebアプリケーション開発 – React編
  • NodeJSでWebアプリケーション開発 – React編
  • NodeJSでWebアプリケーション開発 – React編
  • NodeJSでWebアプリケーション開発 – Socket.IO編
  • NVIDIA Cumulus VX + GNS3でBGPネットワークのシミュレーション
  • OpenCVのテストプログラム
  • PacketTracerのセットアップ
  • Pandasによる構造化データ分析
  • PCからルータ、スイッチへのSSH接続設定
  • PostGIS exercise
  • PostgreSQL – Python – Apache – Bootstrap
  • MySQLとMySQL Workbench のセットアップ
  • PostgreSQL Setup
  • PostgreSQL – インデックスを利用したパフォーマンス改善方法
  • PostgreSQL – パーティショニングを利用したパフォーマンス改善方法
  • PostgreSQLによるデータ分析
  • postgreSQLへのshp fileのimport
  • Python2.7とOpenCVのインストール
  • Python3.8 と OpenCV のインストール (Ubuntu20.04LTS)
  • Pythonでデータベースを操作する
  • Pythonで画像を分類するプログラムを作成する
  • Pythonによるマルチスレッドプログラミング実践
  • Raspberry Pi 4B のセットアップ
  • Raspberry PiとBME280を使用して温度と湿度、気圧を読み取る
  • REDIS
  • Redux基礎 – 主要な概念と用語
  • Ruby on Rails を MySQLでセットアップ
  • Ruby on Railsによる簡単なウェブアプリケーション
  • SampleアプリケーションのKubernetes上へのデプロイ
  • Scala 基礎
  • scikit-learnとは
  • Spark SQL エクササイズ
  • SparkMLによるKaggle Titanic生存者予測
  • KNIME, AutoMLライブラリによる住宅価格予測
  • SparkMLによる住宅価格予測
  • SQL 便利な関数
  • Ubuntuの基本設定
  • uhubctlでUSBデバイスのオンオフをコントロール
  • Terraform入門 2 – Terraformのstate管理
  • Terraform入門 1 – TerraformでAWS上にEC2インスタンスを作成する
  • Virtualisation and Container (仮想化とコンテナ) – Ansible, Docker and Kubernetes
  • viエディタ
  • VLAN
  • VMware ESXi サーバー構築
  • Webアプリ開発に欠かせないGoogle Chrome DevToolsの基本
  • Windows Server 2012 R2 Hyper-V
  • YOLOv5を用いた物体検出
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の充実した技術研修でスキルアップを図り、あなたのキャリア目標を一緒に達成しませんか?

採用情報

採用情報

採用情報

Categories

  • 相互学習
  • 採用
  • 社員インタビュー
  • 学習&資格取得
  • 技術解説
  • イベント告知
  • 学内説明会&講義
  • 産学連携
  • 就職活動
  • イベントレポート
  • その他
  • 技術ブログ&インタビュー
  • mainpage
  • New Graduates Interviews
  • 中途エンジニア
  • カテゴリーなし
  • ニュースリリース&イベント

Avinton SDGs

SDGsへの貢献

Search

タグ

AI AvintonAcademy Avintonデータプラットフォーム EdgeTech+2022 IFAC2023 Kubernetes Linux Meetup Pandas PM&PMO PyTorch SDGs SF思考 VUCA アカウントマネージャー インタビュー インタビュー記事 エッジAIカメラ エンジニア運動会 キャリアアップ クラスタリング データサイエンス データ可視化 ビジネスメンター フロントエンド ヘルプデスク ボランティア ローカルイベント 人流データ 効率性を高める 国際自動制御連盟 地元応援 地域コミュニティ 基本情報技術者 天野禎章 小島秀藏 展示会 工場 新卒、キャリア 産学連携 産官学連携 社内イベント 社内レポート 社員インタビュー 転職
© 2023 Avinton | All Rights Reserved | プライバシーポリシー
  • サービス
    • Avinton Data Platform
    • エッジAIカメラ
      • 自動車ナンバープレート自動認識システム
    • プライベートクラウド
    • AIサービス開発
    • AIカメラ/画像解析無料体験版
  • 最新情報
    • ニュースリリース&イベント情報
    • 技術ブログ&インタビュー
  • アカデミー
    • Avintonアカデミー
    • Academy on Campus
    • Academy with Platform
  • 採用情報
    • Avintonジャパン 採用ページ
    • 求人一覧
    • よくある質問
    • 新卒採用
  • 企業情報
    • 会社概要
    • 代表からご挨拶
    • SDGsへの貢献
  • お問い合わせ
  • 日本語
    • English (英語)
Avinton Japan