Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで実践する線形回帰:データ探索からモデル構築・精度改善までの完全ガイド


線形回帰は、機械学習における最もシンプルで標準的な手法の1つであり、2つの変数の間に正の相関があるか負の相関があるかを判定するために広く使われています。

また、線形回帰は迅速な予測分析に役立つ数少ない強力なツールでもあります。この記事では、Pythonのpandasパッケージを使ってデータを読み込み、線形回帰モデルの推定・解釈・可視化までを一通り行う方法を解説します。

本題に入る前に、まず「回帰」とは何かを確認しておきましょう。

回帰とは?

回帰とは、従属変数(目的変数)と独立変数(説明変数)の間の関係性をモデル化するための予測モデリング手法の一種です。

回帰の主な種類

  • 線形回帰
  • ロジスティック回帰
  • 多項式回帰
  • ステップワイズ回帰

線形回帰の活用シーン

  • トレンドや売上予測の評価
  • 価格変更が与える影響の分析
  • リスクの評価

線形回帰モデルを構築する手順

  • 環境をセットアップし、データセットとJupyter Notebook(本チュートリアルではこれを使用。Anacondaなど他のIDEでも問題ありません)を準備します。

  • 必要なパッケージとデータセットをインポートします。

  • 読み込んだデータセットの中身を探索します。

  • データセットに対して線形回帰を実行します。

  • 変数と時間帯の関係についても考察します。

  • まとめ。

セットアップ

データセットは以下のリンクからダウンロードできます。

https://en.openei.org/datasets/dataset/649aa6d3-2832-4978-bc6e-fa563568398e/resource/b710e97d-29c9-4ca5-8137-63b7cf447317/download/building1retail.csv

このデータセットを使用して、外気温(OAT)を説明変数とした建物の電力使用量のモデルを作成します。

CSVファイルは、Jupyter NotebookやIDEが動作しているフォルダと同じ場所に保存してください。

必要なライブラリとデータセットのインポート

まず必要なライブラリをインポートし、続いてpandasを使ってデータセットを読み込みます。

# 必要なライブラリのインポート

import pandas as pd
# 数値計算用
import numpy as np
from scipy import stats
from datetime import datetime
from sklearn import preprocessing
from sklearn.model_selection import KFold
from sklearn.linear_model import LinearRegression
# グラフ描画用
import matplotlib.pyplot as plt
%matplotlib inline

# データの読み込み
df = pd.read_csv('building1retail.csv', index_col=[0],
date_parser=lambda x: datetime.strptime(x, "%m/%d/%Y %H:%M"))
df.head()

出力結果

Pythonで実践する線形回帰:データ探索からモデル構築・精度改善までの完全ガイド

データセットの探索

それではまず、pandasでプロットしてデータセットを可視化してみましょう。

df.plot(figsize=(22,6))

出力結果

Pythonで実践する線形回帰:データ探索からモデル構築・精度改善までの完全ガイド

x軸には2010年1月〜2011年1月のデータが表示されています。

上記の出力を見ると、グラフには2つの気になる点があります。

  • 欠損データがないように見えること。確認するには、次のコードを実行します。

df.isnull().values.any()

出力結果

False

「False」という結果は、データフレームにNULL値が存在しないことを示しています。

  • データに異常値(長く下方向へ伸びるスパイク)が見られること。

異常値(外れ値)は、実験上のエラーによるものか、あるいは実際の値である場合があります。いずれの場合も、外れ値は回帰直線の傾きに大きな悪影響を与えるため、今回は除外することにします。

外れ値を除外する前に、まずデータがどのような分布に従っているか確認しましょう。

df.hist()

出力結果

Pythonで実践する線形回帰:データ探索からモデル構築・精度改善までの完全ガイド

上のヒストグラムから、データがおおよそ正規分布に従っていることがわかります。

そこで、平均から標準偏差の3倍以上離れた値をすべて除外し、新しいデータフレームをプロットします。

std_dev = 3
df = df[(np.abs(stats.zscore(df)) < float(std_dev)).all(axis=1)]
df.plot(figsize=(22, 6))

出力結果

Pythonで実践する線形回帰:データ探索からモデル構築・精度改善までの完全ガイド

上記の出力から、スパイクがある程度除去され、データがクリーンになったことが確認できます。

線形関係の検証

OATと電力使用量の間に線形関係があるかどうかを調べるために、シンプルな散布図をプロットしてみましょう。

plt.scatter(df['OAT (F)'], df['Power (kW)'])

出力結果

Pythonで実践する線形回帰:データ探索からモデル構築・精度改善までの完全ガイド

線形回帰の実行

モデルの構築と性能評価にはScikit-learnモジュールを使用します。また、モデルの汎化性能を測るために、k分割交差検証(k=3)を利用します。

X = pd.DataFrame(df['OAT (F)'])
y = pd.DataFrame(df['Power (kW)'])
model = LinearRegression()
scores = []
kfold = KFold(n_splits=3, shuffle=True, random_state=42)
for i, (train, test) in enumerate(kfold.split(X, y)):
    model.fit(X.iloc[train,:], y.iloc[train,:])
    score = model.score(X.iloc[test,:], y.iloc[test,:])
    scores.append(score)
print(scores)

出力結果

[0.38768927735902703, 0.3852220878090444, 0.38451654781487116]

このプログラムでは、model = LinearRegression()で線形回帰モデルを作成し、forループによってデータセットを3つのフォールドに分割しています。ループ内で各フォールドのデータを使ってモデルを学習させ、その決定係数スコアをリストに追加することで性能を評価しています。

しかし、この結果(スコア約0.38)は決して良く言えず、まだ改善の余地がありそうです。

時間帯の特徴を取り入れる

電力使用量は時間帯に大きく依存します。そこで、この情報をOne-hotエンコーディングによってカテゴリ変数としてモデルに組み込みます。時間帯ごとの特徴を加えることで、モデルはより多くの説明変数から電力消費パターンを学習できるようになります。

model = LinearRegression()
scores = []
kfold = KFold(n_splits=3, shuffle=True, random_state=42)
for i, (train, test) in enumerate(kfold.split(X, y)):
   model.fit(X.iloc[train,:], y.iloc[train,:])
   scores.append(model.score(X.iloc[test,:], y.iloc[test,:]))
print(scores)

出力結果

[0.8074246958895391, 0.8139449185141592, 0.8111379602960773]

スコアが約0.38から約0.81へと大幅に向上しました。時間帯という特徴量を追加したことで、モデルの説明力が大きく改善されたことがわかります。

まとめ

この記事では、データセットの探索と前処理(外れ値の除外など)の基本を学び、回帰モデルへの適合までを行いました。さらに、交差検証による性能評価を実施し、モデルの弱点を発見して時間帯の特徴を取り入れることで精度を改善する一連の流れを体験しました。これらの手順は、実務における回帰分析の出発点として非常に有用です。


  1. PyTorchを使った線形回帰の実装方法を徹底解説

    線形回帰とは 単純線形回帰の基礎 2つの連続変数の間にある関係性を把握するために用いられる手法です。 具体例: x = 独立変数(例:体重) y = 従属変数(例:身長) 関係式は y = αx + β という形式で表されます。 それでは、実際にプログラムを通して単純線形回帰の仕組みを見ていきましょう。 #単純線形回帰 import numpy as np import matplotlib.pyplot as plt np.random.seed(1) n = 70 x = np.random.randn(n) y = x * np.random.randn(n) colo

  2. PythonでのCX_Freezeの使い方:スクリプトを実行ファイル(EXE)に変換する方法

    はじめに 何か面白いものを作りたいという欲求は人間の本能であり、完成したものは誰かに共有したくなるものです。Pythonでもその願いを叶えられます。ただし、作成したPythonスクリプトをそのまま共有するには、相手のマシンにも同じバージョンのPythonと、プログラムで使用しているすべてのモジュールがインストールされている必要があります。 そこで役立つのがCX_Freezeです。このツールを使えば、Pythonがインストールされていない環境でも動作するスタンドアロンの実行ファイル(.exe)を作成できます。 CX_Freezeのインストール まず、コマンドプロンプトで以下のコマンドを実行し、c