scikit-regressions.py 技術ドキュメント
プログラムの動作
scikit-regressions.py は、Excelファイルから読み込んだ数値データに対して、scikit-learn ライブラリが提供する多様な回帰モデルを適用し、その性能を評価・可視化するためのPythonプログラムです。
主な機能:
データ読み込み: 指定されたExcelファイルからデータを読み込みます。
目的変数と記述子の自動判別: Excelシートの列名に基づき、目的変数(予測対象)と記述子(予測に用いる特徴量)を自動的に分類します。
データ分割と前処理: データセットを訓練データとテストデータに分割し、モデル学習前に標準化を行います。
多様な回帰モデルの適用: 線形回帰、Ridge、Lasso、ElasticNet、多項式回帰、ガウス過程回帰、多層パーセプトロン、ランダムフォレスト、サポートベクトル回帰 (SVR)、確率的勾配降下回帰 (SGDRegressor) など、複数の回帰モデルを選択して適用できます。
モデル評価: 平均絶対誤差 (MAE)、平均二乗誤差 (MSE)、二乗平均平方根誤差 (RMSE)、決定係数 (\(R^2\) スコア) といった主要な回帰評価指標を計算し、表示します。
予測結果の出力: 学習済みモデルによる予測値を元のデータフレームに結合し、新しいExcelファイルとして出力します。入力データに欠損値がある目的変数の行に対しても予測値が書き込まれます。
豊富なグラフによる可視化:
データの分布を示す箱ひげ図。
特徴量間の相関関係を示すヒートマップ。
各特徴量間の関係を示すペアプロット。
データのインデックスに対する実測値と予測値のプロット。
実測値と予測値の関係を示す散布図。
各記述子と目的変数の関係を示す散布図。
解決する課題: このプログラムは、特定のデータセットに対してどの回帰モデルが最も適しているかを短時間で評価し、モデルの性能を視覚的に分析することを支援します。また、未測定のデータポイントに対する予測値の算出も可能にし、様々な分野での意思決定に役立ちます。
原理
scikit-regressions.py は、主に統計的データ処理と機械学習の回帰分析アルゴリズムに基づいています。
データ処理の原理
データの標準化:
sklearn.preprocessing.StandardScalerを使用して、各特徴量を標準正規分布に従うように変換します。これにより、特徴量のスケールの違いがモデルの学習に与える影響を軽減します。標準化は以下の式で行われます。 $\( z = \frac{x - \mu}{\sigma} \)\( ここで、\)x\( は元の特徴量の値、\) \mu \( はその特徴量の平均、\) \sigma \( はその特徴量の標準偏差、\)z$ は標準化された値です。訓練データとテストデータへの分割:
sklearn.model_selection.train_test_splitを使用して、データセットを訓練データとテストデータに分割します。訓練データでモデルを学習させ、テストデータでその汎化性能を評価することで、未知のデータに対するモデルの性能を客観的に測定します。
回帰モデルの原理
プログラムは、以下の様々な回帰モデルをサポートしています。
線形回帰 (Linear Regression): 最小二乗法を用いて、説明変数と目的変数の間の線形関係をモデル化します。 $\( y = \beta_0 + \sum_{i=1}^n \beta_i x_i \)$
Ridge回帰: 線形回帰にL2正則化項 (\( \alpha \sum \beta_i^2 \)) を追加し、係数の大きさにペナルティを課すことで過学習を抑制します。 $\( \min_{\beta} \left( \sum_{j=1}^N (y_j - \beta_0 - \sum_{i=1}^n \beta_i x_{ji})^2 + \alpha \sum_{i=1}^n \beta_i^2 \right) \)$
Lasso回帰: 線形回帰にL1正則化項 (\( \alpha \sum |\beta_i| \)) を追加します。Ridge回帰と同様に過学習を抑制しますが、一部の係数を厳密にゼロにする傾向があるため、特徴量選択の役割も果たします。 $\( \min_{\beta} \left( \sum_{j=1}^N (y_j - \beta_0 - \sum_{i=1}^n \beta_i x_{ji})^2 + \alpha \sum_{i=1}^n |\beta_i| \right) \)$
ElasticNet回帰: Ridge回帰とLasso回帰の正則化項を組み合わせたモデルです。 $\( \min_{\beta} \left( \sum_{j=1}^N (y_j - \beta_0 - \sum_{i=1}^n \beta_i x_{ji})^2 + \alpha \rho \sum_{i=1}^n |\beta_i| + \frac{\alpha(1-\rho)}{2} \sum_{i=1}^n \beta_i^2 \right) \)\( ここで、\) \rho \( はL1比率 (\)l1_ratio$) を表します。
多項式回帰 (Polynomial Regression): 元の特徴量を高次の多項式特徴量に変換(例:\(x \rightarrow x, x^2, x^3\))した後、線形回帰を適用します。これにより非線形な関係をモデル化できます。
ガウス過程回帰 (Gaussian Process Regressor): データの分布がガウス過程に従うと仮定し、予測に加えて予測の不確実性(標準偏差)も提供します。
多層パーセプトロン (MLPRegressor): 複数の隠れ層を持つニューラルネットワークで、非線形な関係を学習する能力に優れています。
ランダムフォレスト回帰 (RandomForestRegressor): 複数の決定木を構築し、それらの予測の平均を取るアンサンブル学習手法です。過学習を抑えつつ高い予測性能を発揮します。
サポートベクトル回帰 (SVR): サポートベクトルマシンを回帰問題に適用したもので、指定された許容誤差 (\( \epsilon \)) 内の誤差はペナルティを課さないように学習します。
確率的勾配降下回帰 (SGDRegressor): 確率的勾配降下法を用いて最適化を行う線形モデルで、特に大規模なデータセットに適しています。
モデル評価指標
モデルの性能は以下の指標で評価されます。
平均絶対誤差 (MAE - Mean Absolute Error): 予測誤差の絶対値の平均。直感的で解釈しやすい指標です。 $\( MAE = \frac{1}{N} \sum_{i=1}^N |y_i - \hat{y}_i| \)$
平均二乗誤差 (MSE - Mean Squared Error): 予測誤差の二乗の平均。大きな誤差に重みを与えるため、外れ値に敏感です。 $\( MSE = \frac{1}{N} \sum_{i=1}^N (y_i - \hat{y}_i)^2 \)$
二乗平均平方根誤差 (RMSE - Root Mean Squared Error): MSEの平方根。誤差の単位が目的変数と同じになるため、MSEよりも解釈しやすい場合があります。 $\( RMSE = \sqrt{MSE} \)$
決定係数 (\(R^2\) スコア - R-squared Score): モデルが目的変数の分散をどれだけ説明できるかを示す指標で、0から1の間の値を取ります。1に近いほどモデルの適合度が高いことを示します。 $\( R^2 = 1 - \frac{\sum_{i=1}^N (y_i - \hat{y}_i)^2}{\sum_{i=1}^N (y_i - \bar{y})^2} \)\( ここで、\)y_i\( は実測値、\)\hat{y}_i\( は予測値、\)\bar{y}$ は実測値の平均です。
必要な非標準ライブラリとインストール方法
scikit-regressions.py を実行するには、以下のPythonライブラリが必要です。
numpypandasopenpyxlscikit-learn(sklearn)matplotlibseaborntklib(カスタムライブラリ)
tklib 以外のライブラリは pip コマンドでインストールできます。
pip install numpy pandas openpyxl scikit-learn matplotlib seaborn
tklib は、このプログラムを開発したユーザーが別途提供するカスタムライブラリです。一般的な pip インストール方法が提供されていない可能性があります。このプログラムを実行するには、tklib ライブラリの適切なバージョンを別途入手し、Pythonがアクセスできるパスに配置する必要があります(例: 環境変数 PYTHONPATH の設定、またはプログラムと同じディレクトリに配置)。
必要な入力ファイル
プログラムは以下の形式のExcelファイル (.xlsx) を入力として期待します。
1行目: ヘッダー行とし、各列のラベル(列名)を記述します。
データ型: すべてのデータは数値データである必要があります。
目的変数と記述子:
目的変数(予測対象)の列は、その列名の先頭に
t:、o:、max:、またはmin:のいずれかのプレフィックスが付いている必要があります。例:t:TargetValueこれらのプレフィックスが付いていない列はすべて記述子(説明変数)として扱われます。
目的変数として指定された列が複数ある場合、プログラムは最初の目的変数のみを使用します。
予測対象データ: 目的変数の列に欠損値 (
NaN) が含まれる行は、予測対象データとして扱われます。これらの行の記述子に基づいて、目的変数の値が予測されます。
例: boston.xlsx (プログラムのデフォルト設定で使用されるファイル名)
Feature1 |
Feature2 |
t:TargetValue |
|---|---|---|
10 |
20 |
100 |
11 |
21 |
105 |
12 |
22 |
|
13 |
23 |
115 |
上記の例では、Feature1 と Feature2 が記述子、t:TargetValue が目的変数です。3行目の t:TargetValue が空欄であるため、この行は予測対象として処理されます。
生成される出力ファイル
プログラムの実行後、以下のファイルが生成されます。
予測結果Excelファイル:
ファイル名: 入力ファイル名に基づき、
{filebody}-predict.xlsxの形式で生成されます。 例: 入力ファイルがboston.xlsxの場合、出力ファイルはboston-predict.xlsxとなります。保存場所: 入力ファイルと同じディレクトリに保存されます。
内容:
元の入力Excelファイルの全データが保持されます。
学習済みモデルによって計算された予測値が、
predictという新しい列として追加されます。この列は、元のデータフレームの最初の列として挿入されます。元のデータで目的変数に欠損値 (
NaN) があった行についても、predict列に予測値が書き込まれます。
ログファイル:
プログラムの標準出力は、入力ファイル名に基づいたログファイルにリダイレクトされます。具体的には、入力ファイルが
input.xlsxの場合、input.logというファイルが生成され、コンソール出力と同じ内容が記録されます。
コマンドラインでの使用例 (Usage)
scikit-regressions.py は、コマンドライン引数を使用して動作をカスタマイズできます。
python scikit-regressions.py [infile] [method] [f_test] [alpha] [l1_ratio] [nmaxiter] [plot_boxplot] [plot_heatmap] [plot_pairplot] [plot_variation] [hlsizes] [mlp_solver] [mlp_activation] [max_depth] [n_estimators] [max_features] [random_state]
引数の説明:
infile: (文字列, 必須) 入力Excelファイルのパス。デフォルト:
boston.xlsx
method: (文字列) 使用する回帰モデルの種類。デフォルト:
rfr選択肢:
linear,ridge,lasso,elnet,poly2~poly5,gpr,mlp,rfr,svr,sgdr
f_test: (浮動小数点数) テストデータとして使用するデータの割合。デフォルト:
0.3(30%)
alpha: (浮動小数点数) Ridge, Lasso, ElasticNet, GPR で使用される正則化パラメータ。デフォルト:
1.0
l1_ratio: (浮動小数点数) ElasticNetで使用されるL1正則化の比率。デフォルト:
0.5
nmaxiter: (整数) モデルの最大反復回数 (Lasso, ElasticNet, MLP で使用)。デフォルト:
1000
plot_boxplot: (整数) 箱ひげ図の表示フラグ (1で表示、0で非表示)。デフォルト:
1
plot_heatmap: (整数) 相関係数ヒートマップの表示フラグ (1で表示、0で非表示)。デフォルト:
1
plot_pairplot: (整数) ペアプロットの表示フラグ (1で表示、0で非表示)。デフォルト:
1
plot_variation: (整数) 各記述子と目的変数のプロットの表示フラグ (1で表示、0で非表示)。デフォルト:
1
hlsizes: (文字列) MLPの隠れ層のサイズをカンマ区切りで指定。例:"10,5"。デフォルト:
"5, 5, 5, 5"
mlp_solver: (文字列) MLPの最適化アルゴリズム。デフォルト:
'lbfgs'選択肢:
'lbfgs','sgd','adam'
mlp_activation: (文字列) MLPの活性化関数。デフォルト:
'relu'選択肢:
'identity','logistic','tanh','relu'
max_depth: (文字列または整数) ランダムフォレストの木の最大深度。""で制限なし。デフォルト:
""
n_estimators: (整数) ランダムフォレストの木の数。デフォルト:
100
max_features: (文字列または整数) ランダムフォレストで各分割で考慮される特徴量の数。デフォルト:
'auto'
random_state: (文字列または整数) データを分割する際の乱数シード。""でNone。デフォルト:
""
コマンドラインでの具体的な使用例
以下の例では、仮に sample_data.xlsx という入力ファイルが存在すると仮定します。このファイルは、「必要な入力ファイル」セクションで説明されている形式に従い、少なくとも1つの目的変数 (t:Target など) と複数の記述子を含むものとします。
デフォルト設定でランダムフォレスト回帰を実行:
python scikit-regressions.py sample_data.xlsx rfr
説明:
sample_data.xlsxを入力とし、ランダムフォレスト回帰 (rfr) を適用します。テストデータはデフォルトの30% (f_test=0.3) が使用され、その他のモデルやプロットのオプションもすべてデフォルト値が適用されます。実行結果:
プログラムの実行状況、訓練データとテストデータそれぞれのMASE、MSE、RMSE、\(R^2\) スコアがコンソールに表示されます。
sample_data-predict.xlsxというExcelファイルが、予測結果を含む形で生成されます。データの箱ひげ図、相関係数ヒートマップ、ペアプロット、インデックスに対する実測値/予測値のプロット、実測値vs予測値の散布図、各記述子vs目的変数の散布図がそれぞれmatplotlibのウィンドウとしてポップアップ表示されます。これらのウィンドウは、ユーザーがターミナルでEnterキーを押すまで開いたままになります。
Lasso回帰を適用し、正則化を強化、ペアプロットを非表示にする:
python scikit-regressions.py sample_data.xlsx lasso 0.2 2.5 0.5 2000 1 1 0 1
説明:
sample_data.xlsxを入力とし、Lasso回帰 (lasso) を実行します。テストデータ割合を0.2(20%) に、Lassoの正則化パラメータalphaを2.5に設定して正則化を強化し、モデルの最大反復回数nmaxiterを2000に増やします。plot_pairplotを0に設定しているため、ペアプロットは表示されません。実行結果:
Lassoモデルによる評価指標がコンソールに表示されます。正則化が強化されているため、一部の記述子の係数がゼロに近づくか、ゼロになる可能性があります。
sample_data-predict.xlsxが更新され、Lassoモデルによる予測値が書き込まれます。ペアプロット以外のグラフがポップアップ表示されます。
多層パーセプトロン (MLP) 回帰を特定の隠れ層構成で実行:
python scikit-regressions.py sample_data.xlsx mlp 0.3 1.0 0.5 1000 1 1 1 1 "10,5" sgd tanh
説明:
sample_data.xlsxを入力とし、多層パーセプトロン回帰 (mlp) を実行します。隠れ層のサイズを"10,5"(10ニューロンの層が1つ、5ニューロンの層が1つ)、最適化ソルバーを'sgd'(確率的勾配降下法)、活性化関数を'tanh'にそれぞれ設定します。その他のプロットオプションはデフォルト (1) です。実行結果:
MLPモデルの学習プロセス(verbose設定による)と、訓練データ・テストデータに関する評価指標がコンソールに表示されます。
sample_data-predict.xlsxが更新され、MLPモデルによる予測値が書き込まれます。全ての種類のグラフがポップアップ表示されます。