機械学習への階段
最初に
コンピュータにできることは「判断の自動化」(物理的なロボットを使うことはこのスライドでは考えない)
判断の精度は基本的に、人間がやるより低い、その代わり人間より高速に大量に疲れることなく判断できる
この「低精度だが高速な、判断の自動化」が顧客に与える価値の源泉である
ステップ1
Q1 顧客は何がどうなると嬉しいのか
顧客価値は何か
Q2 それを人間がやるならどうやってやるか
あなた自身がやるならどうやるか
「量が多すぎて無理」などのことは今は考えないでいい
https://gyazo.com/d2219d15dac5753025db78c274331857
具体例(スパムフィルタ)
Q1 顧客は何がどうなると嬉しいのか
A1 顧客はメールボックスにスパムメールがたくさんあって困っている、スパムがなくなるとうれしい
Q2 それを人間がやるならどうやってやるか
A2 人間がやるなら、メールの本文を見て、スパムかどうか判定して、スパムは別のフォルダに移動する
ステップ2
人間が箱の中にいると考える。
この箱へは電子データしか入れることができず、またこの箱には電子データしか出すことができないとする。
リモートワークとかをイメージしてもよいかもしれない。
質問
Q3 人間がQ2の活動をするために、箱にどんな入力データを入れる必要があるか?
Q4 人間はQ2の活動のために、箱からどんな出力データを出す必要があるか?
Q5 Q3の入力データはどうやって入手するのか?(最初の一歩と継続的にやる方法)
Q6 Q4の出力データをどうやってQ1の顧客価値につなげるのか?
https://gyazo.com/d43778a0a3dc75e29a7b1585e4839f60
答える順番は入れ替えてもよい。
例えば顧客からさかのぼる
顧客にこういうことをしたいから(Q6)
そのためにこういうデータが必要で(Q4)
そのためにはこういう入力が必要だ(Q3)
これをどうやって入手しようか?(Q5)
例えば
今こういうデータが入手できている(Q5, Q3)
ここから顧客価値を生むにはどうするか?(Q6)
そのためにはどういう出力が必要か?(Q4)
具体例
Q1 顧客は何がどうなると嬉しいのか
A1 顧客はメールボックスにスパムメールがたくさんあって困っている、スパムがなくなるとうれしい
Q2 それを人間がやるならどうやってやるか
A2 人間がやるなら、メールの本文を見て、スパムかどうか判定して、スパムは別のフォルダに移動する
Q3 人間がQ2の活動をするために、箱にどんな入力データを入れる必要があるか?
A3 Q2の活動をするためには、メールの本文の情報が必要
本文だけじゃなくてタイトルや送信者も貰えるなら貰いたい
Q4 人間はQ2の活動のために、箱からどんな出力データを出す必要があるか?
A4 各メールに対して「スパムである、スパムでない」のラベルを出力
Q5 Q3の入力データはどうやって入手するのか?(最初の一歩と継続的にやる方法)
最初の一歩としてはとりあえずメールをエクスポートしてもらえれば。
継続的にやるにはメーラからデータを取る方法を作るか、メールサーバの側に手を加えるかが必要そう。
Q6 Q4の出力データをどうやってQ1の顧客価値につなげるのか?
スパムである/ないのラベルを見て、メーラがメールを振り分けする
Q4で「スパムである/ない」を出力するってさっきは考えたけど、ここで「スパムでないメールのリストを出力」でもいいかも
などと掘り下げている間に前の質問の答えを変えたくなるかもしれない。
そういう時は遡って破壊的に書き換えるのではなく、ここまで書いたものを「案1」として取っておいて、別途解答リストを作った方がいい。
Q4を「スパムでないメールのリストを出力」に書き換えた「案2」では他の質問の回答も変わる可能性がある。
遡って破壊的に書き換えていると不整合が起きたりして混乱するから。今やっているのは混乱しないように思考を分割していくプロセスなので混乱しそうなことは避けるべき。
次のステップの準備
箱の中に入っているのが業務知識ゼロのアルバイトだと考える。
(7) このアルバイトが仕事をできるためのマニュアルを用意せよ
完璧なマニュアルである必要はない、次のステップで考えることの準備なのでざっくり書いたら先に進む。
https://gyazo.com/9c53709f6ff7978a316ec41c8b1193fa
ステップ3
箱の中にいるのが、生身の人間ではなく、コンピュータになったと考える。 (8) このコンピュータが仕事をできるためのマニュアル(=プログラム)を書く
https://gyazo.com/83e13a4a5ae08e43ecd103ac5d583ecf
完璧に判定できるプログラムが書けなくてもよい
完璧に判定できるプログラムがさらさらかけるような問題だったら苦労してない
素朴なアルゴリズム、数個のif文とかでよい
事前に精度高い自信がなくて良い
「ランダムよりまし」ぐらいで良い
とりあえず動くもの、ぐらいでよい
「試しにデータを入れてみる」ができるようになることがゴール
書く上で何が問題か、何がまだわかってないところか、を明確化していく
(9) そのプログラムに実際にデータを入れて振る舞いを観察する
どの程度の精度か、どの程度の速度か
Q10 その性能で顧客は満足するか?しないなら何が足りないのか?(精度?速度?)
素朴なプログラムで十分なら、機械学習を使う必要はない。使うべきではない。
(11) 教師データをつくる
プログラムの出力を人間の判断と比べて、正しいのか、正しくないのか、正しくないなら正解は何か、を記録していく
このデータがステップ4の教師あり学習に必要不可欠
このデータの量が精度に大きな影響を与える
十分な量のデータが必要。ただし「どれだけあれば十分か」は問題依存なのでやってみなければわからない。
例
(8) 特定のキーワードが含まれていればスパムだと判定するプログラム
(9) 観察してみる
A10 これで十分ならスパムフィルタを機械学習で作る必要はない
(11) 教師データを作る
例えば正しくない判定の例としては
スパムじゃないのにキーワードがある
スパムなのに適切なキーワードがない
が考えられる。後者はキーワードを追加すればできるが、前者は難しい
True/Falseで割り切れない「あいまいなヒント」の活用が必要になってきたことを意味している
ステップ4
教師あり学習とは、11で用意した「入力と正解データ」のペアから、機械自身にマニュアルを作らせること。
https://gyazo.com/8d188467ad4889e1abf200c795f8fd16
(12) 11で用意した「入力と正解データ」のペアを使って教師あり学習をする
入力の各次元の分布形状を確認
まずはロジスティック回帰で精度を確認する(ベースライン)
顧客のニーズを満たすかどうか確認する
顧客の求める精度に達していない場合
決定木で重要そうな特徴が何かを観察
データの加工方法を工夫する(特徴量エンジニアリング)
新しいデータを求めに行く
(一応こう書いてみたけど、そもそも努力をしたからといって確実に精度が上がる物でもないので、顧客の求める制度に達していないとダメであるような契約形態にしてはいけない)
ステップ5 能動学習
(12)で作ったモデルに「まだ正解がないデータ」を入れ、判断に自信がない順にソートして表示
それに対して人間が回答を教えることによって効率よく学習用のデータを作る