4

Hands on Machine Learning の本を読んでいて、著者はトレーニングとテストの分割中のランダム シードについて語っています。

著者は、Tran と Test の分割に次の関数を使用しています。

def split_train_test(data, test_ratio):
    shuffled_indices = np.random.permutation(len(data))
    test_set_size = int(len(data) * test_ratio)
    test_indices = shuffled_indices[:test_set_size]
    train_indices = shuffled_indices[test_set_size:]
    return data.iloc[train_indices], data.iloc[test_indices]

Usage of the function like this:
>>>train_set, test_set = split_train_test(housing, 0.2)
>>> len(train_set)
16512
>>> len(test_set)
4128

これは機能しますが、完全ではありません。プログラムを再度実行すると、別のテスト セットが生成されます。時間の経過とともに、ユーザー (または機械学習アルゴリズム) がデータセット全体を確認できるようになりますが、これは回避したいことです。

Sachin Rastogi: これがモデルのパフォーマンスに影響を与える理由と方法は? トレーニング セットは常に異なるため、モデルの精度は実行ごとに異なることを理解しています。私のモデルは、時間の経過とともにデータセット全体をどのように認識しますか?

著者もいくつかの解決策を提供していますが、

1 つの解決策は、最初の実行でテスト セットを保存し、その後の実行でロードすることです。別のオプションは、np.random.permutation() を呼び出す前に乱数ジェネレーターのシード (たとえば、np.random.seed(42)) を設定することです。これにより、常に同じシャッフルされたインデックスが生成されます。

ただし、更新されたデータセットを次に取得するときに、これらのソリューションはいずれも機能しなくなります。一般的な解決策は、各インスタンスの識別子を使用して、テスト セットに入れるかどうかを決定することです (インスタンスには一意で不変の識別子があると仮定します)。

Sachin Rastogi: 良いトレーニング/テスト部門になるでしょうか? いいえ、Train と Test には、Train セットからの偏りを避けるために、データセット全体の要素を含める必要があります。

著者は例を挙げて、

各インスタンスの識別子のハッシュを計算し、ハッシュが最大ハッシュ値の 20% 以下である場合、そのインスタンスをテスト セットに入れることができます。これにより、データセットを更新しても、複数回の実行でテスト セットの一貫性が維持されます。

新しいテスト セットには新しいインスタンスの 20% が含まれますが、以前にトレーニング セットに含まれていたインスタンスは含まれません。

Sachin Rastogi: この解決策を理解できません。助けていただけますか?

4

1 に答える 1