ギークなエンジニアを目指す男

機械学習系の知識を蓄えようとするブログ

重回帰分析を行なってみたことのまとめ。その2(Python)

前回に引き続き、重回帰分析を行なっていきます。
今回は実際にモデルを作成し、そのモデルを使って訓練→検証をおこないます。

前回記事はこちら

taxa-program.hatenablog.com

モデルの構築と検証

実際にモデルの構築、検証に関しては3行で終わります。
これはsklearnという魔法のようなライブラリのおかげです。
実際に重回帰分析に使用される数学などは、google先生に聞いてみてください。
気が向いたら、自分が勉強したことを記事にするかもしれません。

さて、前置きが長くなりましたが、下記がコードです。

# ライブラリのimport 今回は重回帰分析で使用する部分のみをimport
from sklearn.linear_model import LinearRegression
# モデルの宣言
model = LinearRegression()
# モデルの学習
model.fit(X,y)
# 検証(決定係数の計算)
model.score(X,y)

これだけです。ちなみに、前回記事を振り返っていただけると分かるのですが、変数Xには説明変数(家の広さ、グレードなど)、yには目的変数(家賃)が格納されています。

さて、これで結果はどのようになったかというと・・・

f:id:taxa_program:20180518000350p:plain

こんな感じ。ちなみに決定係数とは何かと言うと・・・

独立変数(説明変数)が従属変数(被説明変数)のどれくらいを説明できるかを表す値である。寄与率と呼ばれることもある。標本値から求めた回帰方程式のあてはまりの良さの尺度として利用される。

1に近ければ近いほど、説明変数を使って目的変数を表現できることを表します。

ここまででは、元データの全てを利用して学習しましたが、この学習モデルがどのくらいの制度で家賃を予測できるのか、検証してみたくなるはずです。次のセクションで、元データを訓練用のトレーニングデータと、検証用のテストデータに分割し、学習→検証の流れを行なってみます。

訓練データと検証データに分割

次にデータを訓練用と検証用に分割してみましょう。
分割するのには理由があります。
例えば、受験に備えて10年分の過去問を購入し、10年分全ての過去問で勉強(学習)したとしましょう。
では、きちんと学習できているか確認するにはどうすれば良いでしょうか。
ここで、過去問10年分でテスト(検証)を行なってしまうのはNGです。なぜなら、もう答えを知ってしまっているからです。(人間では全て暗記するのは至難の技ですが・・・)

このような場合機械学習では、例えば前半5年分のデータを学習用とし、後半5年分のデータで実力テスト(検証)をおこなったりします。このためにデータの分割が必要だったりするわけです。

では実際にどのように分割するか見てみましょう。

# 訓練データと検証データの分割に必要なライブラリのimport
from sklearn.model_selection import train_test_split
# 訓練データと検証データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.4, random_state=1) #40%をテスト、60%を学習用データとして設定。random_stateは乱数のシードを固定(再現性の確保)
# 訓練データでモデルの学習
model.fit(X_train, y_train)
# 検証 ← 検証データでモデルのスコアを検証
model.score(X_test, y_test)

f:id:taxa_program:20180518003242p:plain

なかなか良いスコアですね。
試しに、訓練データで検証した場合も見てみましょう。当たり前ですが、訓練データで学習しているため、検証データで検証するよりもスコアがよくなるはずです。

# 検証 ← 訓練データでモデルのスコアを検証
model.score(X_train, y_train)

f:id:taxa_program:20180518003422p:plain

少し上がりました。

では、実際に家賃の予測をおこなってみましょう。

家賃の予測

今回予測に使用する説明変数は、Xの1行目のデータにしましょう。(1軒目の家データ)
念のため、Xのデータを再確認します。この0番目のデータ(x1〜x13)を説明変数として、家賃予測をします。

f:id:taxa_program:20180518003916p:plain

では、コーディングしてみましょう。

# Xからデータの抽出
x = X.iloc[0, :]
# 予測値の計算にはpredict関数を使用します
y_pred = model.predict([x])[0] #[0]を付与することで、結果が見やすくなります(オプション)
y_pred # 予測家賃の表示

f:id:taxa_program:20180518004123p:plain

29ドルと予想されました。
元のデータはどうだったかと言うと・・・ f:id:taxa_program:20180518004312p:plain 24ドルでしたね。予測値の方が高い家賃を表示しています。

これには理由がありまして、前回記事で家賃の分布を見たときに、50ドル付近のデータがいくつかあったと思います。
f:id:taxa_program:20180516194503p:plain

おそらくこれに引っ張られて、予測値が高くなってしまったのだと思います。

さらに予測精度を向上させるには、外れ値除去などを行い、学習させるデータの精査を行なうことが重要みたいです。

今回は以上です。時間があれば外れ値除去などの記事も書こうと思います。

学習して感じたこと

実際に学習してみて感じたことは、学習させるだけならコーディングの量は思ったより少なくて、大事なのは如何に学習させるデータを学習しやすい形に事前処理するか、ということです。

これからKaggleに公開されているデータを利用して勉強を進めていきたいと思います。
Kaggleで上位入賞目指して・・・いつになるかわかりませんが笑

あ、もちろん機械学習を絡めたWebサービスの開発も進めていきます。

では。