omohayui blog

おも‐はゆ・い【面映ゆい】[形][文]おもはゆ・し[ク]《顔を合わせるとまばゆく感じられる意》きまりが悪い。てれくさい。

出産までにやることリスト

これは何か

友人や先輩ママの話を聞いていると、子どもが生まれてくるまでにやれることやっといた方がいいよってよく言われる。
ということで、9月から産休にも入るし、とりあえずTODOリストを作成してみた。

出産までにやること(やりたいこと)リスト

  • 勉強系
    • TOEIC受験(10/2)
    • イタリア語検定の準備
    • 積んでる本読む
    • [x] 2つ以上分析コンペ参加
    • AtCoderはじめる
    • Google Assistant App (Actions) を Dialogflow に移行
    • 学生時代に作ったWebサイトを作り直す
  • お出かけ系
    • 日帰り旅行
    • カワウソカフェに行く
    • 新たなラーメン屋を探す
  • 出産準備系
    • [x] 保育園の見学に行く
    • 保育園候補決める
    • [x] 母親学級に行く
    • [x] 安産祈願に行く
    • [x] 子どもの名前考える
    • マイベビーリストのアイテムを揃える
  • 掃除系
    • 窓の掃除
    • ベランダの掃除
    • 各所の換気扇の掃除

心意気

まずはベイビーが無事に生まれてくることが第一なので、無理せずやってこうと思う。
最近はとにかく胎動が激しいので、早く生まれたがってる気がしてならない。
焦らずじっくりと出てきておくれ。。。

分析コンペに初参加した話

なぜ参加したのか?

GTUGGirlsスタッフ繋がりの友人3人で「Kaggleとデータサイエンスを勉強する会」を随分前から週一で行っているが、輪読会がメインで試しにトレーニングコンペをやってみるぐらいで一度もコンペに参加したことがなく、そろそろ何かにサブミットしたいということで参加してみた。

どんなコンペに参加したのか?

チームで参加すると言っても我々は素人なので、ハードルの低そうな Nishika の「生鮮野菜の価格予測」というコンペに参加した。
ハードルが低そうと言っても、ちゃんと賞金とメダル・スコア付与ありのコンペだ。

大田市場で取引された各生鮮野菜の日次の卸売価格、取引量、産地などのトレーニングデータと全国各地の気象データから、2022年5月の各野菜の卸売価格を予想するというものだ。

データから色々推測する

  • トレインデータに入っている野菜は44種類ほどだが、テストデータに入ってるのは16種類だけ
    • 最終的に予測が必要な16種類だけに絞ってモデルを作るべきか?他の野菜も考慮して作るべきか?
  • 野菜の種類によって季節ごとに価格が変動するもの、あまり変動しないものがあり、差がかなり大きい
    • 野菜ごとにモデルを作った方が良さそう
  • 取引が極端に少ない日がある
    • 大田市場は水曜が休みのことが多いらしい、休場日カレンダーのデータを使った方が良さそう
  • 各野菜の年次の卸売価格を比較すると、年ごとに大きく異る
    • 毎年の5月のデータを重視するよりも、直近のデータを重視した方が良さそう

データの前処理

  • このコンペは初心者向けにチュートリアルのNotebookが用意されていたので、それをベースに進めていった
    • チュートリアルと大きく違うところは月次でデータをまとめてしまっているところを日次で処理していったところ
  • トレインデータと気象データのエリア名が異なるのでマッピングを作成してエリア名を統一する
    • 「各地」となっているところは全国の平均気象データを作って補完

学習・推論

  • 過去の値をラグ特徴量として扱ったが、年単位のデータは振り幅が大きい、季節を考慮すると半年前のデータなどは返ってノイズになるということで、1,2,3,12ヶ月前の日次データを特徴量にすることにした
    • ただ、このやり方だと特定の野菜の xヶ月前の取引が丁度存在しないというケースは発生するので、その場合はその xヶ月前の前後1週間のデータの平均で補完した
  • 学習には安定と実績のLightGBMを使った
  • バリデーションはHold-out法を使った

コンペの結果は?

全然準備する時間が足りなくて1人1回ずつのサブミットになってしまったが、自分のサブミットしたファイルが最終スコア 15.703526 (55位/299) という初めてにしてはまずまずの結果を出したので良かった。一応メダルも貰えるらしい。

今後は?

勉強会は今後も続けて行くことになっていて、次回は中古マンションの価格予想というコンペに参加しようと計画している。
分析ド素人の私が(普段はGoでAPIとか、Elasticsearchで検索インフラのメンテしてる)ここまでモチベーションを保てているのはひとえに一緒に勉強会をしてくれている友人たちのおかげである。本当に感謝。

▼勉強会で扱った書籍

protobuf v2 で protocmp.IgnoreFields() 使う

はじめに

これは完全に自分用の備忘録です。
もしも同じところで引っかかった方がいて参考になる場合は別ですが、特に読んでいただくほどのものではないです。 あしからず!

Go protobuf API v1 と v2

blog.golang.org

The github.com/golang/protobuf module is APIv1.
The google.golang.org/protobuf module is APIv2.

こちらの記事にあるように、github.com/golang/protobuf が v1, google.golang.org/protobuf が v2 です。
そして、proto.Message インターフェイスを変換して、2つのインターフェイス間の移行を容易にする関数が用意されてるとありますが、
つまり下位互換性はないということです。

protobuf の Diff で cmpopts.IgnoreFields() を使う

テストの中で cmp.Diff で struct 同士の Diff を取ることはよくあると思うのですが、protobuf 同士でもこれを使うことがあります。
そして、 cmp.Diff で特定の field の diff を無視したいときに使うのが、 cmpopts.IgnoreFields() ですが、
これは v1 では ignore されるのですが、v2 に移行するときに必要になる protocmp.Transform() と合わせて使おうとすると、ignore されません。

// protobuf v1
if diff := cmp.Diff(want, resp,
    cmpopts.IgnoreFields(todopb.Task{}, "Created", "Updated"),
); diff != "" {
    t.Errorf("differs: (+got -want)\n%s", diff)
}

そこで、v2 では、 cmpopts.IgnoreFields() を使う必要があります。

// protobuf v2
if diff := cmp.Diff(want, resp,
    protocmp.IgnoreFields(proto.MessageV2(&todopb.Task{}), "created", "updated"),
    protocmp.Transform(),
); diff != "" {
    t.Errorf("differs: (+got -want)\n%s", diff)
}

protocmp.Transform() を付けなくてはいけないという認識はあったのですが、ここを書き換えることに気づかず、なんで ignore されないんだろうなって考えてました。

以上、備忘録です。

Dialogflow CX Competition に応募してみた

はじめに

そもそも Dialogflow CX って何?という方がこれを読んでくれているかもしれないので、ざっくりと説明すると、2020年に Google Cloud がリリースしたチャットボットやテレフォニーエージェント(代理で電話応答してくれるボット)を構築するためのボット構築プラットフォームのことです。
従来の Google アシスタントアプリの作成や簡単なチャットボット作成に利用されていた Dialogflowは、Dialogflow ES(Essentialsの略)にブランド化されていますが、CX は大規模だったり、複雑な仮想エージェントに適していて、エンタープライズレベルのプロジェクト用に進化しています。
...という訳で CX はお値段もエンタープライズ向けだったので、正直私もドキュメントを読んだりしていても GCP のコストが気になって気軽に触ったことがありませんでした。

Dialogflow CX Competition とは?

Dialogflow CX Competition (global) は、Google 公式が開催している Dialogflow CX を使ったコンペです。

f:id:omohayui:20210808171049p:plain

このコンペには2種類の応募方法があります。

  • UX Designers - Write a conversation flow
    • UXデザイナー向けの種目で、COVID-19 に関連するテキストチャットボットの会話フローを設計します。(例:ワクチン接種のスケジューラー、FAQ、旅行先での許可に関するボット)
  • Bot Developers - Build an integration
    • チャットボット開発者向けの種目で、Dialogflow CX API を使用して、チャットボットの統合環境を構築します。(例:ウェブサイト、ブログ、WhatsApp、CRMCMS、モバイルなどにチャットボットを組み込む)

特典その1:無料のトレーニン

私がまず応募してみようと思った理由は、無料の Dialogflow CX トレーニングを受けられるというところです。 とりあえず参加申請すると数日後に Qwiklabs のオンライントレーニングへの招待メールがきます。
Qwiklabs で受けることができるのは2つのコードラボなのですが、ここで実際に動かせる Dialogflow CX の環境はシュミレーターなどではなく、トレーニング用に発行された GCPアカウントで実際に Cloud Console にログインして Dialogflow CX の開発をすることができます。
ひとつ注意点なのは、「Start Lab」ボタンを押したら1時間半以内にそのコードラボを終わらせないといけないということです。時間になったら、トレーニング用のアカウントから強制ログアウトされて、一度作ったチャットボットは二度と触れません。もう一度「Start Lab」することはできますが、新しいアカウントになるので最初からチャットボットを作り直しになります...
なので、「Start Lab」ボタン押す前にコードラボの内容を一通り読んでおくことをおすすめします。私は英語読むの遅いので先に読んでないと間違いなく間に合わなかったと思います。
あと、ditectintent のURL設定するところがコードラボの説明だと間違っている気がしました。(Feedbackに書いておいたけれど)

特典その2:Dialogflow CX Tシャツ

これは受賞者に貰えるとかではなくて、プロポーサルを提出した先着200名に無料配布してくれるという特典です。
プロポーサルの期限は 8/9 なのですが、(日本時間ならまだ間に合うので皆さん急いでとりあえず応募してみましょう!)先日、提出した私のプロポーサルでも先着200名に入っていたらしく、Tシャツをオーダーすることができました。
男性・女性用、サイズも自分で選べました。

特典その3:受賞者には豪華賞品

UXデザイナー向け、チャットボット開発者向け受賞者それぞれ、1位から3位までの方々には Fitbit Sense や Nest Hub, Lego Kit などの賞品がついてきます。私は受賞は狙っていませんが、StarWarsLego Kit は欲しいな...って少し思いました。はい。
あと、「The Definite Guide to Conversational AI with Dialogflow and Google Cloud」という本もついてくるそうです。
(これ、Amazon で調べたら 6000円以上するのね...)

これからのタイムライン

8/9 から応募されたプロポーサルの審査が始まり、Best idea として50のプロポーサルがノミネートされます。
ノミネートされた人は、実際に会話フローの構築やチャットボットの統合環境を作って 8/31 までにソースコードを提出します。
コントリビューターは全員、Googleから SNS や Dialogflow の Webサイトを通じて紹介されるらしいです。
自分のプロポーサルがノミネートされるされないに関わらず、ノミネートされたコードがオープンソースとして見れるというのはうれしいですね。
そして、最終的な受賞者の発表は 9/13 です。

万が一、私のプロポーサルが50のノミネートに入ったら、また続きを書きたいと思います。ではでは。

長縄跳びのトラウマ

はじめに

昨日、Googleさんが主催してる Women Developer Academy というイベントの初日で Cultivate Confidence というセッションに参加したときに、ふと自分に自信が持てない傾向になった原因はなんだろうって勝手に深堀りをしてみた。

→セッションの中で紹介された女の子の "Daily Affirmation (毎日の自己肯定)" 超かわいい。

小学生の見えてる世界

子どもの頃、私はいわゆる運動音痴で、国語、算数、理科、社会、音楽、図工、家庭科がオール5でも体育は2か3みたいな成績の子だった。

中でも、長縄8の字跳び(みんなで一斉に飛ぶやつじゃなくて、一人ずつ跳んでは抜けて連続回数を競う)という種目がめちゃくちゃ苦手で、クラス対抗の長縄跳び大会がある度に世界の終わりを願うほど嫌いだった。

f:id:omohayui:20210718103203p:plain:w300

当時のルールだと最長の連続回数を競うので、一人ずつ跳んでいってカウントが伸びていっても、一人下手な子がいるとそこでカウントがリセットされる。
40人クラスだったとして、ド下手が一人いたら、そのクラスの記録は40超えることはないのだ。

必然的に私はクラス全員に迷惑をかけることになる。
優しい子の「練習すれば上手くなるよ」という励ましも、私にとっては「足手まとい」「無能」の烙印を押されたようにしか聞こえなかったし、どんなに嫌でも絶対に練習を欠席してはいけない重圧も感じてた。

そんな感じで、みんなに迷惑をかけている自分はこの世にいきている価値がないと思うぐらい自信を失って、普段の時間にクラスメイトに話しかけるのすら苦手だった。

大人の見えてる世界

高校生のときに私の世界は180度変わったと思う。授業でもイベントでも選択する自由が与えられた。
クラス対抗のスポーツ大会とかはあったけど、自分が少しでも活躍できる種目を選ぶことができたし、それなりに楽しかった。

大人になって、気づいたことがある。
長縄を跳べなくたって、誰にも迷惑をかけていないのだ。
社会人になってからそこそこ長い年月が経ったけれども、一度も長縄8の字跳びを強要されたことはないし、跳べないという事実で誰かを困らせたりもしたことはない。

小学生の自分に教えてあげたい、長縄が跳べなくても、この世に生きている価値はあると。

それで?

結局、Cultivate Confidence とは関係ない話になってしまったけど、子どもの見えてる世界って外からの影響を受けやすいし、範囲が狭いからそれしか見えてなかったり、逃げ道がないから自己否定に走りがちなんだなって。

これはきっと色々な選択が与えられたはずの大人にも言えることで、見えてる範囲が狭いと自分のだめな部分、嫌いな部分ばかりが脳内を占めてしまって、自分の良い部分、達成したことが薄れていってしまう。

子どもでも大人でも、まわりが心理的安全性を確保してくれるのが、自己否定に陥りがちな人を減らす手段にはなると思うけど、自ら Cultivate Confidence するには、一つ一つ、自己肯定してくのが良いのかな。

ということで自分も毎朝鏡に向かって、I can do anything good! って叫ぼうと思います。嘘です。