BigQuery ML 2値分類チュートリアルをやってみた 02

はじめに BigQuery ML 2値分類チュートリアルをやってみた 01の続きです。 ステップ4のメモ SELECT * EXCEPT(dataframe) FROM `census.input_view` ステップ4のSQL文ですがEXCEPT句を久々に見たので改めて調べました。 リファレンスに記載されている書き方は下記でした。 SELECT * FROM UNNEST(ARRAY<int64>[1, 2, 3]) AS number EXCEPT DISTINCT SELECT 1; FROM句で指定するテーブルの右側にEXCEPTと除きたいデータ(ここではDISTINCT SELECT 1)を記載することで除いています。 チュートリアルに戻ると、ステップ4に関しては該当カラムを除くように使っています。挿入箇所がリファレンスと異なりますが、行ってい操作は同じになります。 このExceotの書き方はBigQueryに限った書き方ではなく、SQL ServerやPostgreSQLにもサポートされている書き方になります。 チュートリアルで説明が無かった下記の2つのオプションについて確認します。 data_split_method='NO_SPLIT', max_iterations=15) AS data_split_method は、AUTO_SPLIT, RANDOM, CUSTOM, SEQ, NO_SPLITが選べます。 https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-create-glm#data_split_method デフォルトはAUTO_SPLITです。 CUSTOMは指定したカラムがbool型でTRUEかNULLだと評価として使われ、FALSEだとtraiingデータとして使われるようです。 カラムの指定は別のオプションのDATA_SPLIT_COLで指定可能です。SEQを指定した場合も同様にDATA_SPLIT_COLを使います。 SEQは指定したカラムでの小さい値から指定した割合までを学習データとして、それ以降を評価データとして使います。カラムの指定はCUSTOMと同じく、 DATA_SPLIT_COL、割合の指定はDATA_SPLIT_EVAL_FRACTIONオプションで指定します。 ステップ5のメモ ステップ5のSQLの結果とモデルの詳細画面の結果が異なるので調べました。 ステップ5のSQLの結果はチュートリアルに説明があるように、入力データの中からdataframe列がevaluationのものを抽出しています。 ステップ4で作ったロジスティック回帰のモデルを作るためのSQLではデータの分け方をno_splitにしているので、 データの分離をせずにすべてのデータを学習データと評価データに使います。 そのため、モデル詳細画面に記載されている精度の各値と、dataframe列がevaluationのデータをもとに学習したモデルに入れたデータの各精度指標が異なってきます。 また、それだけではなく今回はauto_class_weights=TRUEのオプションで各クラスのウェイトを重みつけすることもしているので、 この影響もあるので下記のように単純に学習データをすべて入れても計算結果が異なります。 異なるといっても大きな差がでていないのでここではそこまで議論しなくてもよいかもしれません。 SELECT * FROM ML.EVALUATE (MODEL `census.census_model`, ( SELECT * FROM `census.input_view` ) ステップ6のメモ 実際に使うときのthresholdはML.PREDICTのthresholdを使うことで指定できます。 https://cloud....

January 8, 2022 · 1 min · Implicitnone

BigQueryMLの2値分類のチュートリアルをやってみた 01

はじめに BigQuery MLのチュートリアルを進めるうえで困ったところや追加で調べたところを作業メモとして残します(必要に応じて本家のドキュメントにフィードバックは送っております)。 ステップ2のデータの確認の補足 https://cloud.google.com/bigquery-ml/docs/logistic-regression-prediction#run_the_query データ確認のところで下記のクエリを投稿しています。 SELECT age, workclass, marital_status, education_num, occupation, hours_per_week, income_bracket FROM `bigquery-public-data.ml_datasets.census_adult_income` LIMIT 100; ただそのQueryの結果の説明を読んでいるとeducationとfunctional_weightカラムの説明がでてきます。 Queryの中で上記2つのカラムを指定していないのでなんのことを指しているのかここだけではわからなかったので、 下記のクエリに修正して実行しました。 SELECT age, workclass, marital_status, education_num, occupation, hours_per_week, income_bracket, education, functional_weight FROM `bigquery-public-data.ml_datasets.census_adult_income` LIMIT 100; 修正したQueryの実行結果は上記です。 こちらからeducationとeducation_numが同じことを示すだけで、別々の表現になっていることを指摘していましたが educationカラムで確かに同じであることが伺えます。 ただ、すべての行で同じかどうか念の為確認したいと思い、下記のSQLを動かして確認しました。 SELECT education, education_num, count(*) FROM `bigquery-public-data.ml_datasets.census_adult_income` GROUP BY education, education_num ; こちらから得られる結果を確認するとたしかにeducationとeducation_numの結果は1:1対応しており、 educationの1つの値がeducation_numに2回使われることがありませんでした。もちろん逆も同様でした。 ステップ3の学習データのtraining, evaluation, predictionの比率 https://cloud.google.com/bigquery-ml/docs/logistic-regression-prediction#run_the_query_2 ここでの説明が学習データとして80%使い、評価用10%、予測用10%として扱う記載ありますが、実際にどれほどの比率か確認したいと思います。 SELECT dataframe, COUNT(*) AS dataframe_num, COUNT(*) / MAX(a.total) AS ratio FROM `census.input_view`, ( SELECT COUNT(*) AS total FROM `census....

January 4, 2022 · 1 min · Implicitnone