はじめに
このページでは、機械学習の基本的な手法である重回帰分析を用いて、カリフォルニア州の住宅価格を予測する方法を学びます。重回帰分析は、複数の説明変数(特徴量)を使用して目的変数を予測する手法です。初めてプログラミングや機械学習に触れる方でも理解できるよう、ステップバイステップで解説していきます。
使用するデータセットは、カリフォルニア州の住宅に関する情報です。この中から、世帯の平均収入(MedInc)、住宅の築年数(HouseAge)、平均部屋数(AveRooms)を用いて住宅価格を予測するモデルを構築します。
それでは、実際にPythonコードを見ながら、重回帰分析の流れを詳しく見ていきましょう。
ライブラリのインポート
まず、必要なライブラリをインポートします。
import pandas as pd
from sklearn import datasets
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
各ライブラリの役割を説明します:
pandas
: データの操作や分析に使用します。表形式のデータを扱うのに適しています。sklearn
(scikit-learn): 機械学習のアルゴリズムや関連する機能を提供するライブラリです。datasets
: サンプルデータセットを提供します。metrics
: モデルの性能評価に使用する指標を計算します。model_selection
: データの分割やモデル選択に関する機能を提供します。linear_model
: 線形回帰モデルを含む、様々な回帰モデルを提供します。
これらのライブラリをインポートすることで、データの読み込みから分析、モデリング、評価まで一連の作業を行うことができます。
データセットのインポート
次に、scikit-learnに用意されているカリフォルニア住宅データセットをインポートします。
dataset = datasets.fetch_california_housing()
fetch_california_housing()
関数を使用して、カリフォルニア住宅データセットをダウンロードし、dataset
変数に格納します。このデータセットには、カリフォルニア州の各地域の住宅に関する様々な特徴量と、それに対応する住宅価格の中央値が含まれています。
データセットの確認
データセットの内容を確認します。
print('特徴量:', dataset.feature_names)
print('目的変数:', dataset.target_names)
pd.set_option('display.max_columns', None)
df = pd.DataFrame(dataset.data, columns=dataset.feature_names)
df[dataset['target_names'][0]] = dataset.target
df.head()
出力
特徴量: ['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude']
目的変数: ['MedHouseVal']

ここでは以下の操作を行っています:
- データセットの特徴量(説明変数)と目的変数の名前を表示します。
- pandasの表示オプションを設定し、全ての列を表示できるようにします。
- データセットの特徴量をpandas DataFrameに変換します。
- 目的変数(住宅価格の中央値)をDataFrameに追加します。
- データの最初の5行を表示して、内容を確認します。
これらの操作により、データセットの構造や内容を把握することができます。カリフォルニア住宅データセットには、MedInc(世帯の平均収入)、HouseAge(住宅の築年数)、AveRooms(平均部屋数)などの特徴量が含まれています。
説明変数と目的変数に分割
次に、分析に使用する説明変数と目的変数を選択し、データを分割します。
select_features = ['MedInc', 'HouseAge', 'AveRooms']
X = df.loc[:1000, select_features].values
y = df.loc[:1000, dataset['target_names'][0]].values
ここでは以下の操作を行っています:
select_features
に、使用する説明変数(MedInc、HouseAge、AveRooms)を指定します。X
に説明変数のデータを格納します。ここでは最初の1000行のみを使用しています。y
に目的変数(住宅価格の中央値)のデータを格納します。同じく最初の1000行のみです。
説明のために1000行に制限していますが、実際の分析では全データを使用することが一般的です。重回帰分析では、複数の説明変数を使用することで、より精度の高い予測モデルを構築することができます。
訓練データとテストデータに分割
データを訓練用とテスト用に分割します。
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=0)
train_test_split
関数を使用して、データを訓練用とテスト用に分割します。
test_size=0.3
: テストデータの割合を30%に設定します。random_state=0
: 乱数のシードを固定し、毎回同じ結果が得られるようにします。
データを分割する理由は、モデルの汎化性能を適切に評価するためです。訓練データでモデルを学習し、テストデータで性能を評価することで、未知のデータに対する予測性能を推定できます。
訓練データによるモデルの学習
重回帰モデルを作成し、訓練データを使って学習させます。
regressor = LinearRegression()
regressor.fit(X_train, y_train)
LinearRegression()
で線形回帰モデルのインスタンスを作成します。fit()
メソッドを使用して、訓練データ(X_train, y_train)でモデルを学習させます。
この過程で、モデルは訓練データの特徴量(MedInc、HouseAge、AveRooms)と目的変数(住宅価格)の関係を学習し、最適な回帰平面を見つけ出します。重回帰分析では、各説明変数に対して係数(重み)が計算され、これらの係数を用いて予測を行います。
新しいデータポイントでの予測
学習したモデルを使って、新しいデータポイントでの予測を行います。
new_data = [[8.0, 40, 17]]
pred_label = regressor.predict(new_data)[0]
print(f'予測した{dataset.target_names}の値: {pred_label:.3f}')
出力
予測した['MedHouseVal']の値: 3.345
ここでは、世帯の平均収入(MedInc)が8.0、住宅の築年数(HouseAge)が40年、平均部屋数(AveRooms)が17の場合の住宅価格を予測しています。predict()
メソッドを使用して予測を行い、結果を小数点以下3桁まで表示しています。
テストデータで予測
次に、テストデータ全体に対して予測を行います。
y_pred = regressor.predict(X_test)
predict()
メソッドを使用して、テストデータ(X_test)に対する予測を行い、結果をy_pred
に格納します。これにより、モデルの性能を評価する準備が整います。
モデルの性能評価
モデルの性能を評価するために、平均二乗誤差(MSE)とR二乗(R^2)スコアを計算します。
print(f'MSE: {mean_squared_error(y_test, y_pred):.3f}')
print(f'R^2: {r2_score(y_test, y_pred):.3f}')
出力
MSE: 0.339
R^2: 0.606
- 平均二乗誤差(MSE):予測値と実際の値の差(誤差)の二乗の平均です。0に近いほど良いモデルとされています。
- R二乗(R^2)スコア:モデルの当てはまりの良さを示す指標です。1に近いほど良いモデルで、0に近いほど悪いモデルとされています。負の値の場合は非常に悪いモデルを意味します。
これらの指標を用いることで、モデルがどの程度正確に予測できているかを数値的に評価できます。重回帰分析では、複数の説明変数を使用することで、単回帰分析よりも高い精度を得られることが期待されます。
まとめ
このチュートリアルでは、カリフォルニア住宅データセットを使用して、重回帰分析の基本的な流れを学びました。
この例では、世帯の平均収入(MedInc)、住宅の築年数(HouseAge)、平均部屋数(AveRooms)を使用して住宅価格を予測するモデルを作成しました。重回帰分析を使用することで、複数の要因が目的変数に与える影響を同時に考慮することができます。
重回帰分析は、多くの実世界の問題に適用可能な強力な手法です。ただし、説明変数間に強い相関がある場合(多重共線性)や、非線形の関係がある場合には注意が必要です。より複雑なデータセットや問題に対しては、正則化手法(リッジ回帰、ラッソ回帰など)や非線形モデルの使用を検討することもあります。
このコードを基に、様々なデータセットで実験を行い、重回帰分析の理解を深めてください。また、各説明変数の重要度(係数の大きさ)を分析したり、残差プロットを作成したりすることで、モデルの詳細な挙動を理解することができます。
[mathjax]
本コンテンツへの意見や質問