科学の箱

科学・IT・登山の話題

機械学習

irisをナイーブベイズで分類

投稿日:

ナイーブベイズの概要

ナイーブベイズは教師ありの分類アルゴリズムの一つである。

計算アルゴリズムとしてはベイズ定理を用いている。

機械学習における特徴としてはいかがある

  • 実装が簡単であり、複雑なハイパーパラメータの調整は必要ない
  • 大規模なトレーニングデータを必要としない
  • 処理が高速であり、利用するコンピュータ資源が少ない
  • 大きなデータセットについても有効である(3による)
  • 取り急ぎのベンチマークとして利用できる(1, 2, 3による)

分類問題

ナイーブベイズが得意とするのは分類問題である。分類問題とは与えられたデータをあるルールによって定義されたカテゴリに分類することである。

分類問題のもっとも簡単な例として2値分類である。これはYes-No、プラス-マイナスなど2項に分類する。

分類問題の例として最も知られているのが受け取ったメールがスパムメールであるのか普通のメールであるかの分類である。また商品に関するアンケートを取って、それが商品に対してプラスのイメージかマイナスのイメージを持つか判断するのも分類問題である。

似た概念としてクラスタリングがある。しかし機械学習では分類問題とクラスタリングは異なる。

分類問題ではモデル作成者が正解のラベルを指定する。それに対して、クラスタリングでは機械学習のプロセスを通して各データの分類ラベルを生成する。

分類問題と単回帰分析の関係

機械学習で最も簡単なアルゴリズムである単回帰分析は分類問題に使えるのだろうか。これは機械学習の初心者にとっても少々わかりにく概念である。

単回帰分析は目的変数は連続値となる。そのために得られる値は理論的には-∞ < y < ∞である。それに対して分類問題の場合もっとも単純な2値分類であれば目的変数は2値である。今簡単に0と1とする。その場合には単回帰分析の結果を0もしくは1にマッピングしなければならない。

しかしそもそも0と1には数字的な関係(大小、計算)はないので、これをマッピングすることはできない。

よって単回帰分析は分類問題に適用することはできず、別のアルゴリズムを考える必要がある。分類に関しては様々なアルゴリズムがあり、この中でもっとも簡単で分かりやすい

ナイーブベイズモデル

モデルの構築

# iris データの読み込み
from sklearn.datasets import load_iris 
iris = load_iris()
print(iris.target_names)
# ['setosa' 'versicolor' 'virginica']

sklearn.datasetsはdataに説明変数、targetに目的変数が入っている。これを使ってトレーニングデータと検証データを作成する。

X_iris = iris.data
y_iris = iris.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_iris, y_iris,random_state=1)

 

今回はナイーブベイズで分類する。

sklearn.naive_bayes.GaussianNB — scikit-learn 0.21.3 …

こちらを見るとわかるがハイパーパラメータがない。つまりデータをナイーブベイズ分類器に放り込めばよい。

モデルからの推定値はpredictにより取得できる。

from sklearn.naive_bayes import GaussianNB
model = GaussianNB() 
model.fit(X_train, y_train) 
y_model = model.predict(X_test)

 

検証

検証する。結果として97%の高い正解率が算出された。

from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_model)
# 0.9736842105263158

どこでずれが生じているかを知るために混同行列を生成する。

混同行列はconfusion_matrix()を利用する。

sklearn.metrics.confusion_matrix — scikit-learn 0.21.3 …

第一パラメータに正解ラベルを、第二パラメータにモデルから得られたラベルを与える。

 

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_model)
print(cm)

#
[[13  0  0]
 [ 0 15  1]
 [ 0  0  9]]

さらにconfusion_matrixを可視化する。可視化のためにはseaborn.heatmapを利用する。

seaborn.heatmap — seaborn 0.9.0 documentation

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

plt.figure(figsize = (6,4))
sns.heatmap(cm, annot=True,xticklabels=iris.target_names, yticklabels=iris.target_names )
plt.show()

 

メタ情報

inarticle



メタ情報

inarticle



-機械学習
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

research pipeline

Related posts:独立性の検定 2つウェブ分析をハンズオンで学ぶSVMでグリッドサーチ

no image

前向き研究と後ろ向き研究

前向き研究と後ろ向き研究は疫学における用語である。 前向き研究で使われる研究手法にはコホートや無作為比較対照研究、ロジスティック分析がある。これらの研究ではサンプルをリスクファクター(危険要因)のある …

no image

数値項目の分析テンプレート

数値フィールド1 数値フィールド1 rate – 1 rate – 2 データ型 算術平均 中央値 分散 トップ3 ボトム3 足切 時系列分析 層別候補 ヒストグラム カウント …

no image

ラテン方格

ラテン方格は1~nまでの数字についてn x nの正方行列に一回だけ現れるように並べたものである。ラテン方格を利用して実験の割り付けを行う実験計画法がラテン方格法である。 ラテン方格法と似た実験計画法に …

no image

R Dataset – AirPassengers

データの説明 1949~1960年における月別飛行機搭乗者数 フォーマット このデータは時系列データであることがわかる。 > str(AirPassengers)  Time-Series [1 …

2019年10月
« 9月   11月 »
 123456
78910111213
14151617181920
21222324252627
28293031  

side bar top



アーカイブ

カテゴリー