PyCaretで住宅価格を回帰予測する

この回では、PyCaretの機械学習ライブラリで、住宅価格を予測してみます。
目次
PyCaretで住宅価格を回帰予測する
PyCaretには、機械学習の実験に利用可能なデータセットが多数準備されています。その中から、今回は「house」というデータセットを使用して住宅価格を予測する回帰モデルを作成してみます。
ここでは、Jupyter Labを使用してコーディングしていきます。
データセットのインポート
#import pandas as pd
from pycaret.datasets import get_data
from pycaret.regression import *
まずはじめに、PyCaretのデータセットをインポートします。PyCaretのデータセットを使用する場合はPandasは必要ありません。
回帰分析ライブラリについてもインポートしておきます。
data = get_data('house')
インポートしたデータセットから、住宅価格のサンプルデータセット「house」を変数に格納します。

機械学習の準備(setup関数)
データの読み込みが完了したら、機械学習の準備を行います。target引数には、目的変数となる項目名に「SalePrice」を指定します。session_id引数は任意で指定可能です。
setup(data = data, target = 'SalePrice', session_id=777)

データフレーム内のデータタイプが自動的に設定されますので、エンターキーを押して確定します。読み込んだデータフレームから、目的変数と説明変数のデータローダーが作成されます。
モデルの比較(compare_models関数)
次に、回帰分析器の比較を行うためcompare_models関数を実行します。
model = compare_models()
処理が完了すると、回帰分析器ごとの一覧が高い精度の順で表示されます。それぞれの結果は、交差検証(クロスバリデーション)を実行して得られた結果となっています。
Gradient Boosting Regressor(勾配ブースティング回帰木)の決定係数(R2)が最も良い結果であるため、これを使用することにします。
ブースティングは、最初に作成した学習器の予測誤差を新しく作成した学習器に逐次的に引き継ぎながら予測精度を向上させるアンサンブルの一種であり、これに損失を最小化する勾配下降法を組み合わせたものが勾配ブースティングです。
この他にも最初から多数の弱学習器を作成して同時に処理するバギングの手法があります。
ブースティングよりもバギングの方が一般的に計算処理が速いとされています。早くそこそこのモデルでよい場合はバギング、精度を優先するならブースティングの手法を使うようなイメージです。

モデルの生成とチューニング(create_model関数/tune_model関数)
compare_models関数でモデルを作成し、チューニングを行います。
model = create_model('gbr')

tuned = tune_model(model)

決定係数(R2)がわずかに向上していることが確認できました。
予測する(predict_model関数)
チューニングしたモデルで住宅価格を回帰予測して、 目的変数(SalePrice)に対する予測結果(Label)を確認します。
predict_model(tuned)
当たらずとも遠からずの結果になっていることが見て取れます。

モデルの可視化(evaluate_model関数)
evaluate_model関数で作成したモデルを可視化して、モデルの状態を確認してみます。
残差プロット図を見ると、概ね残差0線付近に集中していますが、大きな残差も観測できる状況のため、改善の余地がありそうです。

学習曲線の図を見てみると、訓練曲線(青線)の下側に検証曲線(緑線)が位置しており、距離もかなり離れていることがわかります。これは間違いなく過学習で汎化性能が悪いといえるとおもいます。

次に検証曲線を見てみると、ハイパーパラメータ(alpha)をチューニングしても、スコアがほとんど変化していないことが確認できます。多重共線性の影響などについて考察が必要です。

最後に特徴量の重要度について見てみます。予測因子の重要度トップ10が確認できます。これらすべての特徴量が本当に住宅価格を決定する要素であるのか分析することで、モデル性能を向上させることができるかもしれません。
重回帰予測では、予測因子(予測要素)を複数用いることで予測精度を向上させることができますが、予測因子が多すぎてもノイズとなるだけです。予測因子を厳選する(次元削除する)ことも、モデル性能の向上には欠かせない作業なのです。

まとめ
この回では、PyCaretのデータセットを使用して、住宅価格を予測する回帰モデルの実験を行いました。
予測精度の高いモデルを作成することの難しさについてご理解いただけたのではないでしょうか。安易に学習データが多ければよいというわけではなく、学習に入力するデータの性質についても考慮する必要があり、実用可能なモデルの完成までは、まだ時間がかかりますね。
しかしながら、PyCaretはローコードで実装できるため生産性が高く、処理のほとんどを自動でおこなってくれるため、ユーザが問題解決に集中できるというメリットがあります。機械学習でPyCaretを使わない理由はありませんね。
みなさんもPyCaretでデータサイエンスの扉を開けてみてはいかがでしょうか。
ホームページやWordPressに関するお問い合わについて
どんな内容でも構いませんので、気兼ねなくご相談ください。
システムエンジニアリングの経験を持つスタッフが、ボランティアでご相談に応じさせていただきます。