導入
機械学習の基本的な手法を色々試したいと思い、学習の記録として記事にすることにしました。
難しいことはほとんどせず、解説も少なめですが、ついでに学習中の誰かの助けになればと思います。
今回は、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()
以下のようにデータの列に何があるかを確認できます。
散布図行列の確認
このままでは、どのデータとどのデータに相関がある(予想できそう)か分からないので、散布図行列を確認してみます。
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")