目次
2.1 ベイジアン分類にブドウ (ワイン) データセットを使用する
2.2 離散データセットのシミュレーション – ベイジアン分類
1.導入と環境整備
序章:
Naive Bayes (Naive Bayes、NB) は、機械学習におけるベイズの定理に基づく分類アルゴリズムです。入力特徴は互いに独立しており、分類結果に同じ影響を与えると想定しているため、Naive Bayes と呼ばれます。
具体的には、事前確率と条件付き確率を計算することによって、入力サンプルの分類を決定します。ここで、事前確率とは、データセット全体に各分類が現れる確率を指し、条件付き確率とは、特定の分類の確率を指します。この場合、各特徴に対する入力サンプルの確率分布。
実際のアプリケーションでは、単純ベイズはテキスト分類やスパム フィルタリングなどのタスクでよく使用され、計算速度が速く、データ量に左右されないという利点があります。
ベイジアン式は、英国の数学者によって提案されたデータ式です。
p(A,B): イベント A とイベント B が同時に発生する確率を示します。
p(B): 事前確率と呼ばれるイベント B が発生する確率を示し、p(A): イベント A が発生する確率を示します。
p(A|B): 事象 B が発生する条件下で事象 A が発生する確率を事後確率と呼ぶことを示します。
p(B|A): 事象 A が発生した条件下で、事象 B が発生する確率を示します。
ベイジアンは一言で理解できます: 事象 A と事象 B を仮定すると、世界の多くのものの間には一定のつながりがあります。人々は、知りたいことの間の確率を推測するために、起こった出来事をよく使用します。
例えば、医師が診断を下す場合、患者の舌苔と心拍から患者がどのような病気にかかっているかを判断します。
患者の場合、彼らは自分がどのような病気にかかっているかだけに注意を払い、医師は特定の状況を診断するために発生したイベントを使用します. ここでベイジアンの考え方が使われ、A は患者の発生した症状であり、A が発生した条件下での B_i の確率です。
環境:
pycharm は、次のように提案しています。
1. python3.7
2. numpy >= '1.16.4'
3. sklearn >= '0.23.1'
2. 実践演習
すべてのデータセットは、追加のダウンロードなしで呼び出すことができます。ここでは、sklearn のデータセットについて簡単に紹介します。
scikit-learn (sklearn) には、機械学習のタスクやデモンストレーションに使用できる既製のデータセットがいくつかあります。現在 (2021 年)、sklearn で提供されるデータセットには次の 20 が含まれます。
- ボストン住宅データセット (ボストン住宅)
- アイリス データセット (アイリス)
- 糖尿病データセット (糖尿病)
- 手書き数字データセット (Digits)
- 乳がんデータセット (乳がん)
- ウィスコンシン乳がんデータセット
- Linnerud フィジカル トレーニング データセット (Linnerud)
- スイス銀行券データセット (スイス銀行券)
- 20 カテゴリのニュース テキスト データセット (20 ニュースグループ)
- オリベッティの顔画像データセット (オリベッティの顔)
- ポケモン データセット (ポケモン)
- 森林被覆タイプ データセット (森林被覆タイプ)
- カリフォルニア州住宅データセット (カリフォルニア州住宅)
- 遠赤外線データセット (赤外線)
- スパム データセット (スパム)
- 顔認識データセット (Faces)
- KDD Cup 1999 ネットワーク侵入検知データセット (KDD Cup 1999)
- インデックス インデックス データセット (数字)
- ローン デフォルト データセット (クレジット デフォルト)
- 新しいコロナウイルス診断データセット (Covid-19)
これらの既成のデータ セットに加えて、sklearn は、make_classification、make_regression、make_blobs などの人工的なデータ セットを生成するためのツールも提供します。
2.1 ベイジアン分類にブドウ (ワイン) データセットを使用する
1. データのインポート
import warnings
warnings.filterwarnings('ignore')
import numpy as np
# 加载莺尾花数据集
from sklearn import datasets
# 导入高斯朴素贝叶斯分类器
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
X, y = datasets.load_wine(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
条件付き確率: P ( X ( i ) = x ( i ) ∣ Y = ck ) とカテゴリ ck の事前確率: P(Y=ck) の 2 つの確率を計算する必要があります。
分析の結果、学習データは数値データであることがわかりました.ここでは、各特徴がガウス分布に従うと仮定するため、分類計算にはガウス ナイーブ ベイジアンを選択します。
2. モデルトレーニング
# 使用高斯朴素贝叶斯进行计算
clf = GaussianNB(var_smoothing=1e-8)
clf.fit(X_train, y_train)
3. モデル予測
# 评估
y_pred = clf.predict(X_test)
acc = np.sum(y_test == y_pred) / X_test.shape[0]
print("Test Acc : %.3f" % acc)
# 预测
y_proba = clf.predict_proba(X_test[:1])
print(clf.predict(X_test[:1]))
print("预计的概率值:", y_proba)
Gaussian Naive Bayes では、各特徴がガウス分布に従うと仮定します.確率変数 X を、ガウス分布として数学的な期待値 μ と分散 σ2 を持つデータ分布と呼びます. 各特徴について、通常、平均を使用して μ を推定し、すべての特徴の分散を使用して σ2 を推定します。
上記の例の予測結果から、カテゴリ 0 が最大の事後確率値に対応することがわかります。したがって、カテゴリ 0 が最適な結果であると考えます。
1 つのインスタンスから推論を引き出すのは非常に簡単です。インポートしたデータベースを変更するだけで、次の個別のデータセットの分類を確認できます。
2.2 離散データセットのシミュレーション – ベイジアン分類
1. データのインポートと分析
import random
import numpy as np
# 使用基于类目特征的朴素贝叶斯
from sklearn.naive_bayes import CategoricalNB
from sklearn.model_selection import train_test_split
トレーニング用のデータをランダムに生成し、DIY できます
# 模拟数据
rng = np.random.RandomState(1)
# 随机生成500个100维的数据,每一维的特征都是[0, 10]之前的整数
X = rng.randint(11, size=(500, 100))
y = np.array([1, 2, 3, 4, 5] * 100)
data = np.c_[X, y]
# X和y进行整体打散
random.shuffle(data)
X = data[:,:-1]
y = data[:, -1]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
X と y は、特徴行列とターゲット ベクトルを表します。
X は、500 個のサンプルを含む形状 (500, 100) の 2D 配列で、それぞれに 100 個の特徴が含まれます。この特徴行列は、numpy の randint 関数を使用して、0 から 10 (11 を除く) までの一様分布から生成された乱数の整数です。
y は、500 個のターゲット値を含む形状 (500,) の 1D 配列です。これらのターゲット値は、それぞれ 1、2、3、4、5 であり、100 回繰り返され、特徴マトリックスのサンプルに 1 つずつ対応します。機械学習タスクでは、通常、新しい未知のデータを予測するために、特徴行列とターゲット ベクトルを使用してモデルをトレーニングおよびテストする必要があります。
2.モデルのトレーニングと予測
すべてのデータ特徴は離散特徴であり、離散特徴に基づく単純ベイジアン分類器を導入します。
clf = CategoricalNB(alpha=1)
clf.fit(X_train, y_train)
acc = clf.score(X_test, y_test)
print("Test Acc : %.3f" % acc)
# 随机数据测试,分析预测结果,贝叶斯会选择概率最大的预测结果
# 比如这里的预测结果是7,7对应的概率最大,由于我们是随机数据
# 读者运行的时候,可能会出现不一样的结果。
x = rng.randint(5, size=(1, 100))
print(clf.predict_proba(x))
print(clf.predict(x))
テストデータの結果を見ることができます.ベイジアンは確率が最も高い予測結果を選択します.たとえば,ここでの予測結果は7であり,7に対応する確率が最も高くなります.私たちはランダムデータなので,リーダーが実行すると、異なる場合があります。
同時に、最初の行に変数 alpha があることに注意してください. alpha=0 の場合、それは最尤推定値です。通常アルファ=1の値、これはベイジアン推定と呼ばれるラプラス平滑化(ラプラス平滑化)です。これは主に、最尤推定を使用する場合、特定の特徴値がトレーニングデータに現れない場合、この時点で、ベイジアン推定の導入により、確率が 0 になり、全体の推定値が 0 になる状況になります。
ここでのテスト データの精度は意味がありません。データはランダムに生成され、アプリオリにベイジアンであるとは限らないためです。これは単なる例です。
3. 原理分析
単純ベイズ アルゴリズム
単純ベイズ法 = ベイズの定理 + 機能の条件付き独立。
入力空間は n 次元ベクトルの集合であり、出力空間. すべての X と y は対応する空間の確率変数です. P(X,Y) はそれぞれ X と Y の同時確率です. トレーニングデータセット ( P(X,Y ) によって生成され、独立して同一に分布):
元のテキストはより詳細なので、ここでは詳しく説明しません。テキストの最後にリンクがあります。
要約すると、分類時に、各カテゴリのサンプル特徴の条件付き確率を計算し、最も確率の高いカテゴリを予測結果として選択します。そして、条件は互いに独立しています。
長所と短所:
利点:
Naive Bayesian アルゴリズムは、主に古典的な Bayesian 式に基づいており、優れた数学的原理を備えています。また、データ量が少ない場合は性能がよく、データ量が多い場合は増分計算を行うことができます。Naive Bayes は事前確率を使用して事後確率を推定するため、モデルの解釈可能性が高くなります。
短所:
Naive Bayesian モデルは、他の分類方法と比較して、理論上のエラー率が最小です。しかし、これは実際には常に当てはまるとは限りません. これは、Naive Bayesian モデルが、出力カテゴリが与えられたときに属性が互いに独立していると仮定しているためです. この仮定は、実際のアプリケーションでは当てはまらないことがよくあります. 属性の数が相対的に大きい場合これらの相関が大きい場合、分類効果は良くありません。Naive Bayes は、属性相関が小さい場合に最適に機能します。この点については、部分相関を考慮して適度に改善されたセミナイーブベイズなどのアルゴリズムがあります.たとえば、計算量が多すぎないように、各属性は他の属性のみに依存すると仮定します. 特徴間の相関を解決するために、データ次元削減 (PCA) の方法を使用して特徴の相関を取り除き、単純ベイジアン計算を実行することもできます。
原文:A.機械学習エントリアルゴリズム(2):Naive Bayes(ナイーブベイズ)に基づく分類予測_Ting、人工知能ブログ - CSDNブログ