ビッグデータセットの機械学習のベストプラクティス


9

私はマスターを卒業しようとしており、機械学習について学び、それを使って研究プロジェクトを実行していました。ビッグデータセット(100 GBまたはTBなど)で機械学習タスクを実行するときの業界のベストプラクティスについて知りたいです。仲間のデータサイエンティストが彼らの経験を共有できるかどうか感謝します。ここに私の質問があります:

  1. 明らかに、非常に大きなデータセットはトレーニングに長い時間がかかります(数日または数週間になる場合があります)。多くの場合、さまざまなモデル(SVM、ニューラルネットワークなど)をトレーニングして、より良いパフォーマンスモデルを比較して見つける必要があります。業界のプロジェクトでは、できるだけ早く結果を出したいのですが、最高のパフォーマンスが得られると思います。トレーニングとテストの時間を短縮するためのヒントはありますか?データセットをサブセット化することをお勧めする場合は、データセットをサブセット化して、データセットのシナリオのすべてまたは大部分をカバーするのに最適な方法を知りたいと思います。
  2. 交差適合を実行すると、過剰適合が減少する可能性があるため、より良いことはわかっています。ただし、相互検証はトレーニングにも時間がかかり、相互検証でトレーニングされたモデルは直接実装されない可能性があります(Python sklearnエクスペリエンスから言えば、実装するクロス検証テストの後に、モデルをデータセットで再度トレーニングする必要があります)。通常、ビッグデータプロジェクトで相互検証を行っていますか、それともトレーニングテストの分割で問題を解決していますか?

フィードバックに感謝します。

回答:


8

役立つと思われるプラクティスをいくつか挙げます。これが役立つことを願っています。

  1. データが膨大であるかどうかに関係なく、モデルを構築する場合は相互検証が必須です。これがエンドコンシューマーの待機よりも時間がかかる場合は、期待をリセットするか、モデルを構築するためのより高速なハードウェア/ソフトウェアを入手する必要があります。ただし、相互検証をスキップしないでください。学習曲線のプロットと相互検証は、プロセスの早い段階で間違いを認識して修正するためのガイドとして役立つ効果的なステップです。クロスフォールド検証を実行して、さまざまなフォールドでのアルゴリズムのパフォーマンスに大きな差異が見つかるまで、単純なtrain-testセットで問題が明らかにならない場合がありました。

  2. データセットをサイズ変更する前に、キー変数と外れ値の欠損値、相関性の高い変数の列、ゼロに近い分散変数のレコードを削除します。これにより、実際に使用可能なデータセットをより正確に推定できます。場合によっては、実際にモデルを構築するために使用できる利用可能なデータセットの一部のみになってしまうことがあります。

  3. モデルを構築するためにデータセットのサイズを設定する場合、データセットを行と列で列挙し、最終的な数値行列のメモリサイズを列挙すると、コンピューティングリソースを推定するのが簡単になります。すべての機械学習アルゴリズムが最終的にデータセットを数値行列に変換するため、生の入力データのGB / TBでデータセットのサイズを列挙すると(ほとんどの場合、文字列/テキストの名目上の変数など)、誤解を招くことが多く、データセットは、操作するのが実際よりも困難で巨大であるように見える場合があります。

  4. データセットの最終的な使用可能なサイズがわかったら(または推定したら)、それをメモリにロードしてモデルをトレーニングできる適切なマシンがあるかどうかを確認します。データセットのサイズが、ソフトウェアで使用可能/使用可能なメモリよりも小さい場合、サイズについて心配する必要はありません。

  5. データセットのサイズがモデルのトレーニングに使用できるメモリよりも大きい場合は、次の方法を試すことができます(最初に最も単純な方法から始めます)。

    • より多くのメモリを搭載したマシンを使用する:クラウドサービスプロバイダーを使用している場合、最も簡単なアプローチは、より多くのメモリをプロビジョニングし、通常どおりモデルの構築を続けることです。物理マシンの場合は、追加のRAMを購入してみてください。その価格は下がり続け、データセットがこのままであるか、時間の経過とともに大きくなる場合は、良い投資です。
    • クラスターへのノードの追加:HadoopおよびSparkベースのクラスターコンピューティングデプロイメントの場合、より大きなデータセットでのトレーニングは、クラスターにマシンを追加するのと同じくらい簡単です。
    • 分類タスクでは、非常に不均衡なクラスのデータに関するトレーニングが必要になることがよくあります。陽性クラスと陰性クラスの比率は、1:1000以上になる場合があります。これらのケースで精度を向上させる簡単な方法は、少数派クラスをオーバーサンプリングするか、過半数クラスをアンダーサンプリングするか、両方を同時に行うことです。大規模なデータセットがある場合、多数決クラスをアンダーサンプリングすることは、アルゴリズムの精度を向上させるだけでなく、トレーニング時間を短縮する非常に優れたオプションです。
    • アンサンブルを構築する:データセットをランダムに分割し、各パートでいくつかの基本学習者をトレーニングしてから、これらを組み合わせて最終的な予測を取得します。これにより、大規模なデータセットが最も効果的に利用され、より正確なモデルが生成されます。ただし、アンサンブルを注意深く構築し、アンサンブル構築の通常の落とし穴を避けるために、より多くの時間を費やす必要があります。
    • アンサンブルを使用している場合は、多数のシングルスレッドモデルを並行してトレーニングします。ほとんどすべてのMLソフトウェアは、異なるコアまたは個別のノードで複数のモデルを完全にトレーニングする機能を提供します。
    • 特定のデータセットとその正確さを比較するために、それらをトレーニングするのにかかる時間について、複数の異なるアルゴリズムを評価します。普遍的な答えはありませんが、ノイズの多いデータを使用すると、SVMは、正規化された回帰モデルの慎重に構築されたアンサンブルよりもトレーニングに長い時間がかかりますが、パフォーマンスはわずかに正確になる可能性があります。また、適切に構築されたニューラルネットワークは、CARTツリーと比較してトレーニングに非常に長い時間がかかる場合がありますが、ツリーよりもはるかに正確に実行されます。
    • モデルの構築にかかる時間を短縮するには、できるだけ多くのプロセスを自動化してください。エラーが発生しやすい複雑な手動タスクの自動化に数時間を費やすことで、プロジェクトの100時間後にチームを救うことができます。
    • 可能な場合は、並列処理、スパース行列、キャッシュ対応コンピューティングを使用するアルゴリズム実装を使用すると、処理時間が大幅に短縮されます。たとえば、GBMのシングルコア実装の代わりにxgboostを使用します。
    • 他に何も機能しない場合は、より小さいデータセットでモデルをトレーニングします。Emreが彼の回答で示唆したように、学習曲線を使用してモデルのトレーニングに必要な最小のサンプルサイズを修正します。このサイズより多くのトレーニングレコードを追加しても、モデルの精度は著しく向上しません。この状況を探る優れた記事を以下に示します-http ://web.mit.edu/vondrick/largetrain.pdf

網羅的な回答をありがとう@Sandeep。ポイント#3の行と列のデータセットと最終的な数値行列のメモリサイズを列挙することについて、詳しく説明してもらえますか?それは、パンダデータフレームの「df.values.nbytes」、「df.shape」などの構文を使用して、クリーンなデータセットのサイズを見つけることを意味しますか?ありがとう。
iLoeng 2016

使用:df.values.nbytes + df.index.nbytes + df.columns.nbytes
Sandeep S. Sandhu

4

問題は、モデルを飽和させるのにどれだけのデータが必要かということです。これを決定するために、データをさまざまな量で学習曲線をプロットできます。おそらく定数係数でサイズを拡大/縮小できます。すべてのデータでのトレーニングが不可能な場合、学習曲線は、情報に基づいたトレードオフを行うのに役立ちます。

モデルの飽和は、交差検証でも機能します。飽和状態に近くない場合、使用するデータ量よりも少ないデータでモデルをトレーニングするため、少数のフォールドを使用すると悲観的なパフォーマンスの数値が得られます。

最後に、逆に、モデルに合わせてデータを「サイズ変更」する代わりに、より複雑なモデルを使用できます。

DataScience.SEへようこそ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.