くらしのマーケット開発ブログ

「くらしのマーケット」を運営する、みんなのマーケット株式会社のテックブログ。積極採用中です。

家賃を予測してみよう!

皆さん、こんにちは。エンジニアのトゥエンです。

あなたは家を探したことがありますか。私はもうすぐ引っ越しする予定です。 ですから、今日、「線形回帰」を使って、東京でシェアハウスの家賃を予測してみましょう。

f:id:curama-tech:20180820124309j:plain

問題

下記のような、部屋の家賃や面積、フロアについてのデータがあるとします。

面積(m²) フロア(F) 家賃(千円)
7 2 45
7.12 1 51
7.2 1 52
7.69 1 53
7.79 1 52.6
8 1 52
8.28 1 54
8.37 2 54.2
8.7 2 56
9.93 2 64
10.5 2 65
10.53 1 72
11 3 75
12.19 3 78.3
12.4 1 80

これを使って別の部屋の家賃を予測してみましょう。

少し数学について

線形回帰

上の問題は、「線形回帰」と呼ばれる、「教師あり学習」の一形態です。

線形回帰の公式は

{ \displaystyle 
        Y' \approx  Xw = Y 
    }
  • { \displaystyle Y' } : 予測の値
  • { \displaystyle Y } : 実際の値
  • { \displaystyle x } : インプットデータの値
  • { \displaystyle w } : ウェイト

損失関数

目標は実際の値(Y')と予測の値(Y)の差が最小です。ということは、関数の得る価値を最小するために { \displaystyle w } を見つける必要があります!

{ \displaystyle 
        L(w) = \frac{1}{2}\sum_{i=1}^{N}(Y'_{i}-Y_{i})^{2} = \frac{1}{2}\sum_{i=1}^{N}(Y'_{i}-X_{i}w)^{2} 
    }

問題の解決

損失関数の定義から、これが最適化問題であることがわかります。最適化問題を解決するために、一般的な方法の1つは、導関数を使用することです。

ちなみに、以前、凸最適化問題を紹介しました。よかったら、読んでください。

家賃予測

家賃は、次の式で計算されます。

家賃 = 面積 * { \displaystyle w_1 } + フロア * { \displaystyle w_2 }

家賃を予測するために、{ \displaystyle (w_1, w_2) }の適切な値を見つけなければなりません。

Pythonの scikit-learn ライブラリを使って、早く解決することができます。

import numpy as np
from sklearn import linear_model

X = np.array([
    [7, 7.12, 7.2, 7.69, 7.79, 8, 8.28, 8.37, 8.7, 9.93, 10.5, 10.53, 11, 12.19, 12.4],
    [2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 3, 3, 1]
]).T

Y = np.array([
    [45, 51, 52, 53, 52.6, 52, 54, 54.2, 56, 64, 65, 72, 75, 78.3, 80]
]).T

linear = linear_model.LinearRegression(fit_intercept=False)

linear.fit(X, Y)

print(linear.coef_)

結果:

[[ 6.74732924 -0.88385193]]

{ \displaystyle
    (w_1, w_2) = (6.74732924, -0.88385193)
}

ですから、3階にあり、面積8m²の部屋の家賃は約54700円です。

f:id:curama-tech:20180820124410p:plain

精度をテストしてみます。本例ではデータセット全体を 80:20 の割合でトレーニングデータとテストデータに分割します。

from sklearn.model_selection import train_test_split

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)

linear.fit(X_train, Y_train)

linearScore = linear.score(X_test, Y_test)

print(linearScore)

結果:

0.8280773078631194

1に近いほど精度は高くなります。

おわりに

我々みんなのマーケットテックチームでは「くらしのマーケット」を一緒に作る仲間を募集しています!興味がある方はぜひ気軽に連絡ください。

次回は、都築さんの予定です。

参考文献

[1] ウィキペディア

[2] Machine Learning is Fun! – Adam Geitgey

[3] Machine Learning co ban - Vu Huu Tiep, 2018

[4] scikit-learn