現場データサイエンティスト奮闘記

とある企業で働くデータサイエンティストの日々のアウトプット

GoogleはYMYLという言葉を発明したのがすごいよねという話

ある機械学習モデルによるコンテンツの分類器を作成して本番の運用に乗せてからしばらくたったときの話です。
モデル開発当初はF1 socreもよく本番の運用に十分乗るクオリティとの合意をとって開発していたのですが、ある分類で間違ったレコードがエスカレされてきて、どうやらその「間違い方」が問題らしいとのこと。

曰く、「常識的に考えてこの間違い方はおかしい」とのことなのですが、そもそもそういう前提条件共有されてないし、所詮確率モデルなので間違いは普通に発生するし、間違い方に良いも悪いもあるかとも思ったものです。

さらに、「常識的に」という部分の内容が言語化されていないので、改善しようにも何が問題で何が問題でないかという切り分けが出来ずに苦戦するという事態。
要は、間違うにも間違ってはいけない部分と間違いが許容される領域が暗に存在しているが、明示されていないのでそれを言語化する必要があるという問題(問題以前な気がする…)が発生したのです。

ここで思うのは、Google検索におけるYMYL問題と本質的には同じことだなと。
Googleの検索アルゴリズムには機械学習が使われているのは昨今ではよく知られていますが、少し前に健康領域などで検索結果がおかしいという問題が発生していました。 多くの領域で力を発揮していた機械学習モデルも、その間違いが許容されない分野が存在していたのです。

さて、その領域における間違いがなるべく発生しないように改善を行う必要があるのですが、改善対象となる領域を「YMYL」として問題の切り分けができた(言語化できた)点がGoogleのすごい発明のひとつなのだと思います。

問題を切り分けることでシステムで解決可能な問題となります。
逆に切り分けることができなければ、「これは良い」「これはちょっと違う気がする」というお気持ちと常に戦い続けることを意味し、定式化できずに解決不能な問題に陥ることを意味します。

YMYLという言葉を発明し、問題の切り分けが可能になったことで解決可能な問題として定式化できたのがすごいなあと実感する次第です。

GKEでなるべく節約してcronjobを使う方法

概要

  • cronjob をGKEで使っているけど、常に n1-standard 系のインスタンスが立っていると結構お高い
  • しかし処理によっては g1-small などの貧弱なインスタンスでは足りないケースがある
  • したがって cronjob のときだけパワーのあるマシンが使えるようにして最低限の課金で済ませたい

という状況に使えるアイディアです。
結論から言うとjobテンプレートに nodeSelector を記載して、default node pool 以外のノードを指定する方式です。

続きを読む

Flaskでリモートアドレスを request.remote_addr で取得するときの注意点

Flask の前にプロキシがあるときの対策

以下のように書けばよい

if request.headers.getlist("X-Forwarded-For"):
   ip = request.headers.getlist("X-Forwarded-For")[0]
else:
   ip = request.remote_addr

参考

python - Flask request.remote_addr is wrong on webfaction and not showing real user IP - Stack Overflow

firebaseのid_tokenによる認証をPythonで行う方法

概要

  • firebaseのログイン処理は通常フロントエンドで行い、ユーザーをサーバーサイドで認証するときのデバッグ時などを想定
  • サーバーサイドで実装してるとローカルで試すときにfirebaseで発行されるid_tokenがないと認証処理ができなくてデバッグできなくて困ります
  • そこでPythonだけでid_token発行してログイン処理できる方法があったのでメモ
続きを読む

Cloud Endpoints + GKEで構築したAPIをマネージド証明書を用いてhttps通信に対応させる

概要

APIを作成する際に、GCPのサービスであるCloud Endpointsを使うとAPIのドキュメント管理や認証機能を簡単に実装できるなどいろいろと便利です。アプリケーションの部分はGKEで作ってそれらを連携させていたりします。

それらの詳しい方法は以下のリンクでチュートリアルを実際にやっていただくのがわかりやすいです。
Kubernetes での Endpoints のスタートガイド  |  OpenAPI を使用した Cloud Endpoints  |  Google Cloud

ですが、このチュートリアルではhttpでの通信を行うところまでしかできません。この記事では、マネージド証明書を用いてCloud Endpointsにて作成したAPIhttps通信に対応させる方法を記載します。

続きを読む

MySQLでカラムを追加して外部キーを付け替えるときの手順

状況

以下のような状況を想定して外部キー付け替えの手順をメモします。

users テーブルには id , uid の2カラムがあります。
posts テーブルには user_id カラムがあり、これが users.id を参照する外部キーとなっています。
また、 posts テーブルには uid カラムがありません。

ここで、 posts テーブルに uid カラムを追加し、これを users.id を参照する外部キーに設定し、既存の posts.user_id はカラムごと削除します。

続きを読む

Nuxt.jsの簡単なアプリをDockerコンテナ上で動かすまでのサンプル

普段はインフラやサーバーサイドの方を触ることが多いのですが、フロントのDockerコンテナ化の流れを勉強したくてやったものをまとめました。
コードはこちらのリポジトリにおいてあります。

続きを読む