TAMALOG

プログラミングがあれば遠いところへ行けます。プログラムと人の共生を記録します。

二値分類器のAUC

機械学習で作成したモデルは、様々な計算方法で評価される。ここでは、ROC曲線とAUCについてまとめてみる。

二値分類器について考える。二値分類器は[0, 1]区間の実数値(以下、スコア)を出力するものとする。

データ番号 正解ラベル スコア
1 apple 0.1
2 non-apple 0.9
3 apple 0.2
4 apple 0.4
5 non-apple 0.4
6 non-apple 0.7
7 non-apple 0.8
8 non-apple 0.5
9 apple 0.4

学習した二値分類器が上記のようなスコアを出力した。この表で正解ラベル列はまだ気にしなくても良い。 このスコアにしきい値を設けることで、二値分類ができる。例えば、0.5未満をappleと判断すると仮定する。分類結果の列を追加して表を更新する。

データ番号 正解ラベル スコア 分類結果
1 apple 0.1 apple
2 non-apple 0.9 non-apple
3 apple 0.2 apple
4 apple 0.4 apple
5 non-apple 0.4 apple
6 non-apple 0.7 non-apple
7 non-apple 0.8 non-apple
8 non-apple 0.5 non-apple
9 apple 0.4 apple

このときの混同行列は、以下のようになる。

apple(予測) non-apple(予測)
apple(真値) 4 0
non-apple(真値) 1 4

真陽性率は、4/4 = 1。偽陽性率は、1/(1 + 4) = 0.2となる。この閾値を0.1ずつ変化させて、偽陽性と真陽性を計算してみると以下の表が作成できる。

しきい値 偽陽性 真陽性
0.1 0 0
0.2 0 0.25
0.3 0 0.5
0.4 0 0.5
0.5 0.2 1
0.6 0.4 1
0.7 0.4 1
0.8 0.6 1
0.9 0.8 1

偽陽性を横軸に、真陽性を縦軸にプロットした点を結んだ曲線をROC曲線と呼ぶ。そしてROC曲線の下部面積をAUCと呼ぶ。AUCは[0, 1]の範囲を取る。その値が高いとき、分類器の判別能が高い。つまり、2つのクラスを異なるものとして識別する能力が高い。AUCが低いとき、判別能が十分ではなく間違えやすい。

f:id:tamanobi:20180401172709p:plain

ビュールレ・コレクションを見に行った。

国立新美術館で、印象派の展覧会があったので行ってきた。ビュールレ・コレクションは近いうちにチューリヒ美術館に寄贈されるらしく、日本これだけの作品を見られるのはこの機会だけらしい。

僕は絵画が好きなだけなので、あまり歴史には詳しくない。美術館へ行くたびに自分の好きな絵画を探している。今回気に入った作品が以下。興味が出た人はぜひ。

カミーユ・ピサロ「ルーヴシエンヌの雪道」 http://www.tokyo-np.co.jp/article/event/bi/buehrle/list/images/PK2018012902100168_size0.jpg

カミーユ・ピサロ「会話、ルーヴシエンヌ」 http://www.tokyo-np.co.jp/article/event/bi/buehrle/list/images/PK2018013002100166_size0.jpg

アルフレッド・シスレー「ブージヴァルの夏」 http://www.tokyo-np.co.jp/article/event/bi/buehrle/list/images/PK2018021502100169_size0.jpg

「ヴェトゥイユ近郊のヒナゲシ畑」 http://www.tokyo-np.co.jp/article/event/bi/buehrle/list/images/PK2018020302100100_size0.jpg

東京新聞でも絵画の画像つき記事が上がっているので見てみると良いかも。 東京新聞:集う巨匠の美 14日から国立新美術館:至上の印象派展 ビュールレ・コレクション:イベント情報(TOKYO Web)

「お金2.0」を読んだ。

去年、「金持ち父さん、貧乏父さん」という本に触発されて依頼、お金への関心が強くなっている。「お金2.0」を読み終わったので、雑な要約を載せておく。

今日読み終えた「お金2.0」という本では、今300年の歴史がある貨幣経済にパラダイムシフトが起こっていると指摘する。貨幣をうまく利用できる者がより貨幣を持つように、個人の人気をうまく利用できる者がより人気を獲得できる世の中になっている。YouTuberやInstagramerがそう。YouTuberにとって、ファンやチャンネル登録者が減ることは、金銭を失うことと同じあるいはそれ以上に不安を抱くこともあるらしい。

筆者の考える経済を構成するための4つの普遍的な性質を例にとり、貨幣経済も評価経済(人間の人気や期待、体験など)も同じだと主張する。まだ評価経済は始まったばかりで、その仕組みは完全ではなく若い世代(ミレニアム世代)がそれを作り上げる感覚を持っているのではないかと筆者は煽る。

貨幣経済が評価経済に成り代わると主張したいわけではなく、生き方の選択肢が広がるだろう。貨幣経済では認められづらかった価値が、評価経済の中で評価される。例えば、プロにはなれないがカラオケが上手い人が動画をアップロードして人気を集め、ファンから物をもらい受けたりということがありえる。

貨幣経済の中で生きなくても、評価経済の中で生きていける。働けなくても生きていける道も拓ける。

金本位制が終了した時点で、貨幣経済は国が担うものとなったが、インターネットやブロックチェーンなどの技術を使えば評価経済の仕組みは一会社や、ましてやビットコインのように個人が提示できる。この仕組をうまく作ることが評価経済を加速する方法であり、ビジネスチャンスでもあり、人々に新しい生き方を提示できる。

このブログを読んだが、声質変換の知識と多層ニューラルネットワークの知識が足りずに全体的にわからなかった。

hiroshiba.github.io

特にわからなかったのは以下。pix2pixが適しているのかよくわからない。

少ないデータ数で学習させるには、pix2pixモデルが適している。 今回はこのpix2pixモデルを使って声質変換タスクを解いた。

声質変換で注目していたのは、クリムゾンテクノロジー株式会社の「リアチェンvoice」だった。デモを聞いてみるとかなり違和感が少ないことに驚くと思う。

www.youtube.com

NGT(高次元ベクトルデータ検索技術)をGolangでごまかして雑なJSON APIにする

類似画像検索システムに組み込むための高次元ベクトルデータ検索技術を探していました。Yahoo! Japanが開発したNGT(高次元ベクトルデータ検索技術)を見つけたので試してみます。

f:id:tamanobi:20170627025115p:plain https://www.flickr.com/photos/21001756@N06/2087512650/

表形式をJSON APIに変換する

前回は、NGTをDockerで動かすところまで紹介しました。 tamanobi.hatenablog.com

公式ドキュメントに従って検索コマンドを実行すると、表形式の出力が得られます。 github.com

 $ ngt search -n 20 index ./data/sift-query-3.tsv
  Query No.1
  Rank  ID  Distance
  1 3031    239.332
  2 4079    240.002
  3 3164    244.504
  4 3718    246.763
  5 157 251.094
  6 2422    251.185
  7 1313    251.34
  8 379 252.446
  9 3521    260.158
  10    2594    261.132
  11    4627    262.381
  12    2159    263.471
  13    3519    264.909
  14    1764    265.136
  15    4400    266.156
  16    2717    266.914
  17    3168    269.637
  18    4236    270.673
  19    4700    272.725
  20    679 272.973
  Query Time= 0.000472 (sec), 0.472 (msec)

検索システムとして利用する上では、この表示形式は使いづらいためJSONで返せるようにパッチを当てます。

JSON出力ができるようにパッチを当てる

NGTはC++で書かれているので、STLをJSONにシリアライズするライブラリを探します。今回はヘッダーを読み込むだけで利用できるライブラリを使用しました。 github.com

ngt searchコマンドにjson出力用のオプションを加えました。本家のmasterとの差分は以下のリンクを参照してください。個人向けの雑な修正なので本家にPRは送らない予定です。

Comparing yahoojapan:master...tamanobi:feature/json_output · yahoojapan/NGT · GitHub

差分を取り込んで、buildすればjsonオプションが有効になります。例えば、 ngt search -o j -n 20 index ./data/sift-query-3.tsvとoオプションにjを渡せば、JSONが出力できます。

ここまでで検索バックエンドの下準備は終わりました。JSONは出力されるものの、HTTP経由でのアクセスに対応していないので何かしらの言語でウェブサーバーを立ててAPIサーバーにします。

GolangでさくっとAPIサーバー

開発速度を鑑みて、それなりに高速でシンプルにJSON APIサーバーかける言語を採用します。今回はGolangにしました。コードはとてもシンプルです。特定のエンドポイントにファイルがPOSTされたらコマンドを実行するだけです。

https://gist.github.com/tamanobi/d10c932eebbd8c4c5ee0ca6f5143f3e9

tsv形式のファイルをいちいち送らないといけないのが、ナンセンスですが今回はよしとします。

Docker

これまでに、2つの変更を行いました。NGTにパッチを当てたこと、GoでのAPIサーバーの作成です。何も考えずに実行できるようにDockerfileを作りました。

github.com

リポジトリにDockerfileが入っているので、 docker build -t tamanobi/ngt_webapp .としてビルドを行ってください。ビルド後に、docker run -it -p 2300:8000 tamanobi/ngt_webappとすればウェブサーバーが立ち上がり、ホストOSの2300番ポートにAPIサーバーに転送されるようになります。

まとめ

NGTをHTTPを介して使うために、2つの準備を行いました。

  1. NGTにパッチを当てて、JSON出力に対応
  2. GolangでNGTコマンドを発行するウェブサーバーを立てる

次回

次回は、Golangのサーバーに対してリクエストを送ってNGTのデータベース構築や検索を行ってみます。

高次元ベクトルデータ検索技術「NGT」の環境をDockerで爆速構築

類似画像検索システムを構築するにあたり、高次元ベクトルデータの検索にNGTを使いました。本稿では、NGTの環境をDockerで爆速構築する方法を紹介します。

f:id:tamanobi:20170626030130j:plain

NGT

NGTとは、高次元ベクトルデータを高速に検索するコマンド及びライブラリのことです。Yahoo! Japanによって開発されました。

techblog.yahoo.co.jp

膨大なベクトルデータの検索でこのようなライブラリが必要とされます。僕は、十万枚規模の画像特徴ベクトル(4000次元)の検索に利用しました。

Docker

NGTはUbuntuでの動作確認が行われています。UbuntuをベースイメージとしたDockerコンテナを作っていきます。

Dockerコンテナの作成

以下のようなDockerfileとシェルスクリプトを用意します。これらを実行するだけです。

for NGT · GitHub

シェルスクリプトを動作させれば、NGTがコンパイルされた状態のDockerコンテナが作成され、コンテナのbashにアタッチできます。 アタッチした環境(Bash環境)では、 ngt コマンドが動作します。

ビルド時間は長いですが、一度環境を作ってしまえばとても簡単にベクトルデータ検索ライブラリが使えるようになります。

NGTを試す

NGTの試し方は公式を参考にしてください。

github.com

まとめ

Yahoo! Japanが作成した高次元ベクトルデータ検索ライブラリNGTを試せる環境をDockerを用いて瞬時に作成する方法を紹介しました。

Dockerfileに環境構築の手順が書いてあるので、時間が経ったあとでも環境を再現しやすいでしょう。

次回予定

次はGolangでNGTをバックエンドにした(雑な)APIサーバーを作ります。

画像収集基盤の構築ログ10

目的

人の代わりに画像を集めてくれるシステムを構築すること。なお、個人的な趣味でイラスト画像を対象としている。

tamanobi.hatenablog.com

進捗

  • Dockerのネットワーク絡みの問題を解消
  • 暫定的にローカルに保存していた画像をテーブルに格納した
  • Viewのコード整理(DRY)
  • Controllerのコード整理(ハードコーディング除去)

  • そろそろクローリング戦略に手をつけたい