【Python】scikit-learnで直線の線形回帰

導入

機械学習の基本的な手法を色々試したいと思い、学習の記録として記事にすることにしました。 難しいことはほとんどせず、解説も少なめですが、ついでに学習中の誰かの助けになればと思います。
今回は、scikit-learnを使って、最も簡単な回帰である線形回帰を試していきます。
jupyter notebook(.ipynb)を使用して学習しているので、データの出力にprint()を明記していないことがあります。お手元で動作させる場合は、適宜読み替えていただくか、同じく.ipynbで実行してください。

データの読みこみ

まずは、今回使うデータの読み込みです。
scikit-learnから読み込める、カリフォルニアの住宅価格データを使用します。
(よく使われていたボストンの住宅価格データは、人権的な問題で避けた方が良いと警告が出るようになりましたね。)

import pandas as pd
from sklearn.datasets import fetch_california_housing

#カリフォルニアの住宅価格データ読み込み
housing = fetch_california_housing()
df = pd.DataFrame(housing.data, columns=housing.feature_names)
#表データの上5件を確認
df.head()

以下のようにデータの列に何があるかを確認できます。

head()でデータの冒頭5件を確認

散布図行列の確認

このままでは、どのデータとどのデータに相関がある(予想できそう)か分からないので、散布図行列を確認してみます。
pandasの機能で、各データ同士の散布図をまとめてチェックすることができます。

#scatter_matrixで、各パラメータ同士の散布図を確認
from pandas.plotting import scatter_matrix
fig = pd.plotting.scatter_matrix(df, figsize=(15,15))

結果は以下の通りです。

散布図行列

当然な感じがしますが、部屋数(AveRooms)と、寝室数(AveBedrms)に正の相関がありそうですね。
この2つを使って、線形回帰をしてみましょう。
これらのデータだけをプロットしたものが以下になります。

#dataFrame.plotで、pandasからプロットできる
df.plot(kind="scatter", x="AveRooms", y="AveBedrms")

実践

いきなりやっちゃいましょう。
線形回帰モデルをmodelに代入し、model.fitでデータに対してフィッティングするだけです。

#scikit-learnの線形回帰
import sklearn.linear_model
import matplotlib.pyplot as plt
import numpy as np

#線形回帰モデルの作成
model = sklearn.linear_model.LinearRegression()

#対象データ取り出し
#データ数*1の行列に変換しておく
x = np.c_[df["AveRooms"]]
y = np.c_[df["AveBedrms"]]

#モデルをデータにフィッティング
model.fit(x,y)

#回帰の式を出力
print(f"y = {model.coef_}x + {model.intercept_}")

#データをプロット
plt.scatter(x, y)

#回帰直線をプロット
plt.plot(x, model.predict(x), color="red")

実行結果