
6. 故障予知のアプローチ
6.5 データセット分割(train/validation/test)
機械学習では、持っているデータをいきなり全部で学習・評価するのではなく、役割の違う三つの集合に分けるのが基本である。学習に使う訓練用(train)、モデルやハイパーパラメータの調整に使う検証用(validation)、最後の実力確認にだけ使う評価用(test)という分担にすると、実社会での性能に近い見積もりが得られ、過学習や過大評価を避けやすくなる。学習と評価に同じデータを使うと、たまたま見た癖を覚えただけの「見かけの高精度」になり、未知データで急に崩れるため、役割を分けることが欠かせない。[1][2][3][4]
まず三つの集合の意味をわかりやすく整理する。訓練用は、モデルが規則を学ぶための材料で、できるだけ多くの代表的な例を含めるのが望ましい。検証用は、学習には使わず、モデルの種類や設定(ハイパーパラメータ)を比較・選択するために用いる独立のデータである。評価用は、最終的な「一般化性能」を一度だけ確認するために残しておく、まったく手つかずのデータで、学習・調整の過程では見ないことが鉄則になる。この役割分担により、モデル選びや閾値調整のバイアスを抑え、現実に近い性能評価ができる。[2][5][3][4][6][1]
分割比率の目安としては、70%/15%/15%や、80%/10%/10%などがよく用いられるが、データ量や性質で調整するのが実務的である。データが非常に多いなら検証・評価を小さめにできるし、データが少ないなら検証用を固定せず交差検証で使い回すと有効活用できる。交差検証は、訓練データをさらに複数の折りに分け、入れ替えながら学習と評価を繰り返し、平均性能で安定した見積もりを得る標準手法である。[5][3][7][2]
分割の仕方には重要な注意点がある。分類でクラスの数に偏りがあるとき(正常が大量、異常が少数など)は、単純なランダム分割だと検証や評価に少数クラスがほとんど入らない事故が起きる。これを避けるため、各分割でクラス比を全体とほぼ同じに保つ層化(stratified)分割を使うのが定石で、訓練/検証/評価のすべてに層化を徹底する。層化k-fold交差検証も広く推奨され、各折でクラス分布を保ちながら性能を見積もれる。[8][7][9]
時系列データではさらに配慮が要る。過去から未来を予測するのに、未来の情報が訓練側へ紛れ込むと「情報漏えい」になり、非現実的な高精度になる。したがって、時系列は時間順を守って「過去→未来」で分ける時系列用の分割や、ウォークフォワード(ロール)検証を使う。一般的なk-foldのランダム分割は、時系列の自己相関を壊し、将来の情報を混入させる危険があるため避けるべきである。時系列や逐次データでは、時間ベースの検証が「現実の運用」を正しく模擬でき、漏えいを防ぐ要(かなめ)になる。[10][7][11]
データ漏えい(Leakage)を防ぐ手順も必ず組み込む。分割の前に全データで標準化や欠損補完をしてしまうと、その操作の統計(平均や分散など)に評価データの情報が混じり、訓練側へ漏れてしまう。これを避けるには、必ず「訓練データで前処理を学び、そのパラメータを検証・評価へ適用する」順序を厳守する(パイプライン化が有効)。特徴量生成でも将来情報を使わない、集計窓の範囲を未来へ伸ばさない、などのルールを設けると安全である。[12][10]
具体的な進め方を段階で示す。1) 目的と評価指標を決める(見逃し重視なら再現率やPR曲線など)。2) データの性質を確認する(時系列か、クラス不均衡か、グループの塊があるか)。3) 分割戦略を選ぶ:通常はランダム+層化、時系列は時間順のスプリット、必要に応じ交差検証を併用する。4) 比率を設定(例70/15/15)し、検証ではハイパーパラメータや特徴の選択を行う。5) 前処理は訓練基準で学習し、検証・評価へ適用(パイプライン)して漏えいを防ぐ。6) 調整が完了したら、評価用データを初めて用いて最終確認を一度だけ行い、結果を凍結する。[3][7][6][13][2][5][10][8][12]
交差検証の活用も要点だ。データが少ない場合やモデル比較を安定させたい場合、訓練データの中でk-fold(層化k-fold)を回し平均性能で選定するのが効果的である。時系列では標準のk-foldを使わず、TimeSeriesSplitのように「過去で学習→直後の未来で検証」を段階的に進める方式を用いると、将来予測の現実性を保ちながら調整できる。[7][14][3][8]
よくある落とし穴と回避策を挙げる。- 誤り1:分割前に前処理(標準化・欠損補完)を全体で実施。回避:訓練で学んだ変換のみを検証・評価へ適用(パイプライン)。- 誤り2:不均衡データを非層化で分割し、少数クラスが検証・評価にほぼ無い。回避:層化分割・層化k-foldを徹底。- 誤り3:時系列でシャッフル分割。回避:時間順のホールドアウトやウォークフォワード、TimeSeriesSplitを使用。- 誤り4:評価用を何度も見て閾値や設計を微調整。回避:評価用は最終一度だけ、調整は検証用・交差検証で行う。- 誤り5:分割比率の硬直化。回避:データ量・偏り・タスクに応じて柔軟に比率と検証法を調整。[9][1][2][5][3][10][8][7][12]
現場で役立つ実務ヒントを補足する。- グループの独立性:同一機器・同一ライン・同一個体で強い類似がある場合、訓練と検証/評価に同じグループが跨らないよう「グループ分割」を使う(情報漏えい回避に有効)。- 反復可能性:乱数シードを固定し、分割の再現性を確保する(比較の公正さ)。- 記録の徹底:分割方法・比率・層化の有無・時系列設定・前処理パイプライン・乱数シードを記録し、評価の再現を担保する。- 追加データの取り込み:運用で新データが加わったら、評価用を維持したまま再分割・再学習・再評価のサイクルを設計する(データ漂移への備え)。[13][1][2][10][7]
最後に、教育的なまとめとして押さえるべき原則を短く述べる。- 訓練・検証・評価の三分割は、過学習を見抜き一般化性能を正しく測るための基礎である。- 不均衡には層化、時系列には時間順の分割と時系列交差検証が必須である。- 前処理・特徴生成は「訓練基準で学び、他集合へ適用」で漏えいを防ぐ。- 評価用は最後に一度だけ使い、そこからの学びを設計へ持ち込まない。これらを守れば、故障予知におけるモデル評価は現実に近づき、誤検知と見逃しのバランスも、データに基づいて適切に調整できる。[6][1][3][10][8][7][12] [1] https://encord.com/blog/train-val-test-split/
[2] https://www.v7labs.com/blog/train-validation-test-set [3] https://developers.google.com/machine-learning/crash-course/overfitting/dividing-datasets [4] https://mlu-explain.github.io/train-test-validation/ [5] https://milvus.io/ai-quick-reference/what-are-some-best-practices-for-splitting-a-dataset-into-training-validation-and-test-sets [6] https://blog.roboflow.com/train-test-split/ [7] https://scikit-learn.org/stable/modules/cross_validation.html [8] https://machinelearningmastery.com/cross-validation-for-imbalanced-classification/ [9] https://dataknowsall.com/blog/imbalanced.html [10] https://www.ibm.com/think/topics/data-leakage-machine-learning [11] https://dotdata.com/blog/preventing-data-leakage-in-feature-engineering-strategies-and-solutions/ [12] https://www.machinelearningmastery.com/data-preparation-without-data-leakage/ [13] https://www.quanthub.com/best-practices-and-missteps-when-creating-training-and-evaluation-sets-in-machine-learning/ [14] https://towardsdatascience.com/4-things-to-do-when-applying-cross-validation-with-time-series-c6a5674ebf3a/ [15] https://global.trocco.io/blogs/why-do-you-split-data-into-training-and-validation-sets [16] https://arxiv.org/pdf/2212.11116.pdf [17] https://stackoverflow.com/questions/73381529/stratifiedkfolds-with-imbalanced-data-for-multiclass-classification [18] https://www.sciencedirect.com/science/article/abs/pii/S156849462200120X [19] https://www.kaggle.com/code/alexisbcook/data-leakage [20] https://talent500.com/blog/a-comprehensive-guide-to-handling-imbalanced-datasets-in-classification-problems/※本ページは、AIの活用や研究に関連する原理・機器・デバイスについて学ぶために、個人的に整理・記述しているものです。内容には誤りや見落としが含まれている可能性もありますので、もしお気づきの点やご助言等ございましたら、ご連絡いただけますと幸いです。
※本ページの内容は、個人的な学習および情報整理を目的として提供しているものであり、その正確性、完全性、有用性等についていかなる保証も行いません。本ページの情報を利用したこと、または利用できなかったことによって発生した損害(直接的・間接的・特別・偶発的・結果的損害を含みますが、これらに限りません)について、当方は一切責任を負いません。ご利用は利用者ご自身の責任でお願いいたします。