予測モデルの構築:Pythonにおけるロジスティック回帰
予測モデルの構築:Pythonのロジスティック回帰による分析
機械学習の初心者の場合、ロジスティック回帰は最初のアルゴリズムの1つです。それはシンプルで堅牢なアルゴリズムで、2値分類のタスクによく使用されます。
0と1のクラスを持つ2値分類問題を考えてみましょう。ロジスティック回帰は、入力データに対してロジスティック関数またはシグモイド関数を適合させ、クエリデータポイントがクラス1に属する確率を予測します。面白いですね?
このチュートリアルでは、次の項目について基礎から学んでいきます:
- フリーMITコース:TinyMLと効率的なディープラーニングコンピューティング
- あなたの言語モデルやAPIを活用するためのヒント
- 「DRESS」とは、自然言語フィードバックを通じて人々と調和し、対話する大規模なビジョン言語モデル(LVLM)です
- ロジスティック(またはシグモイド)関数
- 線形からロジスティック回帰への移行方法
- ロジスティック回帰の動作方法
最後に、イオンの大気圏からのRADAR返却を分類するためのシンプルなロジスティック回帰モデルを構築します。
ロジスティック関数
ロジスティック回帰についてもっと学ぶ前に、ロジスティック関数の動作について rep してみましょう。ロジスティック関数(またはシグモイド関数)は以下の式で与えられます:
シグモイド関数を図示すると、次のようになります:
図よりわかるように:
- x = 0のとき、σ(x)の値は0.5になります。
- xが+∞に近づくと、σ(x)は1に近づきます。
- xが-∞に近づくと、σ(x)は0に近づきます。
したがって、すべての実数の入力に対して、シグモイド関数は[0, 1]の範囲の値を取ります。
線形回帰からロジスティック回帰へ
まず、バイナリ分類問題に対して線形回帰を使用できない理由について説明しましょう。
バイナリ分類問題では、出力はカテゴリカルラベル(0または1)です。線形回帰は連続値の出力を予測するため、0未満または1以上の値を持つことは意味がありません。
また、出力ラベルが2つのカテゴリのいずれかに属する場合、直線が最適なフィットではありません。
では、線形からロジスティック回帰への変換はどのように行われるのでしょうか?線形回帰では、予測される出力は次の式で与えられます:
βは係数であり、X_iは予測子(または特徴量)です。
損失を出さないため、X_0 = 1と仮定します:
したがって、より簡潔な式を得ることができます:
ロジスティック回帰では、[0,1]区間の予測確率p_iが必要です。ロジスティック関数は入力を圧縮して[0,1]区間の値とすることを知っています。
この式をロジスティック関数に代入すると、予測確率は次のようになります:
ロジスティック回帰の内部構造
では、与えられたデータセットに対して最適なフィットロジスティック曲線をどのように見つけるのでしょうか?これに答えるために、最尤推定を理解しましょう。
最尤推定(MLE)は、尤度関数を最大化することによってロジスティック回帰モデルのパラメータを推定するために使用されます。MLEによるロジスティック回帰でのプロセスと勾配降下法を使用して最適化するためのコスト関数の構成方法を解説しましょう。
最尤推定の解説
前述の通り、バイナリな結果が発生する確率を1つまたは複数の予測変数(または特徴)の関数としてモデル化します:
ここで、βsはモデルのパラメータまたは係数であり、X_1、X_2、…、X_nは予測変数です。
MLEは、観測されたデータの尤度を最大化するβの値を見つけることを目指します。尤度関数は、ロジスティック回帰モデルのもとで与えられた予測変数の値における観測された結果の確率を表します。
対数尤度関数の定式化
最適化プロセスを単純化するために、対数尤度関数を使用するのが一般的です。これにより、確率の積を対数確率の和に変換できます。
ロジスティック回帰の対数尤度関数は次のようになります:
コスト関数と勾配降下法
対数尤度の本質を知ったので、ロジスティック回帰のためのコスト関数と最適なモデルパラメータを見つけるための勾配降下法の定式化に進みましょう。
ロジスティック回帰のコスト関数
ロジスティック回帰モデルを最適化するためには、対数尤度を最大化する必要があります。そのため、学習中に最小化するコスト関数として負の対数尤度を使用することができます。負の対数尤度は、ロジスティック損失とも呼ばれ、次のように定義されます:
学習アルゴリズムの目標は、このコスト関数を最小化する値を見つけることです。勾配降下法は、このコスト関数の勾配の反対方向にモデルパラメータβを反復的に更新することで使用される一般的な最適化アルゴリズムです。
ロジスティック回帰における勾配降下法
勾配降下法は、モデルパラメータβに関するコスト関数の勾配の反対方向にモデルパラメータβを反復的にアップデートするイテレータベースの最適化アルゴリズムです。勾配降下法を使用したロジスティック回帰のステップt+1における更新ルールは次のようになります:
ここで、αは学習率です。
偏微分は連鎖律を使って計算することができます。勾配降下法は、ロジスティック損失を最小化するためにパラメータを反復的に更新し、収束するにつれて観測データの尤度を最大化する最適なβの値を見つけます。
Scikit-LearnでのPythonにおけるロジスティック回帰
ロジスティック回帰の動作原理を理解したので、scikit-learnライブラリを使用して予測モデルを構築しましょう。
このチュートリアルでは、UCI機械学習リポジトリのionosphereデータセットを使用します。データセットには34の数値特徴が含まれています。出力はバイナリであり、’good’または’bad’(’g’または’b’で示されます)のいずれかです。出力ラベル ‘good’ は、イオノスフィアの中にいくつかの構造が検出されたRADARの返信を指します。
ステップ1 – データセットの読み込み
まず、データセットをダウンロードし、pandasのデータフレームに読み込みます:
import pandas as pdimport urlliburl = "https://archive.ics.uci.edu/ml/machine-learning-databases/ionosphere/iphere.data"data = urllib.request.urlopen(url)df = pd.read_csv(data, header=None)
ステップ2 – データセットの探索
まず、データフレームの最初の数行を見てみましょう:
# データフレームの最初の数行を表示df.head()
df.head()の出力(一部分)
データセットについての情報を取得しましょう:ノンヌル値の数と各列のデータ型です:
# データセットについての情報を取得print(df.info())
df.info()の出力(一部分)
全ての特徴が数値であるため、データフレーム上でdescribe()
メソッドを使って記述統計を取得することもできます:
# データセットの記述統計を取得print(df.describe())
df.describe()の出力(一部分)
カラム名は現在、0から34までです(ラベルを含む)。データセットはカラムに対して説明的な名前を提供していないため、それらを「attribute_1」から「attribute_34」として扱います。必要に応じて、データフレームのカラム名を以下のように変更することもできます:
column_names = ["attribute_1", "attribute_2", "attribute_3", "attribute_4", "attribute_5","attribute_6", "attribute_7", "attribute_8", "attribute_9", "attribute_10","attribute_11", "attribute_12", "attribute_13", "attribute_14", "attribute_15","attribute_16", "attribute_17", "attribute_18", "attribute_19", "attribute_20","attribute_21", "attribute_22", "attribute_23", "attribute_24", "attribute_25","attribute_26", "attribute_27", "attribute_28", "attribute_29", "attribute_30","attribute_31", "attribute_32", "attribute_33", "attribute_34", "class_label"]df.columns = column_names
注意:このステップは完全に任意です。デフォルトのカラム名を使用しても構いません。
# データフレームの最初の数行を表示df.head()
df.head()の出力(カラム名を変更後)
ステップ3 – クラスラベルの名前を変更し、クラスの分布を可視化
出力のクラスラベルが ‘g’ と ‘b’ であるため、それらをそれぞれ1と0にマッピングする必要があります。これは map()
や replace()
を使って行うことができます:
# クラスラベルを 'g' と 'b' からそれぞれ 1 と 0 に変換df["class_label"] = df["class_label"].replace({'g': 1, 'b': 0})
また、クラスラベルの分布を可視化してみましょう:
import matplotlib.pyplot as plt# 各クラスのデータポイントの数を数えるclass_counts = df['class_label'].value_counts()# クラスの分布を可視化するための棒グラフを作成plt.bar(class_counts.index, class_counts.values)plt.xlabel('クラスラベル')plt.ylabel('件数')plt.xticks(class_counts.index)plt.title('クラスの分布')plt.show()
クラスラベルの分布
分布に不均衡があることがわかります。クラス0よりもクラス1に属するレコードが多いです。ロジスティック回帰モデルを構築する際に、このクラスの不均衡を処理します。
ステップ5 – データセットの前処理
以下のように特徴と出力ラベルを収集しましょう:
X = df.drop('class_label', axis=1) # 入力特徴量y = df['class_label'] # ターゲット変数
データセットをトレーニングセットとテストセットに分割した後、データセットを前処理する必要があります。
複数の数値特徴があり、それぞれが異なるスケールである場合、数値特徴を前処理する必要があります。一般的な方法は、それらが平均0、分散1になるように変換することです。
scikit-learnのpreprocessingモジュールのStandardScaler
を使用してこれを実現できます。
from sklearn.preprocessing import StandardScalerfrom sklearn.model_selection import train_test_split# データセットをトレーニングセットとテストセットに分割X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 数値特徴のインデックスを取得numerical_feature_indices = list(range(34)) # 数値特徴は列0から33にあると仮定する# スタンダードスケーラーオブジェクトの初期化scaler = StandardScaler()# トレーニングセットの数値特徴を正規化X_train.iloc[:, numerical_feature_indices] = scaler.fit_transform(X_train.iloc[:, numerical_feature_indices])# トレーニングセットで学習したスケーラーを使ってテストセットの数値特徴を正規化X_test.iloc[:, numerical_feature_indices] = scaler.transform(X_test.iloc[:, numerical_feature_indices])
ステップ6 – ロジスティック回帰モデルの構築
ロジスティック回帰分類器をインスタンス化できます。LogisticRegression
クラスは、scikit-learnのlinear_modelモジュールの一部です。
class_weight
パラメータを「balanced」に設定していることに注意してください。これにより、クラスの不均衡を考慮することができます。各クラスに対して、クラスのレコード数に反比例する重みを割り当てることで。
クラスをインスタンス化した後、モデルをトレーニングデータセットにフィットさせることができます:
from sklearn.linear_model import LogisticRegressionmodel = LogisticRegression(class_weight='balanced')model.fit(X_train, y_train)
ステップ7 – ロジスティック回帰モデルの評価
モデルの予測を得るために、predict()
メソッドを呼び出すことができます。
正解率の他にも、適合率、再現率、F1スコアなどのメトリックを含んだ分類レポートも取得できます。
from sklearn.metrics import accuracy_score, classification_reporty_pred = model.predict(X_test)accuracy = accuracy_score(y_test, y_pred)print(f"正解率:{accuracy:.2f}")classification_rep = classification_report(y_test, y_pred)print("分類レポート:\n", classification_rep)
おめでとうございます、最初のロジスティック回帰モデルのコードを作成しました!
結論
このチュートリアルでは、理論と数学からロジスティック回帰分類器のコーディングまで、ロジスティック回帰について詳しく学びました。
次のステップとして、適切なデータセットに対してロジスティック回帰モデルを構築してみてください。
データセットの著作権
IonosphereデータセットはCreative Commons Attribution 4.0 International (CC BY 4.0) ライセンスの下で提供されています:
Sigillito,V.、Wing,S.、Hutton,L.、およびBaker,K.。(1989)。イオンスフィア。UCI Machine Learning Repository。https://doi.org/10.24432/C5W01B.
[Bala Priya C](https://twitter.com/balawc27)はインド出身の開発者兼技術ライターです。彼女は数学、プログラミング、データサイエンス、コンテンツ作成の交差点で働くことが好きです。彼女の関心と専門知識の分野には、DevOps、データサイエンス、自然言語処理が含まれます。彼女は読書、執筆、コーディング、そしてコーヒーを楽しみます!現在、彼女はチュートリアル、ハウツーガイド、意見記事などを執筆し、開発者コミュニティと彼女の知識を共有することに取り組んでいます。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles