こんにちは!ぼりたそです!
今回はPythonにてCSVファイルを入力するだけでロジスティック回帰を実行するコードを実装しましたので、ご紹介と解説記事を作成しました。
この記事は以下のトピックでまとめています。
それでは順に解説していきます。
ロジスティック回帰とは?
まずはロジスティック回帰について簡単に説明いたします。
ロジスティック回帰とは二値分類問題(「Yes」 or 「No」などの二択問題)を解く場合に使用するモデルになります。
従って、ロジスティック回帰を使えば、メールがスパムかどうか、顧客が製品を購入するかどうかなどを確率も込みで予測することができるのです。
詳細については以下の記事についてまとめてあるので、ご参照いただければと思います。
今回はこのロジスティック回帰についてCSVを入力するだけで実行し、予測までしてくれるコードを実装しました。
実装コードの仕組み
それでは次に実装コードの仕組みについて説明していきます。
実装コードは大きく入力データのファイルパスを設定するとモデルの精度や予測結果が出力されるようになっています。
入力データ及び出力データについては以下のようになっています。
■入力データ
- 学習用データ:
CSVファイルでの入力を想定しており、一列目に目的変数、二列目以降は各説明変数を格納するようにデータを作成ください。また、目的変数は二値(0 or 1など)で説明変数に文字列が含まれないようにして下さい。
- 予測用データ:
学習用データから構築したモデルにより予測するためのデータです。CSVファイルでの入力を想定しております。予測したい説明変数のデータを格納するようにデータを構築して下さい。また、説明変数は学習用データと同じ並び順になるようにして下さい。
■出力データ
- VIFの出力(多重共線性チェック):
多重共線性がどの程度あるかをチェックするために各説明変数のVIFをCSVファイルにて出力します。
- クロスバリデーションの結果出力:
学習用データから構築したロジスティック回帰モデルについて、モデルの精度を確認するためにクロスバリデーションを行い、その結果をCSVファイルとして出力しています。foldごとの $r^2$ 値とその平均を出力するようにしています。
- 編回帰係数の出力:
学習用データから構築したロジスティック回帰モデルから各説明変数の編回帰係数をCSVファイルとして出力しています。
- 予測結果の出力:
入力した予測用データから構築したモデルにより予測結果を計算し、予測用データの一列目に追加してCSVファイルにて出力するようになっています。
実装コードと解説
それでは実装したコードとその解説をしていきます。
実装したコードは以下の通りです。
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score, LeaveOneOut, KFold
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import r2_score
from statsmodels.stats.outliers_influence import variance_inflation_factor
import statsmodels.api as sm
# CSVデータの読み込み
input_csv = "train_data.csv" # 入力CSVファイル名を指定
predict_csv = "prediction_data.csv" # 予測用CSVファイル名を指定
data = pd.read_csv(input_csv)
# 目的変数と説明変数の分離
y = data.iloc[:, 0]
X = data.iloc[:, 1:]
# データの標準化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# VIFの計算
X_with_const = sm.add_constant(X_scaled)
vif = pd.DataFrame()
vif["feature"] = X.columns
vif["VIF"] = [variance_inflation_factor(X_with_const, i+1) for i in range(X_scaled.shape[1])]
# VIFの結果をCSVへ出力
vif.to_csv("vif_result.csv", index=False)
# クロスバリデーションとr2値の計算
if len(data) <= 10:
cv = LeaveOneOut()
else:
cv = KFold(n_splits=10, shuffle=True, random_state=1)
model = LogisticRegression()
scores = cross_val_score(model, X_scaled, y, cv=cv, scoring='r2')
# クロスバリデーションの結果をCSVへ出力
cv_results = pd.DataFrame({"fold": range(1, len(scores) + 1), "r2": scores})
cv_results.loc["mean"] = ["mean", np.mean(scores)]
cv_results.to_csv("cross_validation_results.csv", index=False)
# ロジスティック回帰モデルのフィッティング
model.fit(X_scaled, y)
# 編回帰係数をCSVへ出力
coefficients = pd.DataFrame({"feature": X.columns, "coefficient": model.coef_[0]})
coefficients.to_csv("regression_coefficients.csv", index=False)
# 予測用CSVデータから目的変数の予測
predict_data = pd.read_csv(predict_csv)
predict_data_scaled = scaler.transform(predict_data)
predictions = model.predict(predict_data_scaled)
# 予測結果を入力ファイルの一列目に追加して出力
predict_data.insert(0, 'predicted_value', predictions)
predict_data.to_csv("predictions_with_input.csv", index=False)
実装コードの構成としては大きく6つになっています。
- 学習用データ前処理
- データスケーリング
- VIFの計算&出力
- クロスバリデーションの実行&結果出力
- モデルのフィッティングと編回帰係数の出力
- データ予測&出力
以下、順に説明していきます。
学習用データ前処理
まずは学習用データ前処理のコードについて説明していきます。
実装コードの以下の部分で処理しています。
# CSVデータの読み込み
input_csv = "train_data.csv" # 入力CSVファイル名を指定
predict_csv = "prediction_data.csv" # 予測用CSVファイル名を指定
data = pd.read_csv(input_csv)
# 目的変数と説明変数の分離
y = data.iloc[:, 0]
X = data.iloc[:, 1:]
まずは入力ファイルとして学習用データと予測用データのCSVファイルのパスを指定します。
次に学習用データの目的変数と説明変数の分離として一列目の目的変数をy, 二列目以降の説明変数をXとして変数に代入しています。
データスケーリング
次にデータのスケーリング処理について説明します。
実装コードでは以下の部分で処理しています。
# データの標準化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
これは単純にStandardScalerクラスをインスタンス化して説明変数Xを標準化しています。
VIFの計算&出力
次にVIFの計算&出力について説明します。
実装コード内では以下の部分で処理しています。
# VIFの計算
X_with_const = sm.add_constant(X_scaled)
vif = pd.DataFrame()
vif["feature"] = X.columns
vif["VIF"] = [variance_inflation_factor(X_with_const, i+1) for i in range(X_scaled.shape[1])]
# VIFの結果をCSVへ出力
vif.to_csv("vif_result.csv", index=False)
まず、VIF用のデータフレームを定義し、説明変数の名称をfeature列として設定します。
次にvariance_inflation_factorのメソッドを使用してVIFを計算してVIF列としてデータフレームに追加しています。
最後にvif_result.csvとしてCSVファイルで出力しています。
クロスバリデーションの実行&結果出力
次にクロスバリデーションの実行&結果出力について説明します。
実装コードでは以下の部分で処理しています。
# クロスバリデーションとr2値の計算
if len(data) <= 10:
cv = LeaveOneOut()
else:
cv = KFold(n_splits=10, shuffle=True, random_state=1)
model = LogisticRegression()
scores = cross_val_score(model, X_scaled, y, cv=cv, scoring='r2')
# クロスバリデーションの結果をCSVへ出力
cv_results = pd.DataFrame({"fold": range(1, len(scores) + 1), "r2": scores})
cv_results.loc["mean"] = ["mean", np.mean(scores)]
cv_results.to_csv("cross_validation_results.csv", index=False)
まず、クロスバリデーションを実行するクラスをインスタンス化しています。学習データの数が10以下の場合はLeaveOneOutクロスバリデーションでそれより大きければ10Foldクロスバリデーションのクラスをインスタンス化しています。
次にロジスティック回帰のモデル構築用としてLogisticRegressionをインスタンス化し、cross_val_scoreにてクロスバリデーションを実行しています。
最後にクロスバリデーションの結果をFoldごとに $r^2$ 値とそれらを平均した$r^2$ 値をデータフレームに格納し、CSVファイルとして出力しています。
モデルのフィッティングと編回帰係数の出力
次にモデルのフィッティングと編回帰係数の出力について解説していきます。
実装コードでは以下の部分で処理しています。
# ロジスティック回帰モデルのフィッティング
model.fit(X_scaled, y)
# 編回帰係数をCSVへ出力
coefficients = pd.DataFrame({"feature": X.columns, "coefficient": model.coef_[0]})
coefficients.to_csv("regression_coefficients.csv", index=False)
まずはmodel.fitで学習用データのX, yを引数としてロジスティック回帰を実行しています。
次に構築したモデルから編回帰係数の情報を抽出し、データフレームに格納しています。最後にregression_coefficients.csvとしてCSVファイルとして出力しています。
データ予測&出力
最後にデータ予測&出力について説明していきます。
実装コードでは以下の部分で処理しています。
# 予測用CSVデータから目的変数の予測
predict_data = pd.read_csv(predict_csv)
predict_data_scaled = scaler.transform(predict_data)
predictions = model.predict(predict_data_scaled)
# 予測結果を入力ファイルの一列目に追加して出力
predict_data.insert(0, 'predicted_value', predictions)
predict_data.to_csv("predictions_with_input.csv", index=False)
まず、最初に入力した予測用データのファイルパスからCSVを読み込み、スケーリングしています。
次にmodel.predictのメソッドによりデータの予測を行なっています。
最後に予測したデータを入力した説明変数の一列目に追加し、CSVデータとして再出力しています。
以上がロジスティック回帰の実行コードについての説明になります。
終わりに
いかがでしたでしょうか?ロジスティック回帰は簡単に実行できたりしますが、多重共線性や編回帰係数などを出力してくれるプログラムなどはあまりないかな?と思い作成してみました。少しでも皆様のお役に立てたなら幸いです。