機械学習の実験で少ない手間で資料を用意する方法を考えてみる
ぼくは、クライアントと長くやり取りをしてきた。
いつも考えてたことは「どうすれば実験するときに、少ないミスコミュニケーションで、少ない作業ミスでクライアントに結果を出せるか?」ということだ。
ぼくはこれまでの失敗から経験化してきたことをチェックリストにして紹介する。
目次
実験の設定を考える時
実験は複数回を実行する前提になっているか?
- 実験用のデータは複数回の実験が前提か?Train/Testに複数の異なる組み合わせはあるか?
- 実験用のスクリプトは複数回の実験をして、平均を求める作業が自動化されているか?手動の作業はミスの元。
実験結果をクライアントを見せたとき、よくある質問は次のとおりだ。
- その実験はもしかしたら、偶然ではないの?
- たまたま、Trainデータに良いデータが揃っていただけではないの?
この質問に回答するために「異なるTrain/Testの組み合わせ」で複数回のテストが推奨される。
だから、はじめから複数通りのTrain/Testの実験する前提で実験デザインとスクリプトの設計をするべきである。さらに、手動で複数通りの実験を施行するのは避けたい。手動作業はミスの元である。
では、全自動化の仕組みをpythonで書くか?ファイル処理をいちいち書くのも面倒くさい。それにtrain/test/evalのスクリプトはそれぞれ独立させておきたい。独立させておいた方が依存関係を考えなくてもいいので、実験のときは楽だ(train/testは一緒のスクリプトにしてしまうことも多い。コマンドライン引数でモードを変更できるようにする)。
実験段階では、「この指標も必要。実験結果をすっきり出したい・・・etc.」など手直しの発生が多い。そのたびに依存関係を考えておくのは面倒なものだ。
では、「スクリプトを独立させて」、「実験を自動化できる構成」はどうするのが良いだろうか?
ぼくはbashスクリプトで一連の作業をまとめてしまうのが早いと思う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<< COMMENTOUT スクリプトの使い方 COMMENTOUT if [[ -z "$PATH_SCRIPT_DIR" ]]; then echo "PATH_SCRIPT_DIR is not defined" exit 1 fi if [[ -z "$PATH_MODEL_DIR" ]]; then echo "PATH_MODEL_DIR is not defined" exit 1 fi if [[ -z "$PATH_DATASET_DIR" ]]; then echo "PATH_DATASET_DIR is not defined" exit 1 fi for path_data_dir in ${PATH_DATASET_DIR}; do data_name=`basename ${path_data_dir}` path_model_dir=${PATH_MODEL_DIR}/model/${data_name} path_result_dir=${PATH_MODEL_DIR}/result/${data_name} path_result_csv=${PATH_MODEL_DIR}/result/${data_name}/prediction.csv path_train_file=${PATH_DATASET_DIR}/train.csv path_test_file=${PATH_DATASET_DIR}/test.csv mkdir -p ${path_model_dir} mkdir -p ${path_result_dir} # training python ${PATH_SCRIPT_DIR}/[training script] # prediction python ${PATH_SCRIPT_DIR}/[prediction script] # eval python ${PATH_SCRIPT_DIR}/[eval script] done python ${PATH_SCRIPT_DIR}/[aggregation script] |
1 |
PATH_SCRIPT_DIR="スクリプト郡のパス" PATH_MODEL_DIR="モデルファイルを保存するパス" PATH_DATASET_DIR="データセットがおいてあるディレクトリ(複数の指定可能)" bash train_and_eval.sh |
実験は学習曲線を描けるようになっているか?
- 学習データ量を調整して、データを用意しているか?testデータは共通化されているか?
- 実験スクリプトは学習曲線を描けるようになっているか?
学習曲線とは、データ量を減らして実験した場合の性能変化を示したグラフのこと。
イメージ的には下のグラフ。ScoreはPrecision/Recall/Fがよく入る。

用意できる全データを使って、実験結果をクライアントに見せたとき、よくある質問。
- もっとデータを用意したら性能は良くなるの?
- たくさんのデータを用意するのはオペレーション上で現実的じゃない。少ないデータで性能を再現できる?
この質問に答えるために学習曲線がある。学習曲線があれば、次のように回答できる。
- Q: もっとデータを用意したら性能は良くなるの?
- A: 全データの時点で、性能値の上がり幅が小さくなっていれば、十分と言える。
- たくさんのデータを用意するのはオペレーション上で現実的じゃない。少ないデータで性能を再現できる?
- A: 少ないデータ量と全データでの性能を比較すれば、回答できる。
データ量は一般的には4分割が使われる。つまり、0.25, 0.5, 0.75, 1.0
学習曲線を描くためには、実験スクリプトはさっきと同じで良い。
データの用意の方法を少し変えるだけで良い。
ここでは、split-数字 が分割したデータ。その下のディレクトリにデータ量を調整したデータを置く。
大切なことは split-0/以下のtestデータはすべて共通しているということ。
違いはtrainデータの量が違うだけ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
--- split-0 - data-0.25 - data-0.5 - data-0.75 - data-1.0 --- split-1 - data-0.25 - data-0.5 - data-0.75 - data-1.0 --- split-2 - data-0.25 - data-0.5 - data-0.75 - data-1.0 |
実験結果の表を作成したか?
- 先に実験結果表を作成したか?
- 実験結果表はクライントの問に回答できるか?
先にイメージを作っておくことは大切だ。特に実験を始める前は頭がごちゃごちゃしている。
ぼくの場合は特に、実験を始めるときに気持ちがアガる☆ので、早く実験を始めたくなる。
そうすると、「達成すべき目標値」を見失うことになってしまう。その先には何があるのか?スクリプトの修正と実験のやり直しである。
だから、最初から実験結果表を作っておいて、完成イメージを形にしておく。できることならば、クライアントに予め完成イメージを共有しておくのが良いだろう。

「イシューからはじめよ」同じことは実験でも言える。
報告ドキュメントを書く時
機械学習モデルに関すること
- 学習済みモデルのパラメータはドキュメントに書いたか?
- 「ハイパーパラメタはグリッドサーチをした」とだけ、ぼくは書きがち。グリッドサーチした結果「どのパラメタが最適だったのか?」を書くこと
自然言語処理に特化したこと
- 形態素解析器と辞書のバージョンをドキュメントに書いたか?
- 自然言語処理の経験が長い人ほど、「mecabで分割」とだけ書きがち
ディスカッション
コメント一覧
まだ、コメントがありません