あるケミストの独り言(winchemwinの日記)

ケミスト(化学者)の視点で、面白そうな情報(シミュレーション関係など)を発信

機械学習による(中古)不動産価格の予測 その2

 中古不動産価格の予測モデル作成の続きです。

 前回までの記事で不動産取引価格情報の取得と機械学習用のデータの前処理について紹介させていただきました。今回から回帰モデル作成の事例について紹介します。まずscikit-learnで利用可能な回帰モデルでの実装を検討してみました。

 以下は必要なライブラリーのインポートです。以前の記事でも紹介しましたが、可能な回帰モデルをできるだけ多く読み込んで、それらの結果を比較してよさそうなものにあたりをつけようという感じです。今回も以下の記事を参考にさせていただきました。

qiita.com

コード1 ライブラリーのインポート

 

 さらにそれぞれの回帰モデルを網羅的に処理していくために辞書型のリストで整理しています。この辺も以前の電気料金の予測モデル作成の記事で紹介させていただきました。

コード2 リスト作成

 続いて、前回に紹介したデータの前処理です。不動産情報の読み込みと築年数の算出の処理を行っています。尚、今回は種々のモデルでの結果を比較するため、各モデルの精度の保存先のリストも予め作成しています(下記3行目)。

 

コード3 不動産情報の読み込みと前処理その1

 建築年数と取引年から築年数を算出し、さらにdropna()を実行して欠損値処理を行っています。最終的に回帰モデル作成用の目的変数として「取引価格」、説明変数として、「最寄り駅からの距離」、「間口」、「面積」などを設定しています。

コード4 前処理 その2

 以上で、モデル検討用のデータセットが準備できたので、コード5〜7で各種回帰モデルでの実際の検討と結果の表示を行っています(この辺は以前の電気料金の予測モデル作成の記事と同様です)。

 

コード5 結果の格納リスト

コード6 回帰モデル作成検討

コード7 検討結果の表示

 

 以下は得られた結果の一覧です。訓練データのR2値が良好なものもありますが、テストデータでは必ずしも良い結果は得られませんでした。これらの回帰モデルの中から使えそうなものをピックアップしていくことになるのですが、今回はハイパーパラーメータのチューニングの練習の意味も含めて、Ababoost法(あまり良い結果は得られていませんが)での検討をさらに行ってみることにしてみました。次回以降、ハイパーパラメータの最適化条件の検討について紹介したいと思います。

 

結果 1

結果2

結果3

結果4

結果5

結果6

 

機械学習による(中古)不動産価格の予測 その1

 

 

 機械学習による予測として、中古不動産取引価格の予測モデルの作成を行ってみましたので、以後複数回に分けて紹介したいと思います。

 よく紹介されるモデルとしてscikit-learnを使ったボストンの住宅価格の回帰予測モデルの例が紹介されていますが、身近な例として日本のある地域の不動産の価格の予測モデルの作成を検討してみました。

 もとになる学習データですが、国土交通省から平成21年から蓄積されている不動産の取引価格情報を使いました。こちらは国土交通省の以下に表示のページから取引時期や都道府県、市町村を選択することでcsv形式のファイルをダウンロードすることができます。平成21年からですと約10年間の取引データがありますので、学習データとしてはまずまずのボリュームかと思います。

 注意点ですが、不動産取引情報のデータはアンケートに基づき集約されているようなので、あくまで目安程度として考える必要があるようです(実際の価格情報は不動産関連の他の情報なども勘案する必要があるかと思いますので、その点ご留意ください)。

 今回は、あくまで機械学習のモデル作成の題材として、自分自身の興味で取り上げていますので、その点ご了承ください。

不動産取引価格情報

 

 実際にダウンロードして得られるデータは以下のようなデータになります。

取得データ例1

取得データ例2

 選択したエリアでの住宅(土地)取引情報として、駅からの距離や土地面積、延床面積、建築年、取引価格がリスト化されています。

 これらのデータかが学習に必要なデータをピックアップするのですが、不動産価格の評価に重要な築年数が数値としてリスト化されていません。建築年が和暦でリスト化されていますので、機械学習の前処理として、まずはこのデータから築年数を算出する必要があります。

  以下のコードでは複数年のデータをあわせたcsvファイルを作成したもの(Fudosan2005_2021)を読み込み、データフレームとして読み込み、和暦を西暦に変換するライブラリー(jeraconv) を使って西暦(seireki)のデータを追加しています。

 

コード1 データの前処理1(西暦への変換)

 

 続いて取引年の情報を’取引時点’のデータから読み取るのですが、年の情報は最初の4文字に書かれていますので(四半期情報は不要)、その年の情報のみを抽出して取引年(torihiki_year)として追加しています。最後に建築年と取引年の差分から築年数を算出、追加しています。

コード2 データの前処理2(築年数の算出)

 以下はデータ処理後のデータフレームの表示です(csvファイルの段階で必要な情報のみにピックアップしていますので、もとの取得データからは項目が減っています)。右端に築年数が表示されているのがわかります。

データ処理後のデータフレーム

 以上で、価格の回帰モデル作成に必要な情報は整理できましたので、次回以降、種々の方法での回帰モデル作成の事例について紹介してゆきたいと思います。

 

 

Psi4による量子化学計算-軌道エネルギー(HOMO、LUMO)計算-その1

 前回までの記事で、各種物性値として電荷や双極子モーメントの計算について紹介しました。今回は化学物質の反応性等の考察にもよく利用される軌道エネルギーの算出について、紹介したいと思います。

コード1 構造最適化等

 今回もターゲット分子はアセトニトリルで計算しています。これまでと同様に構造最適化を行った後に、得れれた安定構造の座標を保存しています。

 

コード2 軌道エネルギー計算

 続いて得られた最適化構造に対して、一点エネルギー計算(psi4.energy)を実施していますが、この際return_wfnをTrueにして得られた軌道の情報をwfnしています(エネルギー値はEに代入されています)。

 得られたwfn の情報から、wfn.naalpha()でLUMO軌道に関する番号(index)を取り出し、またLUMOの一つ下の軌道のHOMOの軌道の番号(index)も取り出し、それぞれLUMO_idx, HOMO_idxとしています。

  さらに、epsilon_a_subset()で指定された(HOMO_idx, LUMO_idx)軌道の軌道エネルギーを取り出し、homo, lumo としています。

 最後にそれらの情報をプリントアウトしています(エネルギーはa.u単位)。

  

計算結果

 以上は計算結果ですが、アセトニトリルのHOMO軌道、LUMO軌道のエネルギー値(a.u単位)及びエネルギー準位が示されています。

 今回は単にHOMO、LUMO軌道の数値のみの結果の表示でしたが、これらの軌道の周辺の軌道のエネルギーなどを基に考察を進めることもあるかと思います。次回はもう少しHOMO-1、LUMO+1といった軌道の情報も表示させるコード等についても紹介したいと思います。 

Psi4による量子化学計算ー双極子モーメント

前回の記事で電荷計算についてについて紹介しました。今回は双極子モーメントの計算について紹介したいと思います。

今回もターゲット分子はアセトニトリルです。構造最適化を行い、エネルギー計算を行うまではこれまで紹介してきた事例と同様かと思います。

双極子モーメント計算のコード

 Psi4ではpsi4.oepropで’DIPOLE'を指定することで双極子モーメントを計算することが可能です。得られた計算結果の各座標成分はpsi4.variableで取得可能です。分子全体の双極モーメントはxyzの各成分の2乗和のルートで求められるので、最終行でnumpyの処理を行いながら、表示させています。

 以下は計算結果ですが、最終行に分子全体の双極子モーメントが表示されています。

双極子モーメントの計算結果

 双極子モーメントの計算についても化学の新しいカタチさんの下記の記事を参考にさせていただきました。

future-chem.com

機械学習による予測モデルの作成(暑さ指数-東京)その4

 前回の記事で、「暑さ指数」と「気象データ」の相関について、SVRSupport Vector Regression,サポートベクター回帰)でのハイパーパラメーターの設定の検討の事例として、グリッドサーチの事例を紹介しました。

 今回は、ハイパーパラメータ自動最適化フレームワークOptuna™を利用した事例を紹介したいと思います。

コード1 ライブラリーのインポート

 まずはライブラリーのインポートです。ほぼ前回と同様ですが、今回はグリットサーチの代わりにoptuna をインポートしています。Optuna™はハイパーパラメータの値に関する試行錯誤を自動化的に行い、ハイパーパラメータの最適値を自動的に発見するよう動いてくれます。

 

コード2 データ読み込み、前処理

 

コード3 説明変数の標準化

続いてデータの読み込み、説明変数、目的変数の設定、訓練用データ及びテストデータの設定、説明変数の標準化を行っていますが、これらにについては前回と同様です。

 

コード4 Optuna 設定

Optunaですが、最適化は関数(’objective')で意義された手法に基づき、実行されますので、予め関数を定義しておきます。

上記の関数(’objective')では、はじめに最適化するハイパーパラメーターの設定(prams)を行い、続いて回帰モデルとしてSVRで予測モデルの作成を行う設定としています。

さらに、得られた予測モデルの評価値の算出するとともに、trial.set_user_attr() を使って試行ごとの評価値を記録しています(この値はあとからデータフレームとして取り出すことが可能です)。最終的にはこの関数ではR2値を評価目標値として、ハイパーパラメータの最適化を行う形にしています。

 

コード5 最適化実施、結果表示

 Optunaでの最適化の実施はいたってシンプルです。上記のStudy以下の2行で実施しています。最適化の方向ですが、関数で定義した目標値がR2でしたので、R2を最大化する方向で設定しています(maximize)。続いて、先に設定した関数(’objective’)に従って、トライアル回数500回で最適化を実施しています。

 最適化の結果はベストのスコアとパラメータと表示するとともに、記録されてる試行データをデータフレームとして設定し、こちらも表示させています。

 以下は最適化途中の表示と最終的なスコアとパラメータの表示になります。ベストスコアではR2値も良好な値となっており、問題なく最適化されていることがわかります。 

 最適化途中表示

最適化スコア、パラメータ表示

 途中の試行の様子も以下のようにデータフレームとして取り出し、表示させることが可能です。

 

データフレーム 試行結果表示(抜粋)

 以上がOptunaを使ったハイパーパラメーター最適化の結果です。先に紹介したランダムサーチやグリッドサーチの有用ですが、Optunaはベイズ最適化の手法にもとづき確からしい結果に比較的短時間でたどり着くには非常に有用なライブラリーかと思います。

 皆さんもハイパーパラメーター最適化の際には一度試されてみてはいかがと思います。

 以上、Optunaを用いた事例について紹介させていただきました。

 暑さ指数に関する予測モデルの作成の記事は今回で終了予定です。次回以降はまた異なるデータでの予測モデル作成の事例を紹介できればと思っています。

Psi4による量子化学計算ー電荷計算

 前回までの記事で、化合物の構造最適化、振動計算の実施について紹介してきました。今回は化合物の物性値として、電荷計算の事例について紹介したいと思います。

電荷計算のコード

 化合物はアセトニトリルを対象として、構造最適化を行ったあとに、エネルギー計算を行っています(今回は振動計算での最適化構造の確認は省略しています)。

 psi4.oepropにおいて計算した波動関数と物性値を指定することで、各種物性値を計算できます。今回は’MULLIKEN_CHARGES'を指定しています。

 Mullikenの電荷値はNumpyの配列として取り出しています。

 上記のコードを実行すると、下記の結果が表示されます。

電荷計算の結果 その1

 それらしい電荷の数値が並んでいますが、原子ごとの電荷がイメージしにくいです

電荷計算のコード (追加)

ね。そこで原子情報とMulliken 電荷をそれぞれ取り出すコード(上記)を追加して計算した結果が以下の結果になります。少しはイメージしやすい結果にはなりました。

電荷計算の結果 その2

 ただ、分子が大きくなってくると原子数が多くなって、C,H,O と言ってもどの原子を示しているか分かりづらくなります。

電荷計算のコード その3

 そこで「化学の新しいカタチ」さんの記事を参考にRdkit を使って視覚化するコード(追加)が上記になります。ファイル形式等の変換を行っていますが、基本的にはRdkitの類似度マップを使って視覚化を行っています。実際に計算を行ってみますと下記のような結果が得られ、それぞれの原子の電荷の様子がわかりやすく視覚化されているかと思います。

 

 今回の記事については、以上になります。次回は物性値として双極子モーメントの計算について紹介したいと思います。

電荷計算の結果 その3

 

今回の記事については「化学の新しいカタチ」さんの下記の記事を参考にさせて頂きました。

https://future-chem.com/psi4-wfn-analysis/

機械学習による予測モデルの作成(暑さ指数-東京)その3

前回の記事で、「暑さ指数」と「気象データ」の相関について、SVRSupport Vector Regression,サポートベクター回帰)でのハイパーパラメーターの設定の検討の事例として、ランダムサーチの事例を紹介しました。

 今回は 同様の設定でのグリットサーチの例を紹介したいと思います。

コード1 ライブラリーのインポート

 まずはライブラリーのインポートです。前回とほぼ同様ですが、今回はランダムサーチの代わりにグリッドサーチ用に「GridSearchCV」をインポートしています。

コード2 データ読み込み、前処理

コード3 説明変数の標準化

 続いてデータの読み込み、説明変数、目的変数の設定、訓練用データ及びテストデータの設定、説明変数の標準化を行っていますが、これらにについては前回と同様です。

 

コード4 ハイパーパラメーターの設定等

 ハイパーパラメーターの設定ですが、SVRでは、主として3種類のハイパーパラメータ(カーネル関数、正則化係数C、不感度係数ε)がありますが、今回はカーネル関数を「linear」に固定して行っています。代わりにガンマ値をパラメーターに設定してサーチを行っています。今回はグリッドサーチでそれぞれのパラメータ数を「3」に設定して探索を行っていますが、グリッドサーチの場合は網羅的に探索を行うのでパラメータ数を大きく設定しすぎると、探索の計算に膨大な時間がかかってしまうので注意が必要です。

 

コード5 評価値の算出

 

 評価値の算出と結果の表示の設定については、前回と同様です。

 

コード6 最適化過程、結果の表示

  

グリッドサーチの結果1

グリッドサーチの結果2(続き)

 以上が実際にグリッドサーチを行った結果です。前回のランダムサーチとは異なり、ハイパーパラメータの値によって大きなばらつきはなく概ね良好な評価値が得られています。パラメーター数を限定し、あまり大きくパラメーターを変化させていないこともあり、大きな差は得られなかったというところかもしれません。使い方としては、前回のランダムサーチで大まかな傾向を掴み、グリッドサーチで詳細な探索を行うといった感じでしょうか。

 以上、今回はSVRでの機械学習モデルの作成とグリッドサーチでのハイパーパラメーターの検討事例について紹介させていただきました。

 現状、ハイパーパラメーターの探索においても機械学習的な手法も取り入れて行われてきていますので、次回はそのような事例について紹介したいと思います。