ホームページ  >  記事  >  テクノロジー周辺機器  >  相互検証の重要性は無視できません。

相互検証の重要性は無視できません。

王林
王林転載
2023-11-06 20:17:191396ブラウズ

元の意味を変えないために、再度表現する必要があるのは次のとおりです。まず、なぜ相互検証が必要なのかを理解する必要があります。

相互検証は、特にデータが限られている場合、または新しい未知のデータに対するモデルの一般化を評価する場合に、予測モデルのパフォーマンスと汎化能力を評価するために、機械学習と統計で一般的に使用される手法です。機能に関しては非常に価値があります。

相互検証の重要性は無視できません。

相互検証はどのような状況で使用されますか?

  • モデルのパフォーマンス評価: 相互検証は、目に見えないデータに対するモデルのパフォーマンスを推定するのに役立ちます。データの複数のサブセットでモデルをトレーニングおよび評価することにより、相互検証により、単一のトレーニングとテストの分割よりも堅牢なモデルのパフォーマンスの推定値が得られます。
  • データ効率: データが限られている場合、相互検証では利用可能なすべてのサンプルが最大限に活用され、トレーニングと評価にすべてのデータを同時に使用することで、より信頼性の高いモデルのパフォーマンス評価が提供されます。
  • ハイパーパラメータ調整: 相互検証は、モデルに最適なハイパーパラメータを選択するためによく使用されます。データのさまざまなサブセットに対してさまざまなハイパーパラメータ設定を使用してモデルのパフォーマンスを評価することで、全体的なパフォーマンスの観点から最も優れたパフォーマンスを発揮するハイパーパラメータ値を特定できます。
  • 過学習の検出: 相互検証は、モデルがトレーニング データを過学習しているかどうかを検出するのに役立ちます。モデルのパフォーマンスが検証セットよりもトレーニング セットで大幅に優れている場合は、過学習を示している可能性があり、正則化やより単純なモデルの選択などの調整が必要です。
  • 一般化能力の評価: 交差検証は、目に見えないデータを一般化するモデルの能力を評価します。複数のデータ分割でモデルを評価することにより、ランダム性や特定のトレーニングとテストの分割に依存せずに、データ内の基礎となるパターンを捕捉するモデルの能力を評価するのに役立ちます。

相互検証の一般的な考え方は、図 5 の折り重ねクロスに示されています。各反復で、新しいモデルは 4 つのサブデータセットでトレーニングされ、最後に保持されたサブデータセットで実行されます。 . すべてのデータが利用されていることを確認するためにテストします。平均スコアや標準偏差などの指標を通じて、モデルのパフォーマンスの真の尺度が提供されます。

相互検証の重要性は無視できません。

すべては K 倍クロスオーバーから開始する必要があります。

KFold

K 分割クロス検証が Sklearn に統合されました。これは 7 分割の例です:

from sklearn.datasets import make_regressionfrom sklearn.model_selection import KFoldx, y = make_regression(n_samples=100)# Init the splittercross_validation = KFold(n_splits=7)

相互検証の重要性は無視できません。

There一般的な操作は、分割を実行する前にシャッフルを実行することです。これにより、サンプルの元の順序が破壊され、過剰適合のリスクがさらに最小限に抑えられます。

cross_validation = KFold(n_splits=7, shuffle=True)

相互検証の重要性は無視できません。

この方法では、 、簡単な k 分割相互検証を行うことができます。必ずソース コードを確認してください。ぜひソースコードをチェックしてみてください!ぜひソースコードをチェックしてみてください!

StratifiedKFold

StratifiedKFold は、分類問題用に特別に設計されています。

一部の分類問題では、データが複数のセットに分割された場合でも、ターゲットの分布は変わらないはずです。たとえば、ほとんどの場合、クラス比が 30 から 70 のバイナリ ターゲットは、トレーニング セットとテスト セットで同じ比率を維持する必要があります。通常の KFold では、分割前にデータがシャッフルされるため、このルールは破られます。カテゴリの比率は維持されません。

この問題を解決するために、Sklearn では分類に特化した別のスプリッター クラスが使用されています - StratifiedKFold:

from sklearn.datasets import make_classificationfrom sklearn.model_selection import StratifiedKFoldx, y = make_classification(n_samples=100, n_classes=2)cross_validation = StratifiedKFold(n_splits=7, shuffle=True, random_state=1121218)

相互検証の重要性は無視できません。

KFold とは異なりますが、見た目は似ていますが、現在、クラスの割合はすべての分割と反復にわたって一貫しています。相互検証は非常に似ています。

論理的に言えば、異なるランダム シードを使用して複数のトレーニング/テスト セットを生成することにより、堅牢な相互検証プロセスと同様になるはずです。十分な反復で

Scikit-learn ライブラリも対応するインターフェイスを提供します:

from sklearn.model_selection import ShuffleSplitcross_validation = ShuffleSplit(n_splits=7, train_size=0.75, test_size=0.25)

#TimeSeriesSplit

データ セットが時系列の場合、従来の相互検証は使用できません。順序が完全に混乱します。この問題を解決するには、Sklearn が提供する別のスプリッター TimeSeriesSplit、相互検証の重要性は無視できません。

from sklearn.model_selection import TimeSeriesSplitcross_validation = TimeSeriesSplit(n_splits=7)

検証セットを参照してください。は常にトレーニング セットの最後に配置されます。ケースにインデックスを付けると、グラフが表示されます。これは、インデックスが日付であるためです。つまり、誤って将来の日付で時系列モデルをトレーニングし、前の日付の予測を行うことはできません

非独立かつ同一に分散された (非 IID) データの相互検証

上記のメソッドは、独立して同一に分散されたデータ セットに対して処理されます。つまり、データ生成プロセスには影響しません。他のサンプルによる

ただし、場合によっては、データが独立同一分布 (IID) の条件を満たしていない、つまり、いくつかのサンプル間に依存関係がある場合があります。この状況は、Google Brain Ventilator Pressure コンテストなどの Kaggle コンテストでも発生します。このデータは、数千回の呼吸 (吸気と呼気) 中の人工肺の気圧値を記録し、各呼吸のあらゆる瞬間に記録されます。各呼吸プロセスには約 80 行のデータがあり、これらの行は相互に関連しています。この場合、データの分割が「呼吸プロセスの途中」で発生する可能性があるため、従来の相互検証方法は使用できません。

これは、これらのデータを「グループ化」する必要があると理解できます。グループ内のデータは関連しているためです。たとえば、複数の患者から医療データを収集する場合、各患者には複数のサンプルがあります。ただし、これらのデータは個々の患者の違いの影響を受ける可能性が高いため、グループ化する必要もあります。

多くの場合、特定のグループでトレーニングされたモデルが他の目に見えないグループにもうまく一般化されることを期待します。相互検証では、これらのグループのデータに「タグ」を付け、それらを相互に区別する方法を伝えます。

Sklearn では、これらの状況に対処するためにいくつかのインターフェイスが提供されています。

  • GroupKFold
  • StratifiedGroupKFold
  • LeaveOneGroupOut
  • LeavePGroupsOut
  • GroupShuffleSplit

相互検証の概念とその実装方法を理解することを強くお勧めします。Sklearn のソース コードを確認するのは良い方法です。さらに、独自のデータセットを明確に定義する必要があり、データの前処理が非常に重要です。

以上が相互検証の重要性は無視できません。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。