この本「TensorFlow Machine Learning Cookbook」の第7章では、データを前処理する著者がscikit-learnのfit_transform
関数を使用して、トレーニング用のテキストのtfidf
機能を取得しています。作成者は、すべてのテキストデータを関数に与えてから、トレーニングとテストに分けます。それは本当の行動ですか、それとも最初にデータを分離してから、トレーニングでfit_transform
を実行し、テストでtransform
を実行する必要がありますか?
私はその本を読んだことがなく、これが本の間違いかどうかはわかりませんが、2セントは差し上げます。
Scikit-learnのドキュメントによると、fit()
は、
トレーニングセットから語彙とidfを学びます。
一方、fit_transform()
は、
語彙とidfを学び、用語とドキュメントのマトリックスを返します。
while transform()
文書を文書用語マトリックスに変換します。
トレーニングセットでは、fit()
とtransform()
の両方を適用する必要があります(または、基本的に両方の操作に参加するfit_transform()
のみ)。ただし、テストセットでは、 transform()
テストインスタンス(つまり、ドキュメント)。
トレーニングセットは学習目的で使用されることを覚えておいてください(学習はfit()
を通じて達成されます)。一方、テストセットは、トレーニングされたモデルが新しい一般化できるかどうかを評価するために使用されますnseenデータポイント。
著者は、列車とテストを分離して機能させる前に、すべてのテキストデータを提供します。それは本当の行動ですか、それとも最初にデータを分離してから、トレインでtfidf fit_transformを実行し、テストで変換する必要がありますか?
私はこれを、テストセットに関するいくつかの情報をトレーニングセットに既にリークしていると見なします。
私は常に前処理を行う前に、データを分離してホールドアウトセットを作成するという規則に従う傾向があります。
テキストデータについて話しているとき、モデルが実際のモデルをデプロイするときに、これまで見たことのない単語に遭遇するため、モデルがトレーニングセットの語彙でのみトレーニングされることを確認する必要があります。それを念頭に置いてテストセットの検証を行うため。
テストセットの新しい単語がモデルの語彙の一部でないことを確認する必要があります。
したがって、トレーニングデータにfit_transformを使用し、テストデータに変換する必要があります。相互検証を行うことを考えている場合は、このロジックをすべてのフォールドにわたって使用できます。