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

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

機械学習による(中古)不動産価格の予測 その7(tkinter アプリ)

先日紹介させて頂いた不動産価格の予測のtkinter アプリですが、一連のコードをGithubにアップしました。

 

https://github.com/winchemwin/house_price

 

 よろしければご参照ください。

 

Psi4による量子化学計算-紫外可視光吸収データ-その1

  今回は化合物の光の吸収波長と吸収強度(振動子強度)の計算事例について紹介したいと思います。

コード1 ライブラリーのインポート、分子情報入力

  まずはライブラリーのインポートですが、今回はTD計算を実施する必要があるため、「tdscf_excitations」をインポートしています。計算ターゲットですが今回もアセトニトリルです。

コード2 TD計算の実施

  後の計算でも使用するようオプションでJK オブジェクトを保存する設定にしています(Psi4のチュートリアルから引用していますので、後のどの処理に必要なのかは不明ですが)。その後、エネルギー計算とTD計算(得られたデータは「res」に格納されるよう設定)の設定を行っています(計算する励起エネルギーレベルの数はstateで設定できます)。

コード3 計算結果の処理

 続いてTD計算で得られた結果「res」から、エネルギー値と振動子強度をリスト型で取り出し、numpyのアレイ型のデータとしています。エネルギー値は数値処理により波長に換算し、「arraynm」としています。最後にnumpyのreshape を使ってリストの順序を入れ替えています。

コード4 計算結果の表示

 上記は計算結果の表示です。numpyのアレイデータをまとめた後、最終的にpandas のデータフレームを作成、表示させています。

 

計算結果

 アセトニトリルの計算結果は上記の通りです。設定した10のレベルの励起エネルギーと波長、振動子強度が表示されています。

 次回は得られた結果を用いたスペクトル表示について紹介したいと思います。

 
 

機械学習による(中古)不動産価格の予測 その6(tkinter アプリ)

 


前回までの記事で中古不動産価格予測の回帰モデル作成について紹介してきました。幸いlightGBMでそれなりのモデルが作成できましたので、このモデルを用いた不動産価格の予測アプリをtkinterで作成してみました。

コード1 ライブラリーの読み込み

 まずは必要なライブラリーの読み込みです。今回はtkinterでアプリを作成するので、これまでに読み込んでいたsklearn関連のライブラリーに加えて、tkinter関係のライブラリーも読み込んでいます。

コード2 フレームサイズ等の設定

 続いてはtkinter アプリのフレームサイズとタイトルを設定してます。

コード3 関数の設定その1(予測)

 次に予測用の関数の設定を行っています。予測モデルは前回の記事で紹介した方法で保存したpickle形式のものを利用しています。予測モデルとともに標準化データも合わせて読み込んでおく必要があるようです。

 続いて予測用の入力データ値の設定で、今回は駅からの距離、間口、土地面積、建物全体面積、接道道路幅、築年数が入力値となります。

コード4 関数の設定その2(予測)

 入力したデータをnumpyのアレイ形式のデータ群として予測用入力データとして形を整えた後、標準化処理したものを入力データとしています。

 前回の記事で紹介した事前保存モデルで予測を行い、予測結果を表示させているのがその次のコードです。

 以上が一連の予測の関数に関するコードです。

 以下はtkinter の表示設定になります。

 

コード6 tkineter 表示設定1

  それぞれの値の入力用にテキストボックスを作成し、そこで入力された値は整数値を保持するWidget変数に設定したdist_iv, maguchi_ivなどに入るよう設定しています。

コード7 tkinter 表示設定2

  上記コード7も入力値の表示設定の続きです。

コード8 tkinter 表示設定3

コード9 

 上記コードで予測については、入力値の入力が完了した後、「予測」ボタンを押すことで関数「予測(predict)」が動作するように設定してます。

 

  実際にアプリを立ち上げると以下のような画面が立ち上がります。

tikinter アプリ 立ち上げ画面

 それぞれの入力値のところは最初は「0」が入力されていますが、調査したい住宅データからそれぞれの数値を入力し、下の予測ボタンを押すことで、機械学習で学習した予測モデルに基づいて予測価格が表示されます。

 

結果表示画面

 実際に中古物件のデータを入力して予測した結果が上図のような結果となります。

あくまで目安程度ですが、不動産購入の参考程度にはなるかと思います。

 私自身もネットで公開されている不動産物件がこれまでの相場くらべて、どのような位置にあるのかの参考に使っていたりします。皆さんの参考になれば幸いです。

 

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

 

 前回の記事で、中古不動産価格の予測モデルとして、lightGBMの利用とそのハイパーパラメーター最適化の事例について紹介しました。モデルとして比較的良い評価が得られてきていましたので、得られたモデルを用いて価格予測のコードを作成することにしました。今回はそのための作成したモデルの保存について紹介したいと思います。 

コード1 ライブラリーの読み込み

 まずはライブラリーの読み込みですが、モデルの保存用にjoblibとpickle のライブラリーを読み込んでいます。モデルの保存ですが下記の記事を参考にさせていただきました。

pickle と joblib で 機械学習モデルを保存&読み込む(Python) – セールスアナリティクス

 

 モデルの保存はjoblibとpickleのどちらでも可能ですが、joblibの方がファイルサイズが小さい、pickleの方が保存、読み込みスピードが早いという特徴があるようです。今回は両方の方法で保存するコードを作成しています。

 

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

コード3 前処理その2

まずはデータの読み込みと前処理ですが、これまでと同様に前処理として築年数の算出のための処理及び回帰モデル作成用の目的変数などの設定を行っています。

 

コード4 データ分割、標準化

続いてデータの分割(訓練用、テスト用)をデータの標準化処理ですが、これらもこれまでと同様の操作になりますが、1点データの分割についてrandam_stateを指定しています。通常はランダムに分割されますが、以前に最適化した条件を再現するため分割条件をしています。

 

コード5 予測モデルの作成

 実際の予測モデルの作成ですが、前回の記事でOptuna™ で最適化したハイパパラーメータの数値を利用するため、それらの数値を回帰モデル作成時のパラメータとして、指定しています。

 

 

コード6 データ比較、評価値算出

 続いて訓練データ、テストデータの予測値の算出とモデル評価値の算出を行っています。

 

コード7 作成モデルの保存

 以上で作成した回帰モデル及び標準化データをそれぞれjoblib及びpickleで保存しているのが上記コードになります。標準化処理をしている場合は標準化データも保存しておく必要があるようです。

 以上、ハイパーパラメーターを最適化したlightGBMモデルの保存について紹介させていただきました。次回はこの予測モデルを用いた中古不動産価格予測のtkinterを用いたアプリについて紹介したいと思います。

 

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

 前回までの記事で中古不動産価格の予測モデルの作成として、scikit-learnでの回帰モデル作成(Ababoost法)について紹介してきました。ただ、ハイパーパラメータの最適化も行いましたが回帰モデルとしてはあまり良い結果が得られてきていませんでした。

 そこでpycaretを利用して再度各種回帰方法の検討を行ったところ、lightGBMで比較的良い結果が得られてきていましたので、今回はlightGBMでのハイパーパラメータ最適化事例について紹介したいと思います。

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

 まずはこれまでと同様にライブラリーのインポートです。今回はlightGBMを使いますので、”lightgbm"を読み込んでいます。またハイパーパラメーターの最適化には今回もOptuna™を利用しています。

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

 

コード3 前処理その2

 

まずはデータの読み込みと前処理ですが、これまでと同様に前処理として築年数の算出のための処理及び回帰モデル作成用の目的変数などの設定を行っています。

コード4

 続いてデータの分割(訓練用、テスト用)をデータの標準化処理ですが、これらもこれまでと同様の操作になります。

 

コード5 Optunaの探索条件設定

 次にOptuna™で行う探索条件の設定をobjective という関数として設定しています。まず変化させるパラメーター、回帰モデルの設定を行っています。今回はlightGBM用ということで前回とは検討パラメータが前回とは異なり、多くのパラメータを検討しています。パラメータの設定に関しては、下記の記事を参考にさせていただきました。

qiita.com

またコードの下部は得られた結果の評価値の算出で、トライアル回数ごとの評価値の保存を行っています。最後にOptuna™で最適化する目標値を関数の返り値として設定しています。

 

コード6 自動最適化の実施及び結果表示

 

 最終的にOptuna™で最適化の設定ですが、この辺は前回のOptuna™での最適化の記事と同様です。R2値を関数の返り値として設定していますので、その値を最大値とするよう最適化するよう設定するとともに、先に作成したobjective の関数に従って100回のトライアルを行う形としています。

 結果はベストスコアとパラメーターを表示させるとともに、途中経過の確認のため逐次保存されている評価値のデータフレームの表示も行っています。

 

  最適化が開始されると以下のような表示が始まります。

最適化途中の表示

 以下は最終的な最適化結果です。100回のトライアルの結果。R2値は0.7679でした。Ababoost法での結果が、0.2997でしたので、かなり改善されているのがわかるかと思います。

 

結果1

結果2

結果3

l ightGBMでかなり良いモデルが作成できましたので、次回は作成した予測モデルの保存について紹介したいと思います。

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

 前回の記事で軌道エネルギーの計算、表示例としてHOMO、LUMO軌道エネルギーの計算と表示について紹介しました。場合によっては、複数の軌道エネルギーを確認したい場合もあるかと思いますので、今回はHOMO-1やLUMO+1などの軌道エネルギーの表示事例について紹介したいと思います。

 

コード1 ライブラリーインポート、対象分子の設定

 今回もターゲット分子はアセトニトリルで計算しています。また、後のデータ処理用にnumpyとpandas をインポートしています。

コード2 構造最適化、軌道エネルギー計算 

 続いて、これまでと同様に構造最適化を行った後に、得れれた安定構造の座標を保存し、得られた安定構造に対して、一点エネルギー計算を実施しています。

コード3 表示する軌道の設定等

 今回は複数の軌道データを設定するので、その数を「orbital_level」で設定し、軌道のリストと番号をnumpy のアレイ化で作成しています。続いてそれぞれの軌道エネルギーデータの保存リストの作成を行い、前回と同様にLUMO、HOMO軌道の情報を取り出しています。

コード4 軌道エネルギーデータの取り出し

 複数の軌道エネルギーデータの取り出しは設定した「orblev」の数に応じて、for 文で実行しています。取り出したエネルギー値等は予め用意したリストにそれぞれ追加、格納しています(HOMOdata, LUMOdata, Hindex, Lindex)。

 

コード5 データフレームの作成と表示

 最後に得られたリストからデータフレームを作成し、print文で表示させています。

 

 

計算結果1

計算結果2


  上記が計算結果ですが、計算結果1はfor 文の過程で逐次表示されたもので、計算結果2はデータフレームに整理し直されたものになります。複数の軌道エネルギーを一覧で確認した場合には活用できるのではないでしょうか。ご参考になれば幸いです。

 

 

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

 

 前回の記事で中古不動産価格の予測モデル作成について、scikit-learnでの回帰モデル作成について、紹介しました。あまり良い結果はえられなかったのですが、今回はAbaboost法でのハイパーパラメータの最適化について紹介したいと思います。

 ハイパーパラメータの最適化手法については、これまでの記事でも紹介ましたが、条件をランダムに発生させ最適化を行うランダムサーチ、網羅的に条件を発生させ最適化を行うグリッドサーチ、さらには自動最適化のフレームワークを利用した方法などがありますが、今回はOptuna™を利用した最適化について紹介したいと思います。

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

  今回もまずはライブラリーインポートですが、これまでに利用してきたライブラリー以外に特に回帰モデル作成用にAbaboostRegressor、ハイパーパラメーター最適化用にOptuna™をインポートしています。

 

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

  

コード3 前処理その2

 続いてこれまでも行ってきたように、不動産情報の読み取りと前処理として築年数の算出のための処理及び回帰モデル作成用の目的変数などの設定を行っています。

 

コード4 データ分割、標準化処理

 次は回帰モデル作成の設定で、データの分割と標準化処理を行っています。

コード5 Optunaの探索条件設定

 次にOptuna™で行う探索条件の設定をobjective という関数として設定しています。まず変化させるパラメーター、回帰モデルの設定を行っています。コードの下部は得られた結果の評価値の算出で、トライアル回数ごとの評価値の保存を行っています。最後にOptuna™で最適化する目標値を関数の返り値として設定しています。

 

コード6 自動最適化の実施及び結果表示

  最終的にOptuna™で最適化の設定ですが、R2値を関数の返り値として設定していますので、その値を最大値とするよう最適化するよう設定するとともに、先に作成したobjective の関数に従って100回のトライアルを行う形としています。

 結果はベストスコアとパラメーターを表示させるとともに、途中経過の確認のため逐次保存されている評価値のデータフレームの表示も行っています。

 

 最適化が開始されると以下のような表示が始まります。 

最適化途中の表示

 以下は最終的な最適化結果です。100回のトライアルの結果。R2値は0.2997でした。正直あまり良い値ではありませんが、前回のscikit-learnでの網羅的な検討での結果ではR2は0.0189程度でしたので、ある程度最適化がうまく行われていることがわかるかと思います。

 

結果1

結果2

結果3

 以上、今回は選択した回帰手法(Ababoost法)でのハイパーパラメータの最適化の事例について紹介させていただきました。

 ただ、評価値としてあまり良い結果は得られていませんので、次回はpycaretで探索した結果最も有望であったlightGBMでの検討結果について紹介したいと思います。