初心者向け学習方法一覧はこちら
この記事はアメリカ/ボストンの住宅価格の予測ができるAIをディープラーニングを用いて実装する3つ目の記事です。
3本立ての記事ですので、まだの方は1,2から読むことをおすすめします。
PythonによるAIの実装
前準備
scikit-learnの使用できる環境構築をします。
scikit-learnを自分のPCにインストールするにはWindows上であればコマンドプロンプト、Macであればターミナルに以下のコマンドを入力する必要があります。
pip3 install sklearn
インストールできているか確認するためには、
pip freeze
と入力し、インストールされたパッケージの一覧を表示してその中から「sklearn==[バージョン情報]」が記載されているものがあればインストールが完了しています。
データの取得
それではまずボストンの住宅価格データセットを取得しましょう!
ボストンの住宅価格データセットはscikit-learnに格納されています。
データをscikit-learnから取得し、dataメソッドとtargetメソッドを使用してNumpyで扱える形に変換します。
この際にscikit-learnのpreprocessing.minmax_scale()を使用して住宅情報データに正規化も施します。
住宅情報と住宅価格データが取得できたらscikit-learnのtrain_test_splitメソッドを使用して割合が4:1になるように学習用データとテストデータに分割します。
ここまでの流れをコードにするとこのようになります。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn import neural_network
boston = load_boston()
boston_x = preprocessing.minmax_scale(boston.data)
boston_y = boston.target
x_train,x_test,y_train,y_test = train_test_split(boston_x,boston_y,test_size=0.2)
これでプログラムしやすい形でボストンの住宅データを取得できました。
AIの実装
まず、入力層の部分ですがデータ取得の際に正規化を施しましたので特にすることはありません。
次に中間層です。
条件として
- 使用する活性化関数をReLU関数
- 中間層の数を4つ
- 各層のノード数を64個
に決定しました。
この条件をディープラーニングモデルのインスタンスを生成するタイミングで引数として入力します。
最後に出力層についてです。
条件として
- 活性化関数を恒等関数にする
と決定しました。
この条件もインスタンスを生成するタイミングで「MLPRegressor」と指定します。
以上の話をコードにすると以下のようになります。
hidden_layers= (64,64,64,64)
clf = neural_network.MLPRegressor(activation="relu",
solver='adam',
alpha=0.01,
hidden_layer_sizes=hidden_layers,
max_iter=10000,
)
scikit-learnを用いて学習をするには生成したインスタンスに対して学習データの問題と答えを引数としたfitメソッドを用います。
clf.fit(x_train,y_train)
scikit-learnを用いて予測をするには生成したインスタンスに対してテストデータの問題のみを引数としたpredictメソッドを用います。
y_predict = clf.predict(x_test)
誤差を評価する損失関数の作成
誤差を評価する関数である損失関数を実装します。
今回は損失関数を二乗誤差平均としてNumpyを使用して実装します。
コードは以下のようになります。
mse = np.average((y_predict - y_test)**2)
使用したコード
最後に評価が可視化できるグラフを描画するコードを追加します。
Matplotlibの使用方法についてはリンク先の記事を参照してください。
使用したコードをまとめておきます。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn import neural_network
np.random.seed(0)
boston = load_boston()
boston_x = preprocessing.minmax_scale(boston.data)
boston_y = boston.target
x_train,x_test,y_train,y_test = train_test_split(boston_x,boston_y,test_size=0.2)
hidden_layers= (64,64,64)
clf = neural_network.MLPRegressor(activation="relu",
solver='adam',
alpha=0.01,
hidden_layer_sizes=hidden_layers,
max_iter=10000,
)
clf.fit(x_train,y_train)
y_predict = clf.predict(x_test)
loss = (y_predict - y_test)**2
mse = np.average(loss)
plt.scatter(y_predict,y_test,s=5)
plt.xlabel("predict price")
plt.ylabel("true price")
plt.title(f"MSE : {round(mse,2)}")
plt.xlim(0,50)
plt.ylim(0,50)
plt.minorticks_on()
plt.grid(which="major",alpha=0.5,color ="black")
plt.grid(which="minor",linestyle=":",color="gray")
x=np.linspace(0,50,100)
plt.plot(x,x,color="black")
plt.show()
検討
ディープラーニングモデルを評価したグラフを示します。
グラフタイトルに二乗誤差平均の値を記載しています。
見てみると、かなりy=xに近い形になっていることが確認できます。
二乗誤差平均の値にルートをとって単位の1000ドルをかけると誤差の単位をドルに変換して求めることができ、計算すると5136ドルでした。
つまり約5000ドルの誤差の範囲で住宅価格を推測できることになります。
さらに経験則と一致しているかの確認をします。
その考察に対する実験として以下の3つの例を極端な形を入力して確認します。
- 犯罪率が上がると住宅価格は下がっているか?
- 広い家の割合が大きいと住宅価格も上がっているか?
- 主要施設との距離が大きいと住宅価格も下がっているか?
実験で考えた例をコードにします。
sample_data0 = np.array([[0,0,0,0,0,0,0,0,0,0,0,0,0]])
sample_data1 = np.array([[1,0,0,0,0,0,0,0,0,0,0,0,0]])
sample_data2 = np.array([[0,1,0,0,0,0,0,0,0,0,0,0,0]])
sample_data3 = np.array([[0,0,0,0,0,0,0,1,0,0,0,0,0]])
sample_predict0 = clf.predict(sample_data0)
sample_predict1 = clf.predict(sample_data1)
sample_predict2 = clf.predict(sample_data2)
sample_predict3 = clf.predict(sample_data3)
print("sample0:",sample_predict0)
print("sample1:",sample_predict1)
print("sample2:",sample_predict2)
print("sample3:",sample_predict3)
sample1は犯罪率が極端に高い例です。
sample2は広い家が極端に多い例です。
sample3は主要施設との距離が極端に遠い例です。
出力結果は以下のようになりました。
sample0: [16.91228866]
sample1: [8.12022366]
sample2: [20.90615985]
sample3: [14.08547088]
sample0とsample1,sample2,sample3を比べます。
すると考察と同じ
- 犯罪率が上がると住宅価格は下がる
- 広い家の割合が大きいと住宅価格も上がる
- 主要施設との距離が大きいと住宅価格も下がる
ということが確認できました。
これで直感的な内容に沿った住宅価格を予測できるディープラーニングモデルを実装することができたことが確認できました!
まとめ
今回はアメリカのボストンの住宅価格の予測ができるAIをディープラーニングを用いて実装しました。
このモデルをさらに改良するには
- アメリカのボストンではなく日本にしてみる。
- 住宅価格ではなくビックマック指数などの物価を予測する
などがあります。
ぜひ取り組んでみてください!
プログラミングスクールの選び方
転職を検討中の方向け
フリーランス・副業で活躍したい方向け
教養・キャリアアップしたい方向け
給付金について詳しく知りたい方向け