Python で機械学習を簡単に

Python で機械学習を簡単に

ナイーブ ベイズ分類器を使用して、現実世界の機械学習の問題を解決します。

ナイーブベイズナイーブベイズこれは、多くの分類器モデリング アルゴリズムの基礎となる分類手法です。ナイーブベイズベースの分類器は、シンプルで高速かつ使いやすい機械学習技術の 1 つであり、実際のアプリケーションで効果的です。

ナイーブベイズはベイズの定理ベイズの定理発展した。ベイズの定理は、18 世紀の統計学者トーマス・ベイズによって提唱され、ある出来事に関連する他の条件に基づいて、その出来事が発生する確率を計算します。たとえば、パーキンソン病の患者は声に変化がみられることが多いため、声の変化はパーキンソン病を予測する症状の 1 つです。ベイズの定理は、対象イベントの確率を計算する方法を提供し、ナイーブベイズはこの方法を一般化および簡略化したものです。

現実世界の問題を解決する

この記事では、Naive Bayes 分類器が実際の問題を解決する能力 (完全な商用グレードのアプリケーションとは対照的) を示します。ここでは、機械学習の基礎知識があることを前提としているので、機械学習の予測にあまり関係のない手順は省略します。データの中断日付のシャッフルそしてデータスライスデータ分割。機械学習を初めて学ぶ方や、復習が必要な方は、「今日の機械学習入門」と「オープンソース機械学習入門」をご覧ください。

ナイーブベイズ分類器は監督付き監督された、属する生成モデル生成的な非線形、に属するパラメトリックモデルパラメトリック確率ベース確率的

この記事では、ナイーブベイズを使用してパーキンソン病を予測する方法を説明します。必要なデータセットは、UCI 機械学習リポジトリから取得されます。このデータセットには、パーキンソン病の可能性を計算するために使用される音声信号に関する多くのメトリックが含まれています。この例では、これらのメトリックの最初の 8 つを使用します。

  • MDVP:Fo(Hz) : 平均音声基本周波数
  • MDVP:Fhi(Hz) :最高音声基本周波数
  • MDVP:Flo(Hz) : 最小音声基本周波数
  • MDVP:ジッター(%)MDVP:ジッター(Abs)MDVP:RAPMDVP:PPQジッター:DDP :声帯基本周波数の変化を測定する5つの指標

この例で使用されているデータセットは、私の GitHub リポジトリにあります。データセットは事前にシャッフルされ、スライスされています。

Python による機械学習

次に、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にあり、次のようになります。

  1. import pandas as pd
  2. # x_rows是我们所使用的 8 个特征的列名
  3. x_rows =[ 'MDVP:Fo(Hz)' , 'MDVP:Fhi(Hz)' , 'MDVP:Flo(Hz)' ,
  4. 'MDVP:Jitter(%)' , 'MDVP:Jitter(Abs)' , 'MDVP:RAP' , 'MDVP:PPQ' , 'Jitter:DDP' ]
  5. y_rows =[ 'status' ] # y_rows是类别的列名,若患病,值为 1 ,若不患病,值为 0
  6. # 训练
  7. # 读取训练数据
  8. train_data = pd . read_csv ( 'parkinsons/Data_Parkinsons_TRAIN.csv' )
  9. train_x = train_data [ x_rows ]
  10. train_y = train_data [ y_rows ]
  11. print ( "train_x:\n" , train_x )
  12. print ( "train_y:\n" , train_y )
  13. # 导入 sklearn Gaussian Naive Bayes ,然后进行对训练数据进行拟合
  14. from sklearn . naive_bayes import GaussianNB
  15. gnb = GaussianNB ()
  16. gnb . fit ( train_x , train_y )
  17. # 对训练数据进行预测
  18. predict_train = gnb . predict ( train_x )
  19. print ( 'Prediction on train data:' , predict_train )
  20. # 在训练数据上的准确率
  21. from sklearn . metrics import accuracy_score
  22. accuracy_train = accuracy_score ( train_y , predict_train )
  23. print ( 'Accuray score on train data:' , accuracy_train )
  24. # 测试
  25. # 读取测试数据
  26. test_data = pd . read_csv ( 'parkinsons/Data_Parkinsons_TEST.csv' )
  27. test_x = test_data [ x_rows ]
  28. test_y = test_data [ y_rows ]
  29. # 对测试数据进行预测
  30. predict_test = gnb . predict ( test_x )
  31. print ( 'Prediction on test data:' , predict_test )
  32. # 在测试数据上的准确率
  33. accuracy_test = accuracy_score ( test_y , predict_test )
  34. print ( 'Accuray score on test data:' , accuracy_train )

次の Python スクリプトを実行します。

  1. $ python naive_bayes_parkinsons . py
  2. train_x :
  3. MDVP : Fo ( Hz ) MDVP : Fhi ( Hz ) ... MDVP : RAP MDVP : PPQ Jitter : DDP
  4. 0         152.125       161.469   ...   0.00191   0.00226     0.00574
  5. 1         120.080       139.710   ...   0.00180   0.00220     0.00540
  6. 2         122.400       148.650   ...   0.00465   0.00696     0.01394
  7. 3         237.323       243.709   ...   0.00173   0.00159     0.00519
  8. ..           ...           ...           ...   ...       ...       ...        
  9. 155       138.190       203.522   ...   0.00406   0.00398     0.01218
  10. [ 156 rows x 8 columns ]
  11. train_y :
  12. status
  13. 0         1
  14. 1         1
  15. 2         1
  16. 3         0
  17. ..       ...
  18. 155       1
  19. [ 156 rows x 1 columns ]
  20. Prediction on train data : [ 1 1 1 0 ... 1 ]
  21. Accuracy score on train data : 0.6666666666666666
  22. Prediction on test data : [ 1 1 1 1 ... 1
  23.   1 1 ]
  24. Accuracy score on test data : 0.6666666666666666

トレーニング セットとテスト セットの両方の精度は 67% です。パフォーマンスをさらに最適化できます。試してみますか?下記のコメント欄にあなたの方法を記入してください。

その背後にある原理

ナイーブベイズ分類器はベイズの定理から開発されました。ベイズの定理は、条件付き確率、つまり、あるイベントに関連する他のイベントが発生したときにそのイベントが発生する確率を計算するために使用されます。つまり、イベント y の前にイベント x が発生する確率がすでにわかっている場合、イベント x が再び発生したときにイベント y が発生する確率はどれくらいかという問題を解決します。ベイズの定理は、事前予測値を使用して、最終的な事後確率を徐々に近似します。ベイズの定理には、すべてのパラメータが同等に重要である(LCTT 翻訳注: つまり、互いに独立している)という基本的な仮定があります。

ベイズ計算には主に次の手順が含まれます。

  1. 総事前確率を計算します。
    P(病気) P(病気でない)
  2. 8つの指標のそれぞれが特定の値である場合の事後確率を計算します(value1、...、value8はそれぞれMDVP:Fo(Hz)、...、Jitter:DDPの値です)。
    P(値1,\
    P(値1,\ldots
  3. ステップ 1 とステップ 2 の結果を掛け合わせると、病気になる場合と病気にならない場合の事後確率が得られます。
    P(病気\ |\ value1,\ldots,value8) \propto P(病気) \times P(value1,\ldots,value8\ |\ 病気)
    P(病気ではない\ |\ value1,\ldots,value8) \propto P(病気ではない) \times P(value1,\ldots,value8\ |\ 病気ではない)

上記のステップ 2 の計算は非常に複雑ですが、Naive Bayes によって次のように簡略化されます。

  1. 総事前確率を計算します。
    P(病気) P(病気でない)
  2. 8 つの指標それぞれについて、特定の値を取る場合の事後確率を計算します。
    P(値1\ |\ 病気),\ldots,P(値8\
    P(値1\ |\ 病気ではない),\ldots,P(値8\ |
  3. ステップ 1 とステップ 2 の結果を掛け合わせると、病気になる場合と病気にならない場合の事後確率が得られます。
    P(病気\ |\ value1,\ldots,value8) \propto P(病気) \times P(value1\ |\ 病気) \times \ldots \times P(value8\ |\ 病気)
    P(病気ではない\ |\ value1,\ldots,value8) \propto P(病気ではない) \times P(value1\ |\ 病気ではない) \times \ldots \times P(value8\ |\ 病気ではない)

これはあくまでも予備的な説明です。データ型の違い、スパース データ、欠損値がある可能性のあるデータなど、考慮すべき要素は他にもたくさんあります。

ハイパーパラメータ

単純かつ直接的なアルゴリズムである Naive Bayes では、ハイパーパラメータは必要ありません。ただし、Naive Bayes の一部のバージョンでは、高度な機能 (ハイパーパラメータなど) が提供される場合があります。たとえば、GaussianNB には 2 つのハイパーパラメータがあります。

  • 事前確率: アルゴリズムがデータから計算する必要がないように、事前に指定できる事前確率。
  • var_smoothing : データの分布を考慮します。このハイパーパラメータは、データが標準のガウス分布を満たさない場合に作用します。

損失関数

簡単にするために、Naive Bayes では 0-1 損失関数を使用します。予測が目的の出力と一致する場合、損失値は 0 になります。それ以外の場合は 1 になります。

長所と短所

利点: ナイーブベイズは最もシンプルで高速なアルゴリズムの 1 つです。
利点: データ量が少ない場合でも、ナイーブベイズは信頼性の高い予測を行うことができます。
デメリット: ナイーブベイズの予測はあくまでも推定値であり、正確ではありません。正確さよりもスピードで勝ちます。
デメリット: ナイーブベイズでは、すべての特徴が互いに独立しているという基本的な仮定がありますが、現実には必ずしもそうとは限りません。

本質的に、ナイーブベイズはベイズの定理の一般化です。これは最もシンプルで高速な機械学習アルゴリズムの 1 つであり、シンプルで高速なトレーニングと予測に使用されます。ナイーブベイズは、十分に正確で適度な予測を提供します。ナイーブベイズでは、予測される特徴は互いに独立していると想定します。ナイーブベイズのオープンソース実装はすでに数多く存在し、その機能はベイズアルゴリズムの実装を上回っています。

<<:  エッジ AI ソフトウェア市場は 2030 年までに大幅に成長する見込み

>>:  再帰アルゴリズムの時間計算量について十分に理解していない

ブログ    
ブログ    
ブログ    

推薦する

人工知能デジタル技術の強化は現実予測において徐々にその力を発揮しつつある

現在、人工知能は人々の生活の中でますます普及しており、生活のあらゆるところで人工知能を見つけることが...

AI時代ではモデルは大きいほど良い

今年も4分の3が過ぎた。テクノロジー業界から見れば、「室温超伝導」が実現可能であることが公式に証明さ...

人材に余裕がないわけではありませんが、AI 検査の方がコスト効率が良いのです。

著者 | Tu Chengyeレビュー | Chonglou石炭、電力、化学などの多くの産業では、安...

新薬研究開発の方向性は?人工知能はどのように発展するのでしょうか?トップ科学者の意見

昨日は第4回世界トップ科学者フォーラムの2日目でした。世界トップの科学者たちがオンラインとオフライン...

データに飽きた?人工知能は良い選択です

今日のデジタル マーケティング担当者にとっての課題は、共感を得るためにすべてのプラットフォームでブラ...

医療における AI 導入の 5 つの障壁

人間の想像力を幅広い臨床応用に活用するとなると、医療用人工知能の道のりはまだまだ長い。 [[2761...

...

ニューラルネットワークの詳細な説明、順方向伝播と逆方向伝播

主にロジスティック回帰について説明します。ロジスティック回帰には多くの基本概念が含まれており、ニュー...

AIによって非効率と判断され、150人の労働者が解雇された。「労働者をコントロールできるのはまさに人工知能だ」

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

コードコーパス、大規模モデル、インテリジェントエージェントの魔法の杖を振ると、より強力なエネルギーが呼び出されます

熱帯雨林の杖が、ダンブルドアのようなあらゆる時代の並外れた魔法使いの伝説を生み出したのと同じように、...

ビッグデータと AI: 3 つの実際の使用例

ビッグデータと人工知能は、企業が新しい方法で顧客体験を向上させるのに役立ちます。 AIとビッグデータ...

PyTorch を使用した文字ベースの再帰型ニューラル ネットワークの実装

ここ数週間、私は PyTorch で char-rnn のバージョンを実装することに多くの時間を費や...

マスク氏は激怒:マイクロソフトはAI用のデータ収集にWindowsを使用しているが、登録なしでは使用できない

マスク氏が投稿したXダイナミックにより、Microsoft Windowsは論争の中心となった。事件...

24時間365日対応のAI教師は生徒にどのような影響を与えるのでしょうか?

伝統的な教育方法は、過去 1 世紀か 2 世紀の間にあまり変わっていません。通常、生徒は教室で教師の...

詳細な分析: AI LLM フレームワークの通信モジュール - なぜそれがコア モジュールなのか

この記事は、AI LLMフレームワークアーキテクチャシリーズの第2弾です。通信モジュール人工知能 (...