機械学習の確率 (7 日間のミニコース)
機械学習の確率クラッシュ コース。
7 日間で機械学習で使用される確率を習得します。
確率は、機械学習の基礎であることが広く認められている数学の分野です。
確率は多くの難解な理論や発見を伴う大きな分野ですが、機械学習の実践者には、この分野から取り入れられた基本事項、ツール、および表記法が必要です。確率とは何かについてしっかりとした基礎があれば、良い部分や関連する部分だけに焦点を当てることができます。
この短期集中コースでは、Python を使用した機械学習で使用される確率的手法を 7 日間で開始し、自信を持って理解して実装する方法を学びます。
これは大きくて重要な投稿です。ブックマークしておくといいかもしれません。
私の新しい本 Probability for Machine Learning でプロジェクトを開始しましょう。これにはステップバイステップのチュートリアルとすべてのPython ソース コード ファイルが含まれています。例。
始めましょう。
- 2020 年 1 月更新: scikit-learn v0.22 API の変更点を更新しました。
この短期集中コースは誰のためのものですか?
始める前に、ここが正しい場所であることを確認しましょう。
このコースは、応用機械学習の知識がある開発者を対象としています。おそらく、一般的なツールを使用して、予測モデリングの問題をエンドツーエンドで処理する方法、または少なくとも主要な手順のほとんどを処理する方法を知っているかもしれません。
このコースのレッスンでは、あなたについて次のようなことを前提としています。
- あなたはプログラミングのための基本的な Python について理解しています。
- 配列操作のための基本的な NumPy をいくつか知っているかもしれません。
- 機械学習の理解と応用を深めるために確率を学びたいと考えています。
次のような必要はありません。
- 数学の達人!
- 機械学習の専門家です!
この集中コースでは、機械学習を少し知っている開発者から、確率的手法の基本を理解できる開発者までを導きます。
注: この短期集中コースは、少なくとも NumPy がインストールされ、動作する Python3 SciPy 環境があることを前提としています。環境に関するサポートが必要な場合は、次のステップバイステップのチュートリアルに従ってください。
- Anaconda を使用した機械学習用に Python 環境をセットアップする方法
短期集中コースの概要
この短期集中コースは 7 つのレッスンに分かれています。
1 日に 1 つのレッスンを完了する (推奨) ことも、1 日ですべてのレッスンを完了する (ハードコア) こともできます。それは本当にあなたが使える時間とあなたの熱意のレベルによって異なります。
以下は、Python で機械学習を開始し、確実に生産性を高めるための 7 つのレッスンのリストです。
- レッスン 01: 確率と機械学習
- レッスン 02: 3 種類の確率
- レッスン 03: 確率分布
- レッスン 04: 単純ベイズ分類器
- レッスン 05: エントロピーとクロスエントロピー
- レッスン 06: 単純な分類子
- レッスン 07: 確率スコア
各レッスンにかかる時間は 60 秒、最長で 30 分です。時間をかけて自分のペースでレッスンを完了してください。以下のコメントに質問したり、結果を投稿したりできます。
レッスンでは、実際に外に出て、物事のやり方を見つけることが求められます。ヒントは提供しますが、各レッスンのポイントの一部は、統計手法、NumPy API、および Python の最高のツールに関するヘルプを探すにはどこに行けばよいかを学習させることです。 (ヒント: すべての答えはこのブログに直接あります。検索ボックスを使用してください。)
結果をコメントに投稿してください。応援するよ!
ちょっと待ってください。あきらめないで。
注: これは単なる短期集中コースです。より詳細で具体的なチュートリアルについては、「機械学習の確率」というテーマに関する私の著書を参照してください。
レッスン 01: 確率と機械学習
このレッスンでは、機械学習の実践者がスキルと能力を向上させるために確率を学ぶ必要がある理由を学びます。
確率は、不確実性を定量化する数学の分野です。
機械学習とは、不確実なデータから予測モデリングを開発することです。不確実性とは、不完全または不完全な情報を扱うことを意味します。
不確実性は機械学習の分野の基本ですが、初心者、特に開発者の経歴を持つ初心者にとって最も困難を引き起こす側面の 1 つです。
機械学習における不確実性の主な原因は 3 つあります。彼らです:
- 観測時のノイズ 例:測定誤差とランダムノイズ。
- ドメインのカバー範囲が不完全(例:すべてのデータを観察することは決してできません。
- 問題の不完全なモデル例:すべてのモデルにはエラーがありますが、いくつかは便利です。
応用機械学習における不確実性は確率を使用して管理されます。
- 確率と統計は、ドメインからの観測における変数の期待値と変動性を理解し、定量化するのに役立ちます。
- 確率は、ドメイン内の予想される観測値の分布と密度を理解し、定量化するのに役立ちます。
- 確率は、新しいデータに適用した場合の予測モデルの期待される性能とパフォーマンスの差異を理解し、定量化するのに役立ちます。
これが機械学習の基礎です。それに加えて、確率を予測するためのモデルが必要な場合があり、確率を使用して予測モデル (例: ナイーブ ベイズ) を開発し、確率フレームワークを使用して予測モデル (例: 最尤推定) をトレーニングする場合があります。
あなたのタスク
このレッスンでは、機械学習のコンテキストで確率を学びたい理由を 3 つ挙げる必要があります。
これらは上記の理由のいくつかに関連している可能性がありますが、あるいはあなた自身の個人的な動機である可能性もあります。
以下のコメント欄に答えを投稿してください。あなたが何を思いつくかぜひ見てみたいです。
次のレッスンでは、3 つの異なるタイプの確率とその計算方法を学習します。
レッスン 02: 3 種類の確率
このレッスンでは、確率変数間の結合確率、周辺確率、および条件付き確率について丁寧に説明します。
確率は、イベントの可能性を数値化します。
具体的には、コインの投げ、サイコロの目、山札からトランプを引くなど、確率変数に対して特定の結果が得られる可能性を定量化します。
変数 X のイベント A の確率と変数 Y のイベント B の確率だけの 2 つのイベントの確率について議論できます。 は、短縮形では X=A と Y=B であり、2 つの変数が何らかの形で関連または依存していることを意味します。
したがって、考慮すべき確率には主に 3 つのタイプがあります。
同時確率
2 つの異なる確率変数の結果のように、2 つの同時イベントの確率に興味があるかもしれません。
たとえば、イベント A とイベント B の同時確率は、正式には次のように記述されます。
- P(AとB)
イベント A と B の同時確率は、イベント B が与えられた場合のイベント A の確率に、イベントBの確率。
これは形式的には次のように言えます。
- P(A および B)=P(B が与えられた場合) * P(B)
限界確率
別の確率変数の結果に関係なく、ある確率変数のイベントの確率に興味がある場合があります。
周辺確率には特別な表記法はありません。これは、最初の変数の特定の固定イベントに対する 2 番目の変数のすべてのイベントの確率の合計または和集合にすぎません。
- P(X=A)=すべての y の P(X=A, Y=yi) の合計
条件付き確率
別のイベントが発生した場合、そのイベントの確率に興味があるかもしれません。
たとえば、イベント B が与えられた場合のイベント A の条件付き確率は、正式には次のように記述されます。
- P(B が与えられた場合)
イベント B が与えられた場合のイベント A の条件付き確率は、次のようにイベントの同時確率を使用して計算できます。
- P(B が与えられた場合)=P(A および B)/P(B)
あなたのタスク
このレッスンでは、結合確率、周辺確率、および条件付き確率の計算を練習する必要があります。
たとえば、ある家族に 2 人の子供がいて、長男が男の子である場合、この家族に 2 人の息子がいる確率はどれくらいですか?これは「男の子か女の子の問題」と呼ばれ、確率を練習するための一般的なおもちゃの問題の 1 つです。
以下のコメント欄に答えを投稿してください。あなたが何を思いつくかぜひ見てみたいです。
次のレッスンでは、確率変数の確率分布を学習します。
レッスン 03: 確率分布
このレッスンでは、確率分布についての穏やかな入門を学びます。
確率的には、確率変数は多くの可能な値のうちの 1 つを取ることができます。状態空間からのイベント。確率変数の特定の値または値のセットに確率を割り当てることができます。
確率変数には主に 2 つのクラスがあります。
- 離散確率変数。値は有限の状態セットから抽出されます。
- 連続確率変数です。値は、実数値の範囲から抽出されます。
離散確率変数には有限の状態セットがあります。例えば車の色。連続確率変数には一定範囲の数値があります。たとえば人間の身長。
確率分布は、確率変数の値の確率をまとめたものです。
離散確率分布
離散確率分布は、離散確率変数の確率を要約したものです。
よく知られている離散確率分布の例としては、次のようなものがあります。
- ポアソン分布。
- ベルヌーイ分布と二項分布。
- 多ヌーイ分布と多項分布。
連続確率分布
連続確率分布は、連続確率変数の確率を要約します。
よく知られている連続確率分布の例としては、次のようなものがあります。
- 正規分布またはガウス分布。
- 指数分布。
- パレート分布。
ガウス分布をランダムにサンプリングする
平均が 50、標準偏差が 5 の分布を定義し、この分布から乱数をサンプリングできます。これは、normal() NumPy 関数を使用して実現できます。
以下の例では、この分布から 10 個の数値をサンプリングして出力します。
# sample a normal distribution
from numpy.random import normal
# define the distribution
mu = 50
sigma = 5
n = 10
# generate the sample
sample = normal(mu, sigma, n)
print(sample)
この例を実行すると、定義された正規分布からランダムにサンプリングされた 10 個の数値が出力されます。
あなたのタスク
このレッスンでは、別の連続または離散確率分布関数からサンプリングする例を開発する必要があります。
ボーナスとして、特定の分布の値を X 軸に、確率を Y 軸にプロットして、選択した確率分布関数の密度を表示できます。
以下のコメント欄に答えを投稿してください。あなたが何を思いつくかぜひ見てみたいです。
次のレッスンでは、Naive Bayes 分類器を学習します。
レッスン 04: 単純ベイズ分類器
このレッスンでは、分類予測モデリングのための Naive Bayes アルゴリズムを学習します。
機械学習では、特定の観測値のクラス ラベルを予測する予測モデリング問題に関心が集まることがよくあります。
この問題を解決する 1 つのアプローチは、確率モデルを開発することです。確率論的な観点から、観測値が与えられた場合のクラス ラベルの条件付き確率、または入力データ X が与えられた場合のクラス y の確率を推定することに興味があります。
- P(y | X)
ベイズの定理は、目的の条件付き確率の逆を使用して条件付き確率を計算するための原理的な代替方法を提供します。多くの場合、この方法の方が計算が簡単です。
ベイズ定理の計算の簡単な形式は次のとおりです。
- P(A|B)=P(B|A) * P(A)/P(B)
ここで、P(A|B) の計算に関心がある確率は事後確率と呼ばれ、イベントP(A) の周辺確率は事前確率と呼ばれます。
特に変数または特徴 (n) の数が増加すると、分類にベイズの定理を直接適用するのは困難になります。代わりに、計算を簡素化し、各入力変数が独立していると仮定することができます。劇的ではありますが、この単純な計算では、入力変数の依存性が高い場合でも、多くの場合、非常に優れたパフォーマンスが得られます。
これを最初から実装するには、個別の入力変数ごとに確率分布を仮定し、各クラスに属する特定の入力値の確率を計算し、その結果を乗算して、最も可能性の高いクラスを選択するために使用されるスコアを算出します。
- P(yi | x1, x2, …, xn)=P(x1|y1) * P(x2|y1) * … P(xn|y1) * P(yi)
scikit-learn ライブラリは、各入力変数のガウス分布を仮定した場合にアルゴリズムの効率的な実装を提供します。
scikit-learn の単純ベイズ モデルを使用するには、まずモデルを定義し、次にそれをトレーニング データセットに適合させます。適合すると、predict_proba() 関数を使用して確率を予測でき、predict() 関数を使用してクラス ラベルを直接予測できます。
ガウス単純ベイズ モデル (GaussianNB) をテスト データセットに適合させる完全な例を以下に示します。
# example of gaussian naive bayes
from sklearn.datasets import make_blobs
from sklearn.naive_bayes import GaussianNB
# generate 2d classification dataset
X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1)
# define the model
model = GaussianNB()
# fit the model
model.fit(X, y)
# select a single sample
Xsample, ysample = [X[0]], y[0]
# make a probabilistic prediction
yhat_prob = model.predict_proba(Xsample)
print('Predicted Probabilities: ', yhat_prob)
# make a classification prediction
yhat_class = model.predict(Xsample)
print('Predicted Class: ', yhat_class)
print('Truth: y=%d' % ysample)
この例を実行すると、モデルがトレーニング データセットに適合し、前の例で使用したものと同じ最初の例に対して予測が行われます。
あなたのタスク
このレッスンでは、サンプルを実行して結果を報告する必要があります。
ボーナスとして、花の測定値に基づいてアヤメの花の種類を分類するという人気のあるおもちゃの分類問題など、実際の分類データセットでアルゴリズムを試してみましょう。
以下のコメント欄に答えを投稿してください。あなたが何を思いつくかぜひ見てみたいです。
次のレッスンでは、エントロピーとクロスエントロピー スコアについて学びます。
レッスン 05: エントロピーとクロスエントロピー
このレッスンでは、機械学習のクロスエントロピーについて学びます。
情報理論は、コミュニケーションのための情報の定量化に関する研究分野です。
情報を定量化する背後にある直観は、出来事にどれだけの驚きがあるかを測定するという考えです。まれなイベント (確率が低い) はより驚くべきものであるため、一般的なイベント (確率が高い) よりも多くの情報が含まれます。
- 低確率イベント: 高い情報 (驚き)。
- 高確率のイベント: 情報が少ない (当然のこと)。
イベントの確率を使用して、イベントに含まれる情報の量を計算できます。
- 情報(x)=-log( p(x) )
確率変数にどれだけの情報が含まれているかを定量化することもできます。
これはエントロピーと呼ばれ、イベントを表すために平均して必要な情報量を要約したものです。
エントロピーは、K 個の離散状態を持つ確率変数 X に対して次のように計算できます。
- エントロピー(X)=-sum(i=1 ~ K p(K) * log(p(K)))
クロスエントロピーは、特定の確率変数または一連のイベントに対する 2 つの確率分布間の差の尺度です。これは、分類モデルを最適化する際の損失関数として広く使用されています。
これはエントロピーの概念に基づいて構築されており、あるディストリビューションからのイベントを表現または送信するために必要な平均ビット数を、他のディストリビューションと比較して計算します。
- CrossEntropy(P, Q)=– X 内の x の合計 P(x) * log(Q(x))
小さな例を使用して、クロスエントロピーの具体的な計算を行うことができます。
3 つのイベントが異なる色を持つ確率変数を考えてみましょう。この変数には 2 つの異なる確率分布がある可能性があります。これら 2 つの分布間のクロスエントロピーを計算できます。
完全な例を以下に示します。
# example of calculating cross entropy
from math import log2
# calculate cross entropy
def cross_entropy(p, q):
return -sum([p[i]*log2(q[i]) for i in range(len(p))])
# define data
p = [0.10, 0.40, 0.50]
q = [0.80, 0.15, 0.05]
# calculate cross entropy H(P, Q)
ce_pq = cross_entropy(p, q)
print('H(P, Q): %.3f bits' % ce_pq)
# calculate cross entropy H(Q, P)
ce_qp = cross_entropy(q, p)
print('H(Q, P): %.3f bits' % ce_qp)
この例を実行すると、まず P から Q のクロス エントロピーが計算され、次に Q から P が計算されます。
あなたのタスク
このレッスンでは、例を実行し、結果とその意味を説明する必要があります。たとえば、クロスエントロピーの計算は対称ですか?
以下のコメント欄に答えを投稿してください。あなたが何を思いつくかぜひ見てみたいです。
次のレッスンでは、単純な分類子モデルを開発および評価する方法を学びます。
レッスン 06: 単純な分類子
このレッスンでは、機械学習のための単純な分類戦略を開発および評価する方法を学びます。
分類予測モデリングの問題には、モデルへの入力が与えられたクラス ラベルの予測が含まれます。
分類モデルが与えられた場合、そのモデルにスキルがあるかどうかをどのように判断すればよいでしょうか?
これは、すべての分類予測モデリング プロジェクトでよくある質問です。答えは、特定の分類子モデルの結果をベースラインまたは単純な分類子モデルと比較することです。
クラス 0 の例が 25 個、クラス 1 の例が 75 個で、各クラスの観測値の数が等しくない (たとえば、不均衡である) 単純な 2 クラス分類問題を考えてみましょう。この問題は、さまざまな単純な分類子モデルを検討するために使用できます。
たとえば、クラス 0 またはクラス 1 を等しい確率でランダムに予測するモデルを考えてみましょう。それはどのように機能しますか?
単純な確率モデルを使用して、期待されるパフォーマンスを計算できます。
- P(yhat=y)=P(yhat=0) * P(y=0) + P(yhat=1) * P(y=1)
各クラスの発生 (0.25 と 0.75) と各クラスの予測確率 (0.5 と 0.5) を代入して、モデルのパフォーマンスを推定できます。
- P(yhat=y)=0.5 * 0.25 + 0.5 * 0.75
- P(yhat=y)=0.5
この分類器はかなり貧弱であることがわかりました。
ここで、毎回多数派クラス (クラス 1) を予測すると考えるとどうなるでしょうか。ここでも、予測された確率 (0.0 と 1.0) を代入して、モデルのパフォーマンスを推定できます。
- P(yhat=y)=0.0 * 0.25 + 1.0 * 0.75
- P(yhat=y)=0.75
この単純な変更により、より優れた単純な分類モデルが得られ、クラスの不均衡な場合に使用するのにおそらく最適な単純な分類器であることがわかりました。
scikit-learn 機械学習ライブラリは、次の分類予測モデリング プロジェクトで使用できる、DummyClassifier と呼ばれる多数派クラスの単純分類アルゴリズムの実装を提供します。
完全な例を以下に示します。
# example of the majority class naive classifier in scikit-learn
from numpy import asarray
from sklearn.dummy import DummyClassifier
from sklearn.metrics import accuracy_score
# define dataset
X = asarray([0 for _ in range(100)])
class0 = [0 for _ in range(25)]
class1 = [1 for _ in range(75)]
y = asarray(class0 + class1)
# reshape data for sklearn
X = X.reshape((len(X), 1))
# define model
model = DummyClassifier(strategy='most_frequent')
# fit model
model.fit(X, y)
# make predictions
yhat = model.predict(X)
# calculate accuracy
accuracy = accuracy_score(y, yhat)
print('Accuracy: %.3f' % accuracy)
この例を実行すると、データセットが準備され、次に多数派クラス戦略を使用してデータセットのDummyClassifier が定義されて適合されます。
あなたのタスク
このレッスンでは、例を実行して結果を報告し、モデルが計算から予想どおりに動作するかどうかを確認する必要があります。
ボーナスとして、予測が行われるたびにトレーニング データセットからクラス ラベルをランダムに選択する単純な分類器モデルの期待確率を計算します。
以下のコメント欄に答えを投稿してください。あなたが何を思いつくかぜひ見てみたいです。
次のレッスンでは、確率を予測するモデルをスコアリングするためのメトリクスを学習します。
レッスン 07: 確率スコア
このレッスンでは、分類予測モデリング問題の予測確率を評価するために使用できる 2 つのスコア付け方法を学習します。
分類問題のクラス ラベルの代わりに確率を予測すると、予測にさらなるニュアンスと不確実性が生じる可能性があります。
ニュアンスが追加されることで、より洗練されたメトリクスを使用して、予測確率を解釈および評価できるようになります。
予測確率を評価するための 2 つの一般的なスコアリング方法を詳しく見てみましょう。
対数損失スコア
ロジスティック損失 (略して対数損失) は、予測確率と観測確率の間の対数尤度を計算します。
ロジスティック回帰のような二項分類モデルをトレーニングするために開発されましたが、マルチクラス問題の評価にも使用でき、機能的には情報理論から導出されたクロスエントロピーの計算と同等です。
完璧なスキルを持つモデルの対数損失スコアは 0.0 です。ログ損失は、scikit-learn の log_loss() 関数を使用して Python で実装できます。
例えば:
# example of log loss
from numpy import asarray
from sklearn.metrics import log_loss
# define data
y_true = [1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
y_pred = [0.8, 0.9, 0.9, 0.6, 0.8, 0.1, 0.4, 0.2, 0.1, 0.3]
# define data as expected, e.g. probability for each event {0, 1}
y_true = asarray([[v, 1-v] for v in y_true])
y_pred = asarray([[v, 1-v] for v in y_pred])
# calculate log loss
loss = log_loss(y_true, y_pred)
print(loss)
ブライアースコア
グレン ブライアーにちなんで名付けられたブライアー スコアは、予測確率と期待値の間の平均二乗誤差を計算します。
スコアは、確率予測の誤差の大きさを要約します。
エラー スコアは常に 0.0 ~ 1.0 の間であり、完璧なスキルを持つモデルのスコアは 0.0 です。
Brier スコアは、scikit-learn の brier_score_loss() 関数を使用して Python で計算できます。
例えば:
# example of brier loss
from sklearn.metrics import brier_score_loss
# define data
y_true = [1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
y_pred = [0.8, 0.9, 0.9, 0.6, 0.8, 0.1, 0.4, 0.2, 0.1, 0.3]
# calculate brier score
score = brier_score_loss(y_true, y_pred, pos_label=1)
print(score)
あなたのタスク
このレッスンでは、各例を実行して結果を報告する必要があります。
ボーナスとして、模擬予測を変更して改善または悪化させ、結果のスコアを比較します。
以下のコメント欄に答えを投稿してください。あなたが何を思いつくかぜひ見てみたいです。
これが最後のレッスンでした。
最後です!
(どこまで来たか)
成功しましたね。よくやった!
少し時間を取って、これまでの道のりを振り返ってください。
あなたは次のことを発見しました:
- 応用機械学習における確率の重要性。
- 確率の主な 3 種類とその計算方法。
- 確率変数の確率分布と、そこからランダムなサンプルを抽出する方法。
- ベイズの定理を使用して条件付き確率を計算する方法と、それを分類モデルでどのように使用できるか。
- 情報、エントロピー、クロスエントロピーのスコアを計算する方法とその意味。
- 単純な分類モデルで期待されるパフォーマンスを開発および評価する方法。
- 分類問題の確率値を予測するモデルのスキルを評価する方法。
次のステップに進んで、機械学習の確率に関する私の本を読んでください。
まとめ
ミニコースはどうでしたか?
この短期集中コースは楽しかったですか?
何か質問はありますか?何か引っかかる点はありましたか
教えてください。以下にコメントを残してください。