TECH I.S.

機械学習 - ロジスティック回帰

ロジスティック回帰

ロジスティック回帰は、分類の問題を解決することを目的としています。これは、連続的な結果を予測する線形回帰とは異なり、カテゴリ別の結果を予測することによって行われます。

最も単純なケースでは、二項分布と呼ばれる 2 つの結果があり、その例として、腫瘍が悪性か良性かを予測します。分類する結果が 3 つ以上ある場合もあり、この場合は多項式と呼ばれます。多項ロジスティック回帰の一般的な例は、3 つの異なる種の間でアヤメの花のクラスを予測することです。

ここでは、基本的なロジスティック回帰を使用して二項変数を予測します。これは、可能な結果が 2 つしかないことを意味します。


それはどのように機能しますか?

Python には、作業を行うモジュールがあります。 NumPy モジュールをインポートすることから始めます。

import numpy

独立変数を X に格納します。

従属変数を y に格納します。

以下はサンプル データセットです。

#X represents the size of a tumor in centimeters.X = numpy.array([3.78, 2.44, 2.09, 0.14, 1.72, 1.65, 4.92, 4.37, 4.96, 4.52, 3.69, 5.88]).reshape(-1,1)#Note: X has to be reshaped into a column from a row for the LogisticRegression() function to work.#y represents whether or not the tumor is cancerous (0 for "No", 1 for "Yes").y = numpy.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1])

sklearn モジュールのメソッドを使用するため、そのモジュールもインポートする必要があります。

from sklearn import linear_model

sklearn モジュールから LogisticRegression() メソッドを使用して、ロジスティック回帰オブジェクトを作成します。

このオブジェクトには、と呼ばれるメソッドがありますfit()これは、独立値と依存値をパラメーターとして取り、関係を説明するデータで回帰オブジェクトを埋めます。

logr = linear_model.LogisticRegression()logr.fit(X,y)

これで、腫瘍のサイズに基づいて腫瘍が癌性であるかどうかを判断できるロジスティック回帰オブジェクトができました。

#predict if tumor is cancerous where the size is 3.46mm:predicted = logr.predict(numpy.array([3.46]).reshape(-1,1))

実際の例全体を参照してください。

import numpy from sklearn import linear_model #Reshaped for Logistic function. X = numpy.array([3.78, 2.44, 2.09, 0.14, 1.72, 1.65, 4.92, 4.37, 4.96, 4.52, 3.69, 5.88]).reshape(-1,1) y = numpy.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]) logr = linear_model.LogisticRegression() logr.fit(X,y) #predict if tumor is cancerous where the size is 3.46mm: predicted = logr.predict(numpy.array([3.46]).reshape(-1,1)) print(predicted)

結果

[0]

実行例(開発準備中) »

サイズが 3.46mm の腫瘍は癌ではないと予測されています。

係数

ロジスティック回帰では、係数は X の単位変化あたりの結果を持つ対数オッズの予想変化です。

これは最も直感的に理解できるものではないので、これを使用して、より理にかなったもの、オッズを作成しましょう。

実際の例全体を参照してください。

import numpy from sklearn import linear_model #Reshaped for Logistic function. X = numpy.array([3.78, 2.44, 2.09, 0.14, 1.72, 1.65, 4.92, 4.37, 4.96, 4.52, 3.69, 5.88]).reshape(-1,1) y = numpy.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]) logr = linear_model.LogisticRegression() logr.fit(X,y) log_odds = logr.coef_ odds = numpy.exp(log_odds) print(odds)

結果

[4.03541657]

実行例(開発準備中) »

これは、腫瘍のサイズが 1mm 大きくなると、腫瘍である確率が 4 倍になることを示しています。


確率

係数と切片の値を使用して、各腫瘍が癌である確率を見つけることができます。

モデルの係数と切片の値を使用して新しい値を返す関数を作成します。この新しい値は、指定された観察が腫瘍である確率を表します。

def logit2prob(logr,x):   log_odds = logr.coef_ * x + logr.intercept_   odds = numpy.exp(log_odds)   probability = odds / (1 + odds)   return(probability)

機能説明

各オブザベーションの対数オッズを見つけるには、最初に線形回帰の式に似た式を作成し、係数と切片を抽出する必要があります。

log_odds = logr.coef_ * x + logr.intercept_

対数オッズをオッズに変換するには、対数オッズをべき乗する必要があります。

odds = numpy.exp(log_odds)

オッズが得られたので、それを 1 プラス オッズで割って確率に変換できます。

probability = odds / (1 + odds)

ここで、各腫瘍が癌である確率を調べるために、学習した内容で関数を使用してみましょう。

実際の例全体を参照してください。

import numpy from sklearn import linear_model X = numpy.array([3.78, 2.44, 2.09, 0.14, 1.72, 1.65, 4.92, 4.37, 4.96, 4.52, 3.69, 5.88]).reshape(-1,1) y = numpy.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]) logr = linear_model.LogisticRegression() logr.fit(X,y) def logit2prob(logr, X):   log_odds = logr.coef_ * X + logr.intercept_   odds = numpy.exp(log_odds)   probability = odds / (1 + odds)   return(probability) print(logit2prob(logr, X))

結果

[[0.60749955]
[0.19268876]
[0.12775886]
[0.00955221]
[0.08038616]
[0.07345637]
[0.88362743]
[0.77901378]
[0.88924409]
[0.81293497]
[0.57719129]
[0.96664243]]

実行例(開発準備中) »

結果の説明

3.78 0.61サイズが3.78cmの腫瘍が癌である確率は61%です。

2.44 0.19サイズが2.44cmの腫瘍が癌である確率は19%です。

2.09 0.13サイズが2.09cmの腫瘍が癌である確率は13%です。



プログラミング学習を加速させる

プログラミングをプロの講師に教えてもらいませんか。

テックアイエスのプログラミングスクールは初心者も大歓迎です。年齢制限もありません。転職・副業に強く、挫折させない手厚いサポートで稼ぐ力を身につけましょう!

スクールの詳細