R

ナイーブベイズとは?概要とRでの実装!

ウマたん
ウマたん
本記事では、ベイズ推定を用いた機械学習手法であるナイーブベイズについてまとめていきます!ナイーブベイズの仕組みや応用場面を見ていったあと、ナイーブベイズと他の機械学習手法をRで実装して精度を比較していきますよー!

こんにちは!

データサイエンティストのウマたん(@statistics1012)です!

この記事では、機械学習手法の中でも比較的単純なアルゴリズムで高い効果が見込める「ナイーブベイズ」について見ていきましょう!

ナイーブベイズはベイズ統計学の概念を用いており、様々な分野へ応用されています。

ベイズ統計学を研究している人を巷ではベイジアンと呼ぶのですが、僕自身大学院時代はベイジアンでした。

ウマたん
ウマたん
ナイーブベイズは非常に簡単に実装可能で使いやすい機械学習手法!

ナイーブベイズとは?

ナイーブベイズはベイズの定理に基づいた機械学習手法です。

ベイズの定理はベイズ統計学の基本中の基本。大事な式なので覚えておきましょう。

\begin{eqnarray*}
p(A|B)&=&\frac{p(B|A)p(A)}{p(B)}
\end{eqnarray*}

これは以下の条件付き確率と同時確率の関係から導出できます。

\begin{eqnarray*}
p(A,B)=p(B|A)p(A)=p(A|B)p(B)
\end{eqnarray*}

この関係式を変形するとベイズの定理が導出されることが分かるでしょう。

ベイズの定理では基本的に確率を元に考えていました。

しかし、ベイズの枠組みはそれだけではおさまりません。

ベイズ推定ではベイズの定理における確率を確率分布へと拡張させ考えていきます。

ベイズ推定に関しては事前分布と事後分布、そして尤度という考え方が非常に重要です。

事前分布は前から持っている情報。

尤度は手に入れた情報。

事後分布は前情報と手に入れた情報を合わせた情報というイメージを持っていれば良いでしょう。

\begin{eqnarray*}
p(A|B){\propto}p(B|A)p(A)
=事後分布{\propto}尤度×事前分布
\end{eqnarray*}

ベイズ推定を用いた判別手法が「ナイーブベイズ」です。

実はベイズ推定の理論自体は古くからあったのですが、伝統的な統計学との対立とマシーンパワーの問題で現代まで流行りませんでした。

ベイズ統計学に関しては以下の記事をご覧ください!

ベイズ統計学当サイト【統計ラボ】の本記事では、伝統的な統計学とは対立した立場を取るベイズ統計学についてまとめていきます。今注目されているベイズ統計学の基本的な部分をしっかりおさえておくことが重要です。...

ナイーブベイズが応用される場面

ナイーブベイズが用いられる場面として最も有名なのはスパムメールの判別ですね。

スパムメールの判別では、文章に含まれる単語に対して迷惑メールである確率を算出しベイズ推定を使って迷惑メールであるか否かを推定します。

\begin{eqnarray*}
p(迷惑メール|ダウンロード)&=&\frac{p(ダウンロード|迷惑メール)p(迷惑メール)}{p(ダウンロード)}
\end{eqnarray*}

ダウンロードというメールが入っていた場合に迷惑メールであるか判別するためには、「迷惑メールの中にダウンロードが入っている確率」と「迷惑メールの確率」と「メールにダウンロードが入っている確率」が分かれば算出することが可能です。

これらを手元の教師データから判別していくのがナイーブベイズによるスパムメールの判別アルゴリズムになります。

なんとなくイメージが湧きましたでしょうか?

ナイーブベイズをRで実装してみる

それではナイーブベイズを実際にRで実装してみます。

実装と言ってもパッケージを使ってしまうので非常に簡易的な実装になります。

有名なタイタニックのデータを用います。Kaggleの公式サイトからデータをダウンロードできます。

まず、データのクレンジングを行い、欠損値は削除、不要と考えられる項目は削除しました。

項目8つ

Survived:生死 pclass:客室のクラス sex:性別 age:年齢 sibsp:兄弟・配偶者の数 parch:親・子供の数 fare:乗船料金 embarked:乗船した港

サンプル数714

この時、生死を目的変数としそれ以外を説明変数とします。

サンプル数714のうちランダムに400個のデータを取り出し学習データとし、残りの314を予測データとします。

学習データで予測モデルを作り、予測データにあてはめ真値と予測値の判別率を精度として比較します。

シミュレーション回数は10回とし、上記の手順を10回繰り返し、結果を平均したものを最終アウトプットとします。シミュレーション回数をもっと増やせば精度の信頼性は上がります。

Bayes(ナイーブベイズ)をSVM(サポートベクターマシン)RF(ランダムフォレスト)NN(ニューラルネットワーク)xgb(XGboost)knn(k近傍法)の5手法と比較します!

基本的に引数は全部デフォルトで!果たして結果はどうなるでしょうか!

e1071というパッケージに入っているnaiveBayesという関数を用いて解析を行っていきます。

##ナイーブベイズ##
nb<-naiveBayes(Survived~.,train.data)
test.data.nb<-cbind(test.data,”predict”=predict(nb,test.data))
result[i,3]<-sum(test.data.nb$predict==test.data.nb$Survived)/nrow(test.data.nb)

データ加工は描画でいくつかコードを書いていますが、実際にナイーブベイズを行っているのはこの数行!

Survived~.はSurvivedを目的変数としてそれ以外を説明変数にするよーということです。

結果は以下のようになりました!

それぞれBayes(ナイーブベイズ)、knn(k近傍法)、NN(ニューラルネットワーク)、RF(ランダムフォレスト)、SVM(サポートベクターマシン)、xgb(XGboost)と表示しています。

やはりランダムフォレスト・SVM・XGboostあたりが強いですね!

今回はパラメータをいじらずデフォルト設定で行ったためグリッドサーチなどでチューニングを行えば、もっと良い精度が出るでしょう。

他の手法についても是非見てみてください!

ナイーブベイズ まとめ

ナイーブベイズは、アルゴリズム自体が単純でRやPythonでも簡単に実装できる優秀な手法です。

ナイーブベイズのポイントについて最後に簡単にまとめておきましょう!

・ベイズ統計学の理論を基にした手法である
・スパムメール判別に良く用いられる
・RやPythonでの実装が非常に簡単である

ベイズの識別規則について深く学びたい方は以下の書籍がオススメです!

created by Rinker
¥3,300
(2020/06/01 22:34:46時点 Amazon調べ-詳細)

機械学習についてもっと詳しく知りたい方はぜひ以下の記事で見てみてください!

機械学習入門に必要な知識と独学勉強方法をPythonとRの実装と一緒に見ていこう!当サイト【統計ラボ】の本記事では、入門者向けに機械学習についてカンタンにまとめていきます。最終的にはどのように機械学習を学んでいけばよいかも見ていきます。細かい手法の実装もPython/Rを用いておこなっていくので適宜参考にしてみてください。...
Pythonを初学者が最短で習得する勉強法

Pythonを使うと様々なことができます。しかしどんなことをやりたいかという明確な目的がないと勉強は捗りません。

Pythonを習得するためのロードマップをまとめましたのでぜひチェックしてみてくださいね!