ナイーブ ベイズ分類器を使用して、現実世界の機械学習の問題を解決します。
ナイーブベイズこれは、多くの分類器モデリング アルゴリズムの基礎となる分類手法です。ナイーブベイズベースの分類器は、シンプルで高速かつ使いやすい機械学習技術の 1 つであり、実際のアプリケーションで効果的です。 ナイーブベイズはベイズの定理発展した。ベイズの定理は、18 世紀の統計学者トーマス・ベイズによって提唱され、ある出来事に関連する他の条件に基づいて、その出来事が発生する確率を計算します。たとえば、パーキンソン病の患者は声に変化がみられることが多いため、声の変化はパーキンソン病を予測する症状の 1 つです。ベイズの定理は、対象イベントの確率を計算する方法を提供し、ナイーブベイズはこの方法を一般化および簡略化したものです。 この記事では、Naive Bayes 分類器が実際の問題を解決する能力 (完全な商用グレードのアプリケーションとは対照的) を示します。ここでは、機械学習の基礎知識があることを前提としているので、機械学習の予測にあまり関係のない手順は省略します。データの中断そしてデータスライス。機械学習を初めて学ぶ方や、復習が必要な方は、「今日の機械学習入門」と「オープンソース機械学習入門」をご覧ください。 ナイーブベイズ分類器は監督付き、属する生成モデル非線形、に属するパラメトリックモデルの確率ベース。 この記事では、ナイーブベイズを使用してパーキンソン病を予測する方法を説明します。必要なデータセットは、UCI 機械学習リポジトリから取得されます。このデータセットには、パーキンソン病の可能性を計算するために使用される音声信号に関する多くのメトリックが含まれています。この例では、これらのメトリックの最初の 8 つを使用します。 - MDVP:Fo(Hz) : 平均音声基本周波数
- MDVP:Fhi(Hz) :最高音声基本周波数
- MDVP:Flo(Hz) : 最小音声基本周波数
- MDVP:ジッター(%) 、 MDVP:ジッター(Abs) 、 MDVP:RAP 、 MDVP:PPQ 、ジッター:DDP :声帯基本周波数の変化を測定する5つの指標
この例で使用されているデータセットは、私の GitHub リポジトリにあります。データセットは事前にシャッフルされ、スライスされています。 次に、Python を使用してこの問題を解決します。私が使用しているソフトウェアは次のとおりです。 - Python 3.8.2
- パンダ 1.1.1
- scikit-learn 0.22.2.post1
Python には、次のような Naive Bayes 分類器のオープン ソース実装がいくつかあります。 - NLTK Naïve Bayes : テキスト分類のための標準的なNaïve Bayesアルゴリズムに基づく
- NLTK ポジティブ ナイーブ ベイズ: 部分的にラベル付けされたトレーニング セットのバイナリ分類のための NLTK ナイーブ ベイズの変種
- Scikit-learn Gaussian Naïve Bayes : データ ストリームまたは非常に大きなデータセットをサポートするための部分的なフィッティング メソッドを提供します (LCTT 変換注: 一度にメモリにロードできない場合があり、部分的なフィッティングによってデータが動的に増加する可能性があります)
- Scikit-learn 多項式ナイーブベイズ: 離散的特徴、インスタンス数、頻度などに最適化されています。
- Scikit-learn ベルヌーイ ナイーブ ベイズ: 各特徴がバイナリ変数/ブール特徴である場合
この例では、sklearn Gaussian Naive Bayes を使用します。 私の Python 実装はnaive_bayes_parkinsons.py にあり、次のようになります。 -
import pandas as pd -
# x_rows是我们所使用的 8 个特征的列名 x_rows =[ 'MDVP:Fo(Hz)' , 'MDVP:Fhi(Hz)' , 'MDVP:Flo(Hz)' , 'MDVP:Jitter(%)' , 'MDVP:Jitter(Abs)' , 'MDVP:RAP' , 'MDVP:PPQ' , 'Jitter:DDP' ] -
y_rows =[ 'status' ] # y_rows是类别的列名,若患病,值为 1 ,若不患病,值为 0 -
# 训练 # 读取训练数据 train_data = pd . read_csv ( 'parkinsons/Data_Parkinsons_TRAIN.csv' ) -
train_x = train_data [ x_rows ] -
train_y = train_data [ y_rows ] -
print ( "train_x:\n" , train_x ) -
print ( "train_y:\n" , train_y ) -
# 导入 sklearn Gaussian Naive Bayes ,然后进行对训练数据进行拟合 from sklearn . naive_bayes import GaussianNB -
gnb = GaussianNB () -
gnb . fit ( train_x , train_y ) -
# 对训练数据进行预测 predict_train = gnb . predict ( train_x ) -
print ( 'Prediction on train data:' , predict_train ) -
# 在训练数据上的准确率 from sklearn . metrics import accuracy_score -
accuracy_train = accuracy_score ( train_y , predict_train ) -
print ( 'Accuray score on train data:' , accuracy_train ) -
# 测试 # 读取测试数据 test_data = pd . read_csv ( 'parkinsons/Data_Parkinsons_TEST.csv' ) -
test_x = test_data [ x_rows ] -
test_y = test_data [ y_rows ] -
# 对测试数据进行预测 predict_test = gnb . predict ( test_x ) -
print ( 'Prediction on test data:' , predict_test ) -
# 在测试数据上的准确率 accuracy_test = accuracy_score ( test_y , predict_test ) -
print ( 'Accuray score on test data:' , accuracy_train )
次の Python スクリプトを実行します。 -
$ python naive_bayes_parkinsons . py -
train_x : MDVP : Fo ( Hz ) MDVP : Fhi ( Hz ) ... MDVP : RAP MDVP : PPQ Jitter : DDP -
0 152.125 161.469 ... 0.00191 0.00226 0.00574 -
1 120.080 139.710 ... 0.00180 0.00220 0.00540 -
2 122.400 148.650 ... 0.00465 0.00696 0.01394 -
3 237.323 243.709 ... 0.00173 0.00159 0.00519 -
.. ... ... ... ... ... ... -
155 138.190 203.522 ... 0.00406 0.00398 0.01218 -
[ 156 rows x 8 columns ] -
train_y : status -
0 1 -
1 1 -
2 1 -
3 0 -
.. ... -
155 1 -
[ 156 rows x 1 columns ] -
Prediction on train data : [ 1 1 1 0 ... 1 ] -
Accuracy score on train data : 0.6666666666666666 -
Prediction on test data : [ 1 1 1 1 ... 1 -
1 1 ] -
Accuracy score on test data : 0.6666666666666666
トレーニング セットとテスト セットの両方の精度は 67% です。パフォーマンスをさらに最適化できます。試してみますか?下記のコメント欄にあなたの方法を記入してください。 ナイーブベイズ分類器はベイズの定理から開発されました。ベイズの定理は、条件付き確率、つまり、あるイベントに関連する他のイベントが発生したときにそのイベントが発生する確率を計算するために使用されます。つまり、イベント y の前にイベント x が発生する確率がすでにわかっている場合、イベント x が再び発生したときにイベント y が発生する確率はどれくらいかという問題を解決します。ベイズの定理は、事前予測値を使用して、最終的な事後確率を徐々に近似します。ベイズの定理には、すべてのパラメータが同等に重要である(LCTT 翻訳注: つまり、互いに独立している)という基本的な仮定があります。 ベイズ計算には主に次の手順が含まれます。 - 総事前確率を計算します。
P(病気) P (病気)とP(病気でない) P (病気でない) - 8つの指標のそれぞれが特定の値である場合の事後確率を計算します(value1、...、value8はそれぞれMDVP:Fo(Hz)、...、Jitter:DDPの値です)。
P(値1,\ ldots ,値8 \ | \ diseased ) P (値1 , … ,値8 ∣ 病気) P(値1,\ldots ,値8 \ | \病気ではない) P (値1 , … ,値8 ∣ 病気ではない - ステップ 1 とステップ 2 の結果を掛け合わせると、病気になる場合と病気にならない場合の事後確率が得られます。
P(病気\ |\ value1,\ldots,value8) \propto P(病気) \times P(value1,\ldots,value8\ |\ 病気) P (病気 ∣ 値1 、 … 、値8 ) ∝P (病気) × P (値1 、 … 、値8 ∣ 病気) P(病気ではない\ |\ value1,\ldots,value8) \propto P(病気ではない) \times P(value1,\ldots,value8\ |\ 病気ではない) P (病気ではない ∣ 値1 、 … 、値8 ) ∝ P (病気ではない) × P (値1 、 … 、値8 ∣ 病気ではない
上記のステップ 2 の計算は非常に複雑ですが、Naive Bayes によって次のように簡略化されます。 - 総事前確率を計算します。
P(病気) P (病気)とP(病気でない) P (病気でない) - 8 つの指標それぞれについて、特定の値を取る場合の事後確率を計算します。
P(値1\ |\ 病気),\ldots,P(値8\ | \病気) P (値1 ∣ 疾患) , … , P (値8 ∣ 病気) P(値1\ |\ 病気ではない),\ldots,P(値8\ | \病気ではない) P (値1 ∣ 病気ではない) 、 … 、 P (値8 ∣ 病気ではない - ステップ 1 とステップ 2 の結果を掛け合わせると、病気になる場合と病気にならない場合の事後確率が得られます。
P(病気\ |\ value1,\ldots,value8) \propto P(病気) \times P(value1\ |\ 病気) \times \ldots \times P(value8\ |\ 病気) P (病気 ∣ 値1 、 … 、値8 ) ∝P (病気) × P (値1 ∣ 病気) × … × P (値8 ∣ 病気) P(病気ではない\ |\ value1,\ldots,value8) \propto P(病気ではない) \times P(value1\ |\ 病気ではない) \times \ldots \times P(value8\ |\ 病気ではない) P (病気ではない ∣ 値1 、 … 、値8 ) ∝P (病気ではない) × P (値1 ∣ 病気ではない) × … × P (値8 ∣ 病気ではない
これはあくまでも予備的な説明です。データ型の違い、スパース データ、欠損値がある可能性のあるデータなど、考慮すべき要素は他にもたくさんあります。 単純かつ直接的なアルゴリズムである Naive Bayes では、ハイパーパラメータは必要ありません。ただし、Naive Bayes の一部のバージョンでは、高度な機能 (ハイパーパラメータなど) が提供される場合があります。たとえば、GaussianNB には 2 つのハイパーパラメータがあります。 - 事前確率: アルゴリズムがデータから計算する必要がないように、事前に指定できる事前確率。
- var_smoothing : データの分布を考慮します。このハイパーパラメータは、データが標準のガウス分布を満たさない場合に作用します。
簡単にするために、Naive Bayes では 0-1 損失関数を使用します。予測が目的の出力と一致する場合、損失値は 0 になります。それ以外の場合は 1 になります。 利点: ナイーブベイズは最もシンプルで高速なアルゴリズムの 1 つです。 利点: データ量が少ない場合でも、ナイーブベイズは信頼性の高い予測を行うことができます。 デメリット: ナイーブベイズの予測はあくまでも推定値であり、正確ではありません。正確さよりもスピードで勝ちます。 デメリット: ナイーブベイズでは、すべての特徴が互いに独立しているという基本的な仮定がありますが、現実には必ずしもそうとは限りません。 本質的に、ナイーブベイズはベイズの定理の一般化です。これは最もシンプルで高速な機械学習アルゴリズムの 1 つであり、シンプルで高速なトレーニングと予測に使用されます。ナイーブベイズは、十分に正確で適度な予測を提供します。ナイーブベイズでは、予測される特徴は互いに独立していると想定します。ナイーブベイズのオープンソース実装はすでに数多く存在し、その機能はベイズアルゴリズムの実装を上回っています。 |