ロジスティック回帰 – 詳細な概要

図1:

ロジスティック回帰は、20世紀初頭に生物科学の分野で使用されました。 その後、多くの社会科学の分野で使われるようになりました。

例えば、

  • 電子メールがスパムであるかどうかを予測する(1)または(0)
  • 腫瘍が悪性であるかどうか(1)または(0)

電子メールがスパムであるかどうかを分類する必要があるシナリオを考えてみましょう。 この問題に線形回帰を使用する場合、分類を行うことができるしきい値を設定する必要があります。 例えば、実際のクラスが悪性で、予測連続値が0.4、閾値が0.5の場合、データポイントは悪性ではないと分類されますが、これはリアルタイムで深刻な結果につながる可能性があります。

この例から、線形回帰は分類問題には適していないと推測できます。

この例から、線形回帰が分類問題に適していないことが推測できます。線形回帰は境界がないため、ロジスティック回帰が登場します。 その値は厳密には0から1の範囲です。

シンプルなロジスティック回帰

(全ソースコード。 https://github.com/SSaishruthi/LogisticRegression_Vectorized_Implementation/blob/master/Logistic_Regression.ipynb)

モデル

出力=0または1

仮説=> Z = WX + B

hΘ(x)=sigmoid (Z)

Sigmoid 関数

Figure 2: シグモイド活性化関数

‘Z’が無限大になれば、Y(predified)は1になり、’Z’が負の無限大になれば、Y(predified)は0になります。

仮説の分析

仮説の出力は、推定確率です。 これは、入力Xが与えられたときに、予測値が実際の値になる確率を推測するために使用されます。 これは、電子メールがスパムである確率が80%であることを意味します。

数学的には次のように書くことができます。

図3: 数学的な表現

これで「ロジスティック回帰」という名前が正当化されました。

ロジスティック回帰の種類

1. 2値ロジスティック回帰

カテゴリー別の回答には2つの可能な結果があります。 例 スパムか否か

2.多項ロジスティック回帰

順序付けされていない3つ以上のカテゴリーがある。 例。 どの食べ物がより好まれるかを予測する(Veg, Non-Veg, Vegan)

3.順序ロジスティック回帰

3つ以上のカテゴリーで順序付けがあるもの。 例。

Decision Boundary

あるデータがどのクラスに属するかを予測するために、閾値を設定することができます。

予測値が0.5以上であれば、メールをスパムとして分類し、そうでなければスパムではないと分類することができます。 多項式の次数を増やすことで、複雑な決定境界を得ることができます。

コスト関数

Figure 4: ロジスティック回帰のコスト関数

なぜ、線形で使われていたコスト関数がロジスティックでは使えないのか?

線形回帰では、平均二乗誤差をコスト関数として使用します。 これをロジスティック回帰に使用すると、パラメータ(θ)の非凸関数となります。 勾配降下法は、関数が凸である場合にのみグローバル・ミニマムに収束します。

図5: 凸型および非凸型コスト関数

コスト関数の説明

div

Figure 6: コスト関数パート1

図7: コスト関数パート2

単純化されたコスト関数

Figure 8: 簡略化されたコスト関数

なぜこのコスト関数なのか?

図9: 最尤化の説明部分1

Figure 10: Maximum Likelihood Explanation part-2

この負の関数は、トレーニングをするときに、損失関数を最小にして確率を最大にする必要があるからです。 コストを減少させることで、サンプルが同一の独立した分布から引き出されると仮定した場合、最大尤度が増加します。

Gradient Descent Algorithmの計算式の導出

図11: Gradient Descent Algorithm part 1

図12: Gradient Descent part 2

Pythonでの実装

def weightInitialization(n_features):
w = np.zeros((1,n_features))
b = 0
return w,bdef sigmoid_activation(result):
final_result = 1/(1+np.exp(-result))
return final_result
def model_optimize(w, b, X, Y):
m = X.shape
#Prediction
final_result = sigmoid_activation(np.dot(w,X.T)+b)
Y_T = Y.T
cost = (-1/m)*(np.sum((Y_T*np.log(final_result)) + ((1-Y_T)*(np.log(1-final_result)))))
#
#Gradient calculation
dw = (1/m)*(np.dot(X.T, (final_result-Y.T).T))
db = (1/m)*(np.sum(final_result-Y.T))
grads = {"dw": dw, "db": db}
return grads, costdef model_predict(w, b, X, Y, learning_rate, no_iterations):
costs =
for i in range(no_iterations):
#
grads, cost = model_optimize(w,b,X,Y)
#
dw = grads
db = grads
#weight update
w = w - (learning_rate * (dw.T))
b = b - (learning_rate * db)
#
if (i % 100 == 0):
costs.append(cost)
#print("Cost after %i iteration is %f" %(i, cost))
#final parameters
coeff = {"w": w, "b": b}
gradient = {"dw": dw, "db": db}
return coeff, gradient, costsdef predict(final_pred, m):
y_pred = np.zeros((1,m))
for i in range(final_pred.shape):
if final_pred > 0.5:
y_pred = 1
return y_pred

コストと反復回数の関係p

図13: コスト削減

システムのトレーニングとテストの精度は100%

この実装は、バイナリロジスティック回帰のためのものです。

これは教育的な投稿であり、Andrew Ng教授の深層学習コースからヒントを得ています。

Full code : https://github.com/SSaishruthi/LogisticRegression_Vectorized_Implementation/blob/master/Logistic_Regression.ipynb

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です