Share
Embed
BigQuery ML を使ってみた話
#bq_sushi tokyo #9 2018総集編 (https://bq-sushi.connpass.com/event/106178/) での発表資料です.
BigQuery ML の説明と,実サービスに導入した事例についての紹介を致しました.
Yuya Matsumura
November 30, 2018
Transcript
91 slides
-
©2018 Wantedly, Inc. BigQuery ML ΛͬͯΈͨ Examples of BigQuery ML
in Wantedly #bq_sushi Tokyo #9 30.Nov.2018 - Yuya Matsumura - @yu-ya4 -
©2018 Wantedly, Inc. ✓ Yuya Matsumura (দଜ ༏) ✓ Software
Engineer (ݕࡧɾਪનΤϯδχΞʁ) ✓ Wantedly, Inc. Recommendation Team (since April 2018) ✓ Interested in Information Retrieval, Machine Learning Self Introduction @yu-ya4 @yu__ya4 -
©2018 Wantedly, Inc. 㾎͢͜ͱ w #JH2VFSZ.-ΛͲͷΑ͏ʹαʔϏεͰར༻ͨ͠ͷ͔ w #JH2VFSZ.-ΛͬͯΈͯͲ͏ࢥ͔ͬͨ 㾎͞ͳ͍͜ͱ w
#JH2VFSZ.-ͷৄࡉͳ͍ํ w ػցֶशͷʹ͍ͭͯͷৄ͍͠ About this talk -
©2018 Wantedly, Inc. 8IBUJT8BOUFEMZ 8IBUJT#JH2VFSZ.- 8IZVTF#JH2VFSZ.-
)PXVTF#JH2VFSZ.- %JTDVTTJPO Agenda -
©2018 Wantedly, Inc. 8IBUJT8BOUFEMZ 8IBUJT#JH2VFSZ.- 8IZVTF#JH2VFSZ.-
)PXVTF#JH2VFSZ.- %JTDVTTJPO Agenda -
©2018 Wantedly, Inc. 8IBUJT8BOUFEMZ 8IBUJT#JH2VFSZ.- 8IZVTF#JH2VFSZ.-
)PXVTF#JH2VFSZ.- %JTDVTTJPO Agenda -
©2018 Wantedly, Inc. ✓ Google Cloud Next 2018 Ͱൃද ✓
BigQuery + ML (ػցֶश) • طଘͷ SQL πʔϧͱεΩϧͰػցֶश͕Ͱ͖Δ • ػցֶशͷຽओԽ (σʔλΞφϦετɼϏδωενʔϜ͑Δʂ) ✓ BigQuery͚ͩͰ݁͢ΔͨΊखܰʂ • σʔλΛϩʔΧϧڥʹҠಈͤ͞Δඞཁͳ͠ • ։ൃεϐʔυͷ্ What is BigQuery ML? https://cloud.google.com/bigquery/docs/bigqueryml-intro -
©2018 Wantedly, Inc. ✓ ݱࡏαϙʔτ͍ͯ͠ΔϞσϧҎԼͷ 3 छ • ઢܗճؼϞσϧ (σʔλ͔Βͷਪఆ)
• ೋ߲ϩδεςΟοΫճؼϞσϧ (σʔλ͔Β true/false Λఆ) • ଟ߲ϩδεςΟοΫճؼϞσϧ(σʔλΛ3ͭҎ্ͷΫϥεʹྨ) What is BigQuery ML? https://cloud.google.com/bigquery/docs/bigqueryml-intro -
©2018 Wantedly, Inc. ػցֶशʹ͍ͭͯͷਂ͍ཧղ͕ͳ͘ͱɼ BigQuery Ͱ SQL ΫΤϦΛ༻ͯ͠ɼσʔλΛҠಈͤ͞Δ͜ͱͳ͘खܰʹ ઢܗճؼϩδεςΟοΫճؼͳͲͷػցֶशϞσϧΛ࡞࣮ͯ͠ߦͰ͖Δɽ What
is BigQuery ML? https://cloud.google.com/bigquery/docs/bigqueryml-intro -
©2018 Wantedly, Inc. 8IBUJT8BOUFEMZ 8IBUJT#JH2VFSZ.- 8IZVTF#JH2VFSZ.-
)PXVTF#JH2VFSZ.- %JTDVTTJPO Agenda -
©2018 Wantedly, Inc. Overview of architecture BigQuery merge Scheduler ʹొ
Job(ΫΤϦ)ͷ࣮ߦ ΫΤϦͷ࣮ߦ݁ՌΛ BigQuery RDBʹॻ͖ग़͢ Job ͷهड़(΄΅ SQL) Logging Read -
©2018 Wantedly, Inc. Overview of architecture BigQuery merge Scheduler ʹొ
Job(ΫΤϦ)ͷ࣮ߦ ΫΤϦͷ࣮ߦ݁ՌΛ BigQuery RDBʹॻ͖ग़͢ Job ͷهड़(΄΅ SQL) Logging Read Ruby ϑΝΠϧʹ BigQuery ͷΫΤϦΛهड़ͨ͠ Job ͷ࡞ -
©2018 Wantedly, Inc. Define Job BigQuery ͷ࣮ߦ݁ՌΛ࣌Ͱςʔϒϧʹॻ͖ग़͢ export do table
:daily_company_scores columns %w[:day, :company_id, :score] mode :update, [:day] end schedule do frequency :daily end run :bq, <<SQL SELECT DATE(_WT_SCHEDULED_TIME, "+9") AS day, company_id, SUM(action_score) AS score FROM `log.company_actions*` WHERE _TABLE_SUFFIX = FORMAT_TIMESTAMP("%Y%m%d", TIMESTAMP_SUB(_WT_SCHEDULED_TIME, INTERVAL 1 DAY), "+9") GROUP BY company_id SQL -
©2018 Wantedly, Inc. Define Job BigQuery ͷ࣮ߦ݁ՌΛ࣌Ͱςʔϒϧʹॻ͖ग़͢ export do table
:daily_company_scores columns %w[:day, :company_id, :score] mode :update, [:day] end schedule do frequency :daily end run :bq, <<SQL SELECT DATE(_WT_SCHEDULED_TIME, "+9") AS day, company_id, SUM(action_score) AS score FROM `log.company_actions*` WHERE _TABLE_SUFFIX = FORMAT_TIMESTAMP("%Y%m%d", TIMESTAMP_SUB(_WT_SCHEDULED_TIME, INTERVAL 1 DAY), "+9") GROUP BY company_id SQL export do table :daily_company_scores columns %w[:day, :company_id, :score] mode :update, [:day] end # ग़ྗઌͷςʔϒϧ໊ # ग़ྗ͢ΔΧϥϜ # update or replace -
©2018 Wantedly, Inc. Define Job BigQuery ͷ࣮ߦ݁ՌΛ࣌Ͱςʔϒϧʹॻ͖ग़͢ export do table
:daily_company_scores columns %w[:day, :company_id, :score] mode :update, [:day] end schedule do frequency :daily end run :bq, <<SQL SELECT DATE(_WT_SCHEDULED_TIME, "+9") AS day, company_id, SUM(action_score) AS score FROM `log.company_actions*` WHERE _TABLE_SUFFIX = FORMAT_TIMESTAMP("%Y%m%d", TIMESTAMP_SUB(_WT_SCHEDULED_TIME, INTERVAL 1 DAY), "+9") GROUP BY company_id SQL schedule do frequency :daily end # Job ͷ࣮ߦස -
©2018 Wantedly, Inc. Define Job BigQuery ͷ࣮ߦ݁ՌΛ࣌Ͱςʔϒϧʹॻ͖ग़͢ export do table
:daily_company_scores columns %w[:day, :company_id, :score] mode :update, [:day] end schedule do frequency :daily end run :bq, <<SQL SELECT DATE(_WT_SCHEDULED_TIME, "+9") AS day, company_id, SUM(action_score) AS score FROM `log.company_actions*` WHERE _TABLE_SUFFIX = FORMAT_TIMESTAMP("%Y%m%d", TIMESTAMP_SUB(_WT_SCHEDULED_TIME, INTERVAL 1 DAY), "+9") GROUP BY company_id SQL run :bq, <<SQL SELECT DATE(_WT_SCHEDULED_TIME, "+9") AS day, company_id, SUM(action_score) AS score FROM `log.company_actions*` WHERE _TABLE_SUFFIX = FORMAT_TIMESTAMP("%Y%m%d", TIMESTAMP_SUB(_WT_SCHEDULED_TIME, INTERVAL 1 DAY), "+9") GROUP BY company_id SQL # BigQuery ͷΫΤϦͷ࣮ߦ -
©2018 Wantedly, Inc. Overview of architecture BigQuery merge Scheduler ʹొ
Job(ΫΤϦ)ͷ࣮ߦ ΫΤϦͷ࣮ߦ݁ՌΛ BigQuery RDBʹॻ͖ग़͢ Job ͷهड़(΄΅ SQL) Logging Read Job ϑΝΠϧΛՃ͠ɼpull-request ʹͯ͠Ϛʔδ ࣗಈͰ Kubernetes Λ׆༻ͨ͠Scheduler ʹొ͞Εఆظ࣮ߦ͞ΕΔ -
©2018 Wantedly, Inc. Overview of architecture BigQuery merge Scheduler ʹొ
Job(ΫΤϦ)ͷ࣮ߦ ΫΤϦͷ࣮ߦ݁ՌΛ BigQuery RDBʹॻ͖ग़͢ Job ͷهड़(΄΅ SQL) Logging Read -
©2018 Wantedly, Inc. Overview of architecture BigQuery merge Scheduler ʹొ
Job(ΫΤϦ)ͷ࣮ߦ ΫΤϦͷ࣮ߦ݁ՌΛ BigQuery RDBʹॻ͖ग़͢ Job ͷهड़(΄΅ SQL) Logging Read αʔϏε͔ΒɼΫΤϦͷ࣮ߦ݁ՌΛར༻͢Δ -
©2018 Wantedly, Inc. ✓ ݱࡏͷWantedly Visit ͷ Recommendation Team ࣄ
γϯϓϧͳΞΠσΞͰվળͰ͖ͦ͏ͳՕॴ͕ෳ͍ͬͯΔ νʔϜ͕খن ࢲΛؚΊ໊ͯ αʔϏεখن͡Όͳ͍ ͨ͘͞ΜͷϢʔβ ͭͭͷվળʹΊ͍͍ͬͺ͍࣌ؒΛ͔͚͍͍ͯΘ͚Ͱͳ͍ վળαΠΫϧΛ͘͢ճ͍ͨ͠ BigQuery in Recommendation Team -
©2018 Wantedly, Inc. ✓ ݱࡏͷWantedly Visit ͷ Recommendation Team ࣄ
γϯϓϧͳΞΠσΞͰվળͰ͖ͦ͏ͳՕॴ͕ෳ͍ͬͯΔ νʔϜ͕খن ࢲΛؚΊ໊ͯ αʔϏεখن͡Όͳ͍ ͨ͘͞ΜͷϢʔβ ͭͭͷվળʹΊ͍͍ͬͺ͍࣌ؒΛ͔͚͍͍ͯΘ͚Ͱͳ͍ վળαΠΫϧΛ͘͢ճ͍ͨ͠ ༨ஊ Recommendation -
©2018 Wantedly, Inc. It is often necessary to make choices
without sufficient personal experience of the alternatives. In everyday life, we rely on recommendations from other people either by word of mouth, recommendation letters, movie and book reviews printed in newspapers, or general surveys such as Zagat’s restaurant guides. Recommender systems assist and augment this natural social process. ਪનγεςϜͱ [Resnick+ 97] ࣗͷܦݧ͔ΒͷΈͰ͋·ΓΑ͘Θ͔Βͳ͍ͷͷத͔ΒɼͲ͏ ͯ͠ͲΕ͔Λબͳ͚ΕͳΒͳ͍ͱ͍͏͜ͱΑ͋͘Δɽ͜ͷ Α͏ͳࡍΘͨͨͪ͠ɼޱίϛɼਪનঢ়ɼ ৽ฉͷॻධөըධɼϨ ετϥϯΨΠυͳͲͷଞਓ͔ΒͷਪનʹཔΔ͜ͱΛ ৗతʹߦͬͯ ͍Δɽ ใਪનγεςϜͱɼ͜͏ͨࣾ͠ձͰී௨ʹߦΘΕ͍ͯΔ Ұ࿈ͷߦҝΛิॿͨ͠Γɼଅਐͨ͠Γ͢ΔͷͰ͋Δɽ [Resnick 97] P. Resnick and H. R. Varian. Recommender systems. Communications of the ACM, Vol. 40, No. 3, pp. 56–58, 1997. -
©2018 Wantedly, Inc. Recommenders: Tools to help identify worthwhile stuff
ਪનγεςϜͱ [Konstan+ 03] ਪનγεςϜ: Ձͷ͋Δͷ͕ͲΕ͔ಛఆ͢Δͷʹཱͭಓ۩ [Konstan 03] J. A. Konstan and J. Riedl. Recommender systems: Collaborating in commerce and communities. In Proc. of the SIGCHI Conf. on Human Factors in Computing Systems, Tutorial, 2003. -
©2018 Wantedly, Inc. ✓ ݱࡏͷWantedly Visit ͷ Recommendation Team ࣄ
γϯϓϧͳΞΠσΞͰվળͰ͖ͦ͏ͳՕॴ͕ෳ͍ͬͯΔ νʔϜ͕খن ࢲΛؚΊ໊ͯ αʔϏεখن͡Όͳ͍ ͨ͘͞ΜͷϢʔβ ͭͭͷվળʹΊ͍͍ͬͺ͍࣌ؒΛ͔͚͍͍ͯΘ͚Ͱͳ͍ վળαΠΫϧΛ͘͢ճ͍ͨ͠ BigQuery in Recommendation Team -
©2018 Wantedly, Inc. ͨͱ͑… Ϣʔβ͕ձࣾͷืूΛΫϦοΫͨ͠ͱ͍͏ใΛར༻ͯ͠ɼ ͋ΔϢʔβʹձࣾͷืूΛਪન͍ͨ͠ ⭕ ⭕ ⭕ ⭕
⭕ ⭕ ⭕ ʁ ⭕ - - - - - - - ืू Ϣʔβ ⭕ : ΫϦοΫ - : ใͳ͠ ? ͕Ͳ͏ͳΔ͔ͯΔ -
©2018 Wantedly, Inc. աڈͷΫϦοΫใΛجʹͨ͠ϢʔβؒͷྨࣅΛࢉग़ͯ͠ɼ ࣅ͍ͯΔϢʔβ͕ΫϦοΫͨ͠ืूΛਪન͠Α͏ʂ (ϢʔβϕʔεڠௐϑΟϧλϦϯά) ྨࣅ ྨࣅߴ ⭕ ⭕
⭕ ⭕ ⭕ ⭕ ⭕ ʁ ⭕ - - - - - - - ਪન ืू Ϣʔβ ͨͱ͑… -
©2018 Wantedly, Inc. ୯७ͦ͏Ͱߟ͑Δ͜ͱ/Δ͜ͱͨ͘͞Μ… վળαΠΫϧ͕ͳ͔ͳ͔ճͤͳ͍ ࣮ߦͳ͍ʁ σʔλྔ͍͢͝ ΦϑϥΠϯධՁͲ͏͢Δʁ ΦϯϥΠϯධՁʁ ࣮ݴޠʁ
ࢄॲཧͤ͞Δʁ σʔλͷύΠϓϥΠϯઃܭʁ ϚγϯϦιʔεΓͯΔʁ σʔλͷݕূͲ͏͢Δʁ -
©2018 Wantedly, Inc. 㾎վળαΠΫϧΛ͘͢ճͨ͢Ίɼ#JH2VFSZΛϑϧ׆༻ͨ͠վળͷਪਐ wϝϞϦϕʔεͷڠௐϑΟϧλϦϯά͘Β͍ͳΒͱΓ͋͑ͣΫΤϦΛॻ͍ͯ͠·͏ 㾎ͦͷଞͷੳʹ#JH2VFSZΛϑϧ׆༻ w#*πʔϧΛͬͨ,1*ͳͲͷࢦඪͷཧɾࢹ w"#ςετͳͲͷΦϯϥΠϯςετͷධՁ ৴པ۠ؒɼQWBMVFɼʜ BigQuery
in Recommendation Team BigQuery ͷΫΤϦΛॻ͘͜ͱʹ͚ͬ͜͏׳Ε͍ͯΔ(ͭΓ) -
©2018 Wantedly, Inc. 8IBUJT8BOUFEMZ 8IBUJT#JH2VFSZ.- 8IZVTF#JH2VFSZ.-
)PXVTF#JH2VFSZ.- %JTDVTTJPO Agenda -
©2018 Wantedly, Inc. A example of Wantedly People • χϡʔεػೳ
(Timeline) • ͓͢͢ΊͷχϡʔεΛ 1 ʹ 2 ճ (ேͱன) push ௨ͰΒ͍ͤͯΔ -
©2018 Wantedly, Inc. Motivations & Backgrounds ✓ Push ௨Λ։͔ͳ͍ϢʔβʹͱͬͨΒ 1
ʹ 2 ճૹΔͷ໎͔ ✓ 1 ʹ 2 ճ Push ௨Λૹͬͯେৎͦ͏ͳϢʔβʹ͚ͩ 2 ճૹΓ͍ͨ ✓ ଞʹ༏ઌͷߴ͍λεΫ͕͋ΔͷͰ͋·Γͬ͘͡Γ࣌ؒΛ͔͚ΒΕͳ͍ ✓ ͬ͘͞ͱͰ͖ͦ͏ͳͷͰ BigQuery ML ΛͬͯΈΔ -
©2018 Wantedly, Inc. Problem Definition આ໌มɿ2લʙ28લͷظؒʹ͓͚ΔɼϢʔβͷ༷ʑͳΞΫγϣϯ ʲաڈ 1 ϲ݄ͷΞΫςΟϒϢʔβͷதͰɼ1 લʹPush
௨ Λ։෧ͨ͠ϢʔβΛͯΔʳ తมɿ1લͷ Push ௨Λ։͍͔ͨͲ͏͔ (1 or 0) • ։͍ͨ Push ௨ • χϡʔεهࣄͷӾཡ • ໊ͷεΩϟϯ …etc. -
©2018 Wantedly, Inc. Problem Definition આ໌มɿ2લʙ28લͷظؒʹ͓͚ΔɼϢʔβͷ༷ʑͳΞΫγϣϯ తมɿ1લͷ Push ௨Λ։͍͔ͨͲ͏͔ (1
or 0) • ։͍ͨ Push ௨ • χϡʔεهࣄͷӾཡ • ໊ͷεΩϟϯ …etc. આ໌ม͔Βతม (label) ͕0͔1͔ΛͯΔ ʲաڈ 1 ϲ݄ͷΞΫςΟϒϢʔβͷதͰɼ1 લʹPush ௨ Λ։෧ͨ͠ϢʔβΛͯΔʳ -
©2018 Wantedly, Inc. Overview of architecture BigQuery merge Scheduler ʹొ
PREDICT ΫΤϦͷ࣮ߦ ֘Ϣʔβʹ push ௨Λૹ৴ SELECT user_id FROM `push_predict_results` WHERE prob > #{PROB_THRESHOLD} Predict ͷ݁ՌΛ BQ ʹετΞ CREATE MODEL ΫΤϦΛ࣮ߦ ࡞ͨ͠Ϟσϧ Λ BQ ʹอଘ ֘Ϣʔβͷ id ΛಡΈࠐΉ PREDICT ΫΤϦΛ࣮ߦ͢Δ Job هड़(΄΅ SQL) -
©2018 Wantedly, Inc. MODEL ͷ࡞ BigQuery merge Scheduler ʹొ PREDICT
ΫΤϦͷ࣮ߦ ֘Ϣʔβʹ push ௨Λૹ৴ SELECT user_id FROM `push_predict_results` WHERE prob > #{PROB_THRESHOLD} Predict ͷ݁ՌΛ BQ ʹετΞ CREATE MODEL ΫΤϦΛ࣮ߦ ࡞ͨ͠Ϟσϧ Λ BQ ʹอଘ ֘Ϣʔβͷ id ΛಡΈࠐΉ PREDICT ΫΤϦΛ࣮ߦ͢Δ Job هड़(΄΅ SQL) -
©2018 Wantedly, Inc. CREATE MODEL `ml_models.push_open` OPTIONS (model_type='logistic_reg') AS SELECT
IF(open IS NULL, 0, 1) AS label, weekly_open_count, timeline_show_count, scan_count, ... FROM `people.ironna_data*` WHERE ... MODEL ͷ࡞ -
©2018 Wantedly, Inc. CREATE MODEL `ml_models.push_open` OPTIONS (model_type='logistic_reg') AS SELECT
IF(open IS NULL, 0, 1) AS label, weekly_open_count, timeline_show_count, scan_count, ... FROM `people.ironna_data*` WHERE ... # Ϟσϧ࡞Λએݴ ˌ࡞͢ΔϞσϧ໊Λهड़ # ଞʹ # CREATE MODEL IF NOT EXISTS # CREATE OR REPLACE MODEL CREATE MODEL `ml_models.push_open` MODEL ͷ࡞ MODEL ͷ࡞ -
©2018 Wantedly, Inc. CREATE MODEL `ml_models.push_open` OPTIONS (model_type='logistic_reg') AS SELECT
IF(open IS NULL, 0, 1) AS label, weekly_open_count, timeline_show_count, scan_count, ... FROM `people.ironna_data*` WHERE ... # ՃͷϞσϧΦϓγϣϯΛࢦఆ # model_type ʹ # ’logistic_reg’(ϩδεςΟοΫճؼ) ͔ ‘linear_reg’(ઢܗճؼ) Λࢦఆ # ଞʹɼL1, L2 ਖ਼ଇԽͷద༻ྔɼֶशͷεςοϓɼ # ೖྗσʔλΛτϨʔχϯάηοτͱධՁηοτʹׂ͢Δํ๏ɼͳͲͳͲΛࢦఆͰ͖Δ OPTIONS (model_type='logistic_reg') AS MODEL ͷ࡞ MODEL ͷ࡞ -
©2018 Wantedly, Inc. CREATE MODEL `ml_models.push_open` OPTIONS (model_type='logistic_reg') AS SELECT
IF(open IS NULL, 0, 1) AS label, weekly_open_count, timeline_show_count, scan_count, ... FROM `people.ironna_data*` WHERE ... # ೖྗσʔλΛग़ྗ͢ΔΫΤϦهड़ # label ͱ͍͏໊લͷྻΛͯΔ # (ΧϥϜ໊ΦϓγϣϯͰࢦఆՄೳ) SELECT IF(open IS NULL, 0, 1) AS label, weekly_open_count, timeline_show_count, scan_count, ... FROM `people.ironna_data*` WHERE ... MODEL ͷ࡞ MODEL ͷ࡞ -
©2018 Wantedly, Inc. CREATE MODEL `ml_models.push_open` OPTIONS (model_type='logistic_reg') AS SELECT
IF(open IS NULL, 0, 1) AS label, weekly_open_count, timeline_show_count, scan_count, ... FROM `people.ironna_data*` WHERE ... # ೖྗσʔλΛग़ྗ͢ΔΫΤϦهड़ # label ͱ͍͏໊લͷྻΛͯΔ # (ΧϥϜ໊ΦϓγϣϯͰࢦఆՄೳ) SELECT IF(open IS NULL, 0, 1) AS label, weekly_open_count, timeline_show_count, scan_count, ... FROM `people.ironna_data*` WHERE ... MODEL ͷ࡞ MODEL ͷ࡞ -
©2018 Wantedly, Inc. SELECT * FROM ML.EVALUATE(MODEL `ml_models.push_open`, ( SELECT
IF(open IS NULL, 0, 1) AS label, weekly_open_count, timeline_show_count, scan_count, ... FROM `people.ironna_data*` WHERE ... ) ) MODEL ͷੑೳධՁ # ࡞ͨ͠Ϟσϧ͕ͲΕ͚ͩͷੑೳΛ͍࣋ͬͯΔ͔ධՁ # (Ͳͷ͘Β͍ਖ਼͘͠ label ΛͯΒΕΔ͔) -
©2018 Wantedly, Inc. SELECT * FROM ML.EVALUATE(MODEL `ml_models.push_open`, ( SELECT
IF(open IS NULL, 0, 1) AS label, weekly_open_count, timeline_show_count, scan_count, ... FROM `people.ironna_data*` WHERE ... ) ) MODEL ͷੑೳධՁ ※ దʹ͍ͬͯ͡·͢ # ϩδεςΟοΫճؼͷ߹ҎԼͷΑ͏ͳग़ྗ # precision: ద߹ # label ͕ 1 ͱ༧ଌͨ͠ͷͷ͏ͪɼ࣮ࡍʹ 1 Ͱ͋Δͷͷׂ߹ # recall: ࠶ݱ # label ͕ ࣮ࡍʹ 1 Ͱ͋Δͷͷ͏ͪɼ1 ͱ༧ଌ͞Εͨͷͷׂ߹ MODEL ͷੑೳධՁ -
©2018 Wantedly, Inc. SELECT * FROM ML.ROC_CURVE(MODEL `ml_models.push_open`, ( SELECT
... MODEL ͷੑೳධՁ (ROC_CURVE) # ROC ۂઢग़ྗͰ͖Δʂ ※ దʹ͍ͬͯ͡·͢ MODEL ͷੑೳධՁ -
©2018 Wantedly, Inc. SELECT * FROM ML.CONFUSION_MATRIX(MODEL `ml_models.push_open`, ( SELECT
... MODEL ͷੑೳධՁ (CONFUSION_MATRIX) # ࠞ߹ߦྻग़ྗͰ͖Δʂ ※ దʹ͍ͬͯ͡·͢ -
©2018 Wantedly, Inc. ༧ଌΫΤϦͷεέδϡʔϥͷొ BigQuery merge Scheduler ʹొ PREDICT ΫΤϦͷ࣮ߦ
֘Ϣʔβʹ push ௨Λૹ৴ SELECT user_id FROM `push_predict_results` WHERE prob > #{PROB_THRESHOLD} Predict ͷ݁ՌΛ BQ ʹετΞ CREATE MODEL ΫΤϦΛ࣮ߦ ࡞ͨ͠Ϟσϧ Λ BQ ʹอଘ ֘Ϣʔβͷ id ΛಡΈࠐΉ PREDICT ΫΤϦΛ࣮ߦ͢Δ Job هड़(΄΅ SQL) -
©2018 Wantedly, Inc. SELECT * FROM ML.PREDICT(MODEL `ml_models.push_open`, ( SELECT
IF(open IS NULL, 0, 1) AS label, weekly_open_count, timeline_show_count, ... ) ) ϞσϧΛ༻ͯ݁͠ՌΛ༧ଌ ※ దʹ͍ͬͯ͡·͢ -
©2018 Wantedly, Inc. SELECT * FROM ML.PREDICT(MODEL `ml_models.push_open`, ( SELECT
IF(open IS NULL, 0, 1) AS label, weekly_open_count, timeline_show_count, ... ) ) ϞσϧΛ༻ͯ݁͠ՌΛ༧ଌ ※ దʹ͍ͬͯ͡·͢ # ϞσϧΛ༻ͯ͠ɼೖྗσʔλʹରͯ͠ label ͷΛ༧ଌ͢Δ # predicted_label: ༧ଌ͞Εͨ # predicted_label_probs: label ͝ͱͷ༧ଌ֬ -
©2018 Wantedly, Inc. PREDICT ͷ࣮ߦ BigQuery merge Scheduler ʹొ PREDICT
ΫΤϦͷ࣮ߦ ֘Ϣʔβʹ push ௨Λૹ৴ SELECT user_id FROM `push_predict_results` WHERE prob > #{PROB_THRESHOLD} Predict ͷ݁ՌΛ BQ ʹετΞ CREATE MODEL ΫΤϦΛ࣮ߦ ࡞ͨ͠Ϟσϧ Λ BQ ʹอଘ ֘Ϣʔβͷ id ΛಡΈࠐΉ PREDICT ΫΤϦΛ࣮ߦ͢Δ Job هड़(΄΅ SQL) -
©2018 Wantedly, Inc. Overview of architecture BigQuery merge Scheduler ʹొ
PREDICT ΫΤϦͷ࣮ߦ ֘Ϣʔβʹ push ௨Λૹ৴ SELECT user_id FROM `push_predict_results` WHERE prob > #{PROB_THRESHOLD} Predict ͷ݁ՌΛ BQ ʹετΞ CREATE MODEL ΫΤϦΛ࣮ߦ ࡞ͨ͠Ϟσϧ Λ BQ ʹอଘ ֘Ϣʔβͷ id ΛಡΈࠐΉ PREDICT ΫΤϦΛ࣮ߦ͢Δ Job هड़(΄΅ SQL) -
©2018 Wantedly, Inc. Motivations & Backgrounds ✓ ʮΛฉ͖ʹߦ͖͍ͨʯϘλϯ͕ԡ͞ΕΔॏཁͳࢦඪͷ 1 ͭ
✓ ͦͷ··αʔϏεΠϯ͢ΔΘ͚Ͱͳ͍͕ɼ׆༻ͷํ๏͍Ζ͍Ζߟ͑ΒΕΔ ✓ ϢʔβͷͲͷΑ͏ͳߦಈ͕ϘλϯΛԡ͢͜ͱʹͭͳ͕Δͷ͔Γ͍ͨ ✓ ͬ͘͞ͱࢼͤͦ͏ͳͷͰ BigQuery ML ΛͬͯΈΔ -
©2018 Wantedly, Inc. Problem Definition આ໌มɿ8લʙ28લͷظؒʹ͓͚ΔɼϢʔβͷ༷ʑͳΞΫγϣϯ ʲաڈ 1 ϲ݄ͷΞΫςΟϒϢʔβͷதͰɼ1 લʙ7
લͷؒʹ ʮΛฉ͖ʹߦ͖͍ͨʯϘλϯΛԡͨ͠ϢʔβΛͯΔʳ 1લʙ7લͷظؒʹ ʮΛฉ͖ʹߦ͖͍ͨʯϘλϯΛ ԡ͔ͨ͠Ͳ͏͔ (1 or 0) • ʮΛฉ͖ʹߦ͖͍ͨʯΛԡͨ͠ • ձࣾͷืूͷৄࡉϖʔδΛӾཡͨ͠ • ձ͔ࣾΒͷεΧτϝοηʔδʹฦ৴ͨ͠ …etc. తม : -
©2018 Wantedly, Inc. https://towardsdatascience.com/when-will-stack-overflow-reply-how-to-predict-with-bigquery-553c24b546a3 ͓͠Ζ͍ͳͱࢥͬͨ׆༻ྫ • ճΛಘΒΕΔ֬ • ճΛಘΒΕΔ·Ͱͷ࣌ؒ •
ѱ͍ධՁΛೖΕΒΕΔ֬ • ༵ • ࣌ؒ • ࣭จͷ͞ • ࣭ͷλΠτϧͷ1ޠ • λΠτϧ͕ “ʁ” ͰऴΘ͍ͬͯΔ͔Ͳ͏͔ • ༻ͨ͠λά • ΞΧϯτΛ࡞ͨ࣌͠ظ In Stack Overflow -
©2018 Wantedly, Inc. 8IBUJT8BOUFEMZ 8IBUJT#JH2VFSZ.- 8IZVTF#JH2VFSZ.-
)PXVTF#JH2VFSZ.- %JTDVTTJPO Agenda -
©2018 Wantedly, Inc. ྑ͔ͬͨ͜ͱ 㾎ʹऔΓΜͰ͔Β࠷ॳͷϞσϧΛ࡞͢Δ·Ͱ͕ຊʹҰॠͩͬͨ w σʔλͷҠಈͳͲΛߟ͑ͳ͍͍ͯ͘ͷͬͯૉΒ͍͠ʂ 㾎ҙ֎ͱ͍Ζ͍ΖͰ͖Δ w ਖ਼ଇԽɼֶशͷઃఆɼFBSMZTUPQQJOHɼΫϥεෆۉߧͷରॲʜ
㾎݁Ռͷڞ༗ָ͕ w ࣮ߦ݁ՌͷϦϯΫ͛ͨΓɼςʔϒϧͷॴڭ͑ͨΓɼΫΤϦ͚ͩ͛ͨΓ 㾎ແݶͷϦιʔε w (PPHMFઌੜʹ͓ࢪΛ͢Δ͚ͩʜ -
©2018 Wantedly, Inc. ؾΛ͚ͭͳ͍ͱ͍͚ͳ͍͜ͱ 㾎ϞσϧΫΤϦͷཧ w Ϟσϧ࡞࣌ͷΫΤϦΛͲ͏ཧ͢Δʁ w ϛεͬͯϞσϧ͕ফ͞ΕͨΓ্ॻ͖͞ΕΔͱਏ͍ 㾎Ϟσϧͷߋ৽ఆظతͳ1SFEJDUΓͮΒ͍
w 8BOUFEMZͰ͍͍ײ͡ͷεέδϡʔϥͷΈ͕͋Δ͕ʜ 㾎αʔϏεͰ׆༻͢Δ߹ɼऔΓΉΛ͖ͪΜͱߟ͑Δ w ͲΜͳʹͰద͍ͯ͠ΔΘ͚Ͱͳ͍ w બࢶͷͭͱͯ͠ߟ͑Δ -
©2018 Wantedly, Inc. ؾΛ͚ͭͳ͍ͱ͍͚ͳ͍͜ͱ 㾎ϞσϧΫΤϦͷཧ w Ϟσϧ࡞࣌ͷΫΤϦΛͲ͏ཧ͢Δʁ w ϛεͬͯϞσϧ͕ফ͞ΕͨΓ্ॻ͖͞ΕΔͱਏ͍ 㾎Ϟσϧͷߋ৽ఆظతͳ1SFEJDUΓͮΒ͍
w 8BOUFEMZͰ͍͍ײ͡ͷεέδϡʔϥͷΈ͕͋Δ͕ʜ w ΫΤϦεέδϡʔϦϯάػೳ͕ϦϦʔε͞Εͨʂ 㾎αʔϏεͰ׆༻͢Δ߹ɼऔΓΉΛ͖ͪΜͱߟ͑Δ w ͲΜͳʹͰద͍ͯ͠ΔΘ͚Ͱͳ͍ w બࢶͷͭͱͯ͠ߟ͑Δ -
©2018 Wantedly, Inc. ͜͏͍͏;͏ʹ͍͍͑ͷ͔ʁ ✓ ػցֶशͬͨ͜ͱͳ͍ਓ͕ػցֶशΛഽͰײ͡Δ ✓ ຊ֨తͳػցֶशϓϩδΣΫτΛ։࢝͢ΔલʹઢܗճؼͰͬ͘͞ͱੳͯ͠ΈΔ ✓ ·ͩखΛ͚͍ͯͳ͍͚Ͳɼ͕ͬͭΓϦιʔεΛೖ͢Δͷ͍͠Α͏ͳ୯७
ͳྨΛϩδεςΟοΫճؼͰͬ͘͞ͱղ͘ ✓ ΦʔϓϯʹͰ͖ΔσʔλͰ͓ͪΌΛ࡞ͬͯެ։͢Δ https://towardsdatascience.com/when-will-stack-overflow-reply-how-to-predict-with-bigquery-553c24b546a3 -
©2018 Wantedly, Inc. Summary 㾎 #JH2VFSZ͚ͩͰ.-͕Ͱ͖Δ#JH2VFSZ.-ͷొ w σʔλͷҠಈͳ͠ w 42-Λॻ͚ͩ͘Ͱػցֶश͕Ͱ͖Δ
w ػցֶशͷຽओԽɼ։ൃͷ্ 㾎 8BOUFEMZͰͬͯΈͨ w γϯϓϧͳղܾ w ຊ֨తͳ.-ϓϩδΣΫτΛ։࢝͢Δલͷௐࠪ σʔλΛ͑Δ͔ͷௐࠪ 㾎 ࠓޙʹظ✨ ϥϯμϜϑΥϨετ͕࣮͞ΕͯΔʜ