どうもニコイチです。前回は、モデルの精度を測るための評価関数RMSEを学びました。今回は、いよいよ予測モデルの作成に挑戦します。今回は、最も基本的なモデルの1つである、重回帰モデルを作成します。
全編はこちらから

モデルとは?
モデルとは、説明変数と目的変数の間の関係性を表現する「箱」のようなものです。この箱は、過去のデータ(学習データ)から、説明変数と目的変数の関係性を学習します。学習後、新しい説明変数を入力すると、その説明変数に対応する目的変数を予測することができます。
モデルのイメージ
例えば、あなたが「部屋の広さ」と「家賃」の関係性を知りたいとします。
部屋の広さ (m²) | 家賃 (万円) |
20 | 8 |
30 | 10 |
40 | 12 |
50 | 14 |
このデータを使ってモデルを作ると、モデルは「部屋の広さが広くなるほど、家賃が高くなる」という関係性を学習します。そして、学習後に「部屋の広さ60m²」という新しいデータを入力すると、モデルは「家賃は16万円くらいだろう」と予測してくれます。
モデルを作るということ
モデルを作るということは、モデルが説明変数と目的変数の関係性を学習するということです。この学習には、大きく分けて2つの方法があります。
- 数式モデル: 説明変数と目的変数の関係性を数式で表現するモデル。(今回の重回帰モデル)
- ルールベースモデル: 説明変数と目的変数の関係性をルールで表現するモデル。
今回は、数式モデルである重回帰モデルについて学んでいきます。
線形回帰モデルとは?
線形回帰モデルは、説明変数と目的変数の関係性を直線で表現するモデルです。例えば、説明変数が1つの場合は、以下の式で表されます。
y = ax + b
- y: 目的変数(予測したい値)
- x: 説明変数(予測のヒントになる値)
- a: 傾き(回帰係数)
- b: 切片
この式は、中学で習った一次関数の式と同じ形をしています。a は直線の傾きを表し、x が1増えると y が a だけ増えることを示します。b は直線の切片を表し、x が0のときの y の値を表します。
単回帰モデルと重回帰モデル
- 単回帰モデル: 説明変数が1つの場合(例:部屋の広さから家賃を予測する)
- 重回帰モデル: 説明変数が2つ以上の場合(例:部屋の広さ、駅からの距離、築年数などから家賃を予測する)
今回の分析では、複数の説明変数を使って宿泊料金を予測するため、重回帰モデルを使います。
重回帰モデルは、以下の式で表されます。
y = a1x1 + a2x2 + a3x3 + ... + b
- y: 目的変数
- x1, x2, x3, …: 説明変数
- a1, a2, a3, …: 回帰係数(それぞれの説明変数の傾き)
- b: 切片
線形回帰モデルの特徴
- 解釈しやすい: 回帰係数を見ることで、どの説明変数が目的変数にどれだけ影響を与えているかを知ることができます。
- シンプル: 計算が簡単で、高速に学習できる。
- 非線形な関係には不向き: 説明変数と目的変数の関係が直線で表現できない場合は、予測精度が低くなる可能性がある。
重回帰モデルをPythonで作ってみよう
それでは、実際にPythonで重回帰モデルを作ってみましょう。
1. 必要なライブラリのインポート
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import numpy as np
from sklearn.metrics import mean_squared_error as MSE
2. データの準備
前回までと同様に、データを読み込み、ダミー変数化し、学習データと評価データに分割します。
# CSVファイルの読み込み
data = pd.read_csv('宿泊価格について_demo.csv')
select_columns = ['room_type','accommodates','bed_type','bathrooms','cleaning_fee']
dummy_data = pd.get_dummies(data[select_columns], drop_first=True)
# 目的変数
y = data['y']
# 学習データと評価データに分割
X_train, X_test, y_train, y_test = train_test_split(dummy_data, y, random_state=1234)
3. 重回帰モデルの作成
LinearRegression を使って、重回帰モデルを作成します。
# モデルの準備
lr = LinearRegression()
# モデルの学習
lr.fit(X_train, y_train)
4. モデルの係数と切片の確認
学習したモデルの回帰係数(傾き)と切片を表示します。
# 偏回帰係数の表示
print(pd.DataFrame(lr.coef_, index=X_train.columns))
# 切片の表示
print(lr.intercept_)
回帰係数を見ることで、それぞれの説明変数が目的変数にどれだけ影響を与えているかを知ることができます。
例えば、accommodates の係数が20.93の場合、宿泊人数が1人増えると、宿泊料金が約20.93ドル増えることを意味します。
5. 学習データに対する予測
学習したモデルを使って、学習データに対する予測値を算出します。
# 学習データに対する予測
y_pred_train = lr.predict(X_train)
print(y_pred_train)
6. 学習データに対する予測精度の評価
学習データに対する予測精度をRMSEを使って評価します。
# RMSEの算出
rmse_train = np.sqrt(MSE(y_train, y_pred_train))
print(rmse_train)
7. 評価データに対する予測と予測精度の評価
学習データと同様に、評価データに対しても予測を行い、RMSEで評価します。
# 評価データに対する予測
y_pred_test = lr.predict(X_test)
# RMSEの算出
rmse_test = np.sqrt(MSE(y_test, y_pred_test))
print(rmse_test)
過学習について
モデルの学習データに対する予測精度と評価データに対する予測精度を比較することで、モデルが過学習を起こしているかどうかを確認することができます。
- 過学習: 学習データに対する精度は高いが、評価データに対する精度が低い状態
- 汎化性能が高い: 学習データと評価データの両方に対して、精度が高い状態
過学習を起こしている場合は、モデルの複雑さを調整したり、データを増やしたりする必要があります。
今回のモデルでは、学習データのRMSEが約135、評価データのRMSEが約131となっています。評価データのRMSEが学習データのRMSEよりも小さくなっており、過学習は起きていないと考えられます。
まとめ
今回は、重回帰モデルを使って予測モデルを作成する方法を学びました。
- モデルとは、説明変数と目的変数の関係性を学習する箱
- 線形回帰モデルは、説明変数と目的変数の関係性を直線で表現するモデル
- 重回帰モデルは、説明変数が複数ある場合に使う線形回帰モデル
- 重回帰モデルの学習には、LinearRegression を使う
- モデルの回帰係数を見ることで、どの説明変数が目的変数にどれだけ影響を与えているかを知ることができる
- モデルの予測精度は、RMSEを使って評価できる
- 学習データと評価データの精度を比較することで、過学習かどうかを判断できる
今回の記事はここまでです。次回は、今回作成した予測モデルの精度を向上させるための方法について解説します。お楽しみに!
コメント