実験ノウハウ - ikymrkw/pydepot GitHub Wiki

データセット

まずデータセットの特徴を精査する

  • 表形式、画像、映像、自然言語、音声、...
  • タスクは何か、未定ならどう設定するか
  • 何を「1サンプル」とするか
  • サンプル数(インスタンス数)
  • X の次元数(特徴量数、属性数)
  • X の各次元の尺度(名義、順序、間隔、比例)、離散か連続か、値域・平均・標準偏差などの統計値
  • 分類の場合 y のクラス数と値、各クラスの分布・頻度(balanced か imbalanced か)
  • 回帰の場合 y の値域・平均・標準偏差などの統計値
  • X の各次元間の関係を類推する(分散共分散配列など)
  • できれば t-SNE プロットなどで分類・回帰しやすそうか見てみる
    • df.scatter_matrix()
    • sns.pairplot(data)
  • 前処理・特徴量抽出を検討する
  • 評価指標を検討しておく
    • Accuracy? Precision と recall のどちらを重視するか決められるか? F1 score? AUC ROC や PR ROC?
    • Imbalance なら、それをどうするか検討する(評価指標と合わせて)
  • ベースラインの指標値を考えておく
    • ほぼ何も学習しなくても達成できる値と、理想的な状態の値を、あらかじめ求めておく。
      • 分類タスクの場合、前者は「yの最頻値を常に答える分類器」を想定するとよい。sklearn.dummy.DummyClassifierのデフォルト動作。
  • 簡単なモデルでいいから作ってみる
    • 表形式であれば PyCaret にかけてみるとよい
      • ただし全自動ではあまりうまくいかないことも多い。
      • X の各次元の尺度や、正規化すべきかどうか、名義変数ならどのエンコーディングをするか、を指定したほうがよい。
    • 前記のベースラインと並べて、得手不得手の傾向を探っておく
    • これはあくまで方針を決めるためで、実際にモデルを作るのは別途行う。
  • データセットの分割
    • 最低限、train と test に分ける。実際には train の一部が validation に使われたり、k-fold になったりする。
    • AIセキュリティの場合、攻撃者知識のための部分データセットが必要になることもある。
    • そもそもサンプル数が少なすぎる場合は断念せざるを得ないこともある。
    • ほぼ必ず層化分割すべき。完全なランダムでの分割は良くない。
      • sklearn の場合、stratify=True オプションか Stratified... というクラスを使う。
    • 情報リーク、データリークを起こさないように注意
    • 分割後のデータを保存するより、分割時に選んだインデックスを保存すべき。

コーディング

  • 乱数シードは原則固定する。再現性のため。
    • ただし1回の試行で結論を出さないように注意。固定したシードを変えていく。このため関数にするときはシードを指定できるようにするべき。
  • 前処理の方法も必ず保存する。プリプロセッサをそのまま保存するのが望ましいが、最低限、仕様とパラメーターを記録しておく。
  • 前処理を訓練データとテストデータの両方に同じようにかけること。Pipelineにしてしまうのが望ましい。
  • 変数や関数の名前を適切に付ける
  • 最低限の doccomment を書く
  • 過度の共通化はしない、1関数1責務を念頭に
  • できるだけテストを書く。あとで変更した際に過去の動作に影響がなさそうなことを(最低限)確認できる。
  • 小規模データで動かすデバッグモードを用意する。データ処理、および Python 自体が、動かしてみるまでエラーを見つけられない傾向にあるため。