Hex上でSnowflakeのデータを読み込んで機械学習をやってみた
大阪オフィスの玉井です。
Hex上でSnowflakeのデータを読み込み、そのまま簡単な機械学習を(Pythonで)行ってみました。
Hexとは?
以下の記事をどうぞ。
やってみた
以下のプロジェクトを真似してみます。ただし、読み込むデータは、csvファイルではなく、Snowflakeを使います。
ちなみに、このプロジェクトでやることは「家の面積から家の価格(住宅価格)を予測する」です。
前段
Hex側
今回のための、新規プロジェクトを用意しておきます。
Snowflake側
ドキュメントにあるCSVを、事前にロードしておきます。
今回のプロジェクトは「家の面積から家の価格(住宅価格)を予測する」なので、このデータも住宅に関するデータとなっています。
Snowflakeを接続する
それでは、HexにSnowflakeをつないでみましょう。
プロジェクトを開いたら、画面左のメニューから、データソースを接続するメニューがあるので、そこからSnowflakeを選択します。
接続するSnowflakeの各種情報を入力します(Hex用のVWHを用意しておくのが良いと思いますが、今回は -めんどかったので- 既存のVWHを設定しています)。
接続に成功すると、下記のように、プロジェクトに「繋がれているデータソース」みたいな感じで表示されるようになります。
ちなみに、接続しているDWHのDBやスキーマなどは、Hex上のエクスプローラー的な機能で参照することができます。便利です。
SnowflakeのテーブルをSQLで参照する(DataFrameにする)
HexにつないだDWHは、Hex上のプロジェクトから、直接参照することができます。今回はSQLセルで参照してみます。
以下のように、簡単なSQLを、SQLセルで実行してみます。すると、Snowflakeのワークシートと同じようなノリで、簡単にデータを参照することができました。
Hexとして強力なのがSQLで参照したデータをそのままDataFrameにできる機能です。上記のスクショの下を見ればわかりますが、SELECT文を実行しただけで、その結果をDataFrameに入れてくれています。当然、このDataFrameは、後に続くPythonから扱うことができます。今までは、DWHにあるデータをNotebookで扱う際は、DWH側が用意したSDK等を使って、プログラム内で呼び出さないといけませんでしたが、HexではSQLが使えるため、この部分が格段に便利です。
データの確認する
ここから機械学習フェーズになります。実行するコードは上記ドキュメントそのままなので、ここにテキストとして載せることはしません(ドキュメントからコピーできます)。
散布図で確認する
データの分布を確認するため、散布図を使います。色々なライブラリがありますが、ここはHexの標準機能で散布図を描画します。
まず、必要なPythonライブラリをインポートしておきます(上記ドキュメント参照)。
繰り返しになりますが、今回は「家の面積から家の価格(住宅価格)を予測する」ので、必要なデータだけ抜き出したいと思います(つまり、面積と価格)。
先程、SQLでSnowflakeからとってきたDataFrameを早速使っています。
次にDisplayセルからChartを選びます。
以下のように設定値を入力し、散布図を作成します。
ヒストグラムで確認する
散布図を見ると、なんとなく面積と価格は比例しているようにも見えますが、左下にデータがかたまっており、データが偏っている可能性があるため、ヒストグラムも見てみます。
やはり分布が歪んだデータになっていました(右歪曲分布)。機械学習として、こういうデータに対する対処方法は色々ありますが、そこについて私は語れるだけの知識を持ち合わせていないため、ドキュメントに従い、今回は対数変換を行います。
正規分布に近づけました。(スクショがないですが)散布図を改めて見ても、塊が無くなり、キレイなデータになったと思います。
線形回帰モデルを作成する
というわけで、いよいよ機械学習モデルを作成します。今回は線形回帰を実施します。
テストデータと訓練データに分けて、いざモデル作成。
Hex側でmodel
という変数が出来ているのが確認できますね。
モデルの評価
平均二乗偏差と決定係数の確認
作成した線形回帰モデルが、どのくらい良いモデルなのか(=どれだけ予測できるか)を見ていきます。
まず、テストデータに対して、このモデルを実行し、実際に住宅価格を予測してみます。
今回は、モデルの評価指標として使われる平均二乗偏差(RMSE)と決定係数(R2)を、Hex上で可視化してみます。
DisplayセルからSingle Valueを選んで、先程生成されたRMSEとR2を、シングルバリューとして可視化します。
これで、他人がこのプロジェクトをレポートとして読むときも、分かりやすくなりますね。
傾きと切片の確認
モデルに問題が無いため、いよいよ回帰直線を引く段階に入ります。
線を引くための傾きと切片を取得します(ついでにシングルバリューで可視化)。
傾きが0.52ということは、面積が1ユニット変わるたびに、住宅価格が0.52変わるということになります。
線を引いてみる
回帰直線を作成します。
HexのChartで実際に描画してみます。HexのChartは、複数のグラフを重ねることができます。以下も、散布図と回帰直線を重ねています。
おわりに
DWHからSQLでデータをとってきて、そのままPythonに移行できるのは非常に強力ですね。そして、このまま分析レポートとして共有することもできるし、もう少し手を加えて、他の人が使える「データアプリ」にすることもできるっぽいので、とても面白いSaaSだなと思いました。