とても良い質問です。実際、この問題はしばらく前からあり、私はまだ完全な解決策を見つけていません。それでも私の経験を共有して幸せです:
- ワンホットエンコードはできるだけ避けてください(上記の提案とは異なり)。その理由は、それが機能しないことです。one-hot-encode機能を持つモデルは、それらすべてのサブレベルがトレーニングデータに存在している場合にのみ機能します。手動で調整しない限り、モデルは予測を実行できません。検索すると、データをトレーニング/テストに分割するときに多くの人がこの問題に遭遇し、特定の機能の一部のサブレベルがトレーニング分割に存在せず、その後テストで予測を実行できないという問題に直面したことがわかります。余談ですが、非常に重要な機能(たとえば、200の都市名がある都市など)がある場合、データの次元が不必要に増加します。何らかの理由でワンホットエンコーディングを行う必要がある場合は、これらを念頭に置いてください。
他のエンコーディング方法を使用します。多分、この問題に対してロバストな他の方法についてもっと学んでみてください。少なくとも、しばらくの間は、ターゲットベースのコーディングやハッシュのようなものです(以下の参考文献を参照)。Pythonを使用している場合は、mantエンコーディングオプションを提供する素晴らしいパッケージがあります。他の単純な方法がうまく機能することがよくあるのに驚くかもしれません。
モデルを再トレーニングします。理論的には、学習時に列車/セットは同じ分布を持っているはずです(ほとんどの場合、これはターゲット分布と見なされますが、変数についても当てはまります)。新しいアイテムが登場し、テスト(目に見えない)データの分布が変更されました。次に、これらの新しい都市が考慮されるように、モデルを再トレーニングするのが最善です。
新しく追加されたサブカテゴリ(および最も頻度の低いサブカテゴリ)を[ その他]に配置します。以前のポイントは理論的には真実ですが、(その特定のカテゴリの)テスト分布はほとんどの場合に大幅に変更されない可能性が非常に高く、たとえば、トレーニングセットのカテゴリの上位にあるアイテムはほとんどありません。おそらくあなたの場合のように、あなたは都市の特徴に100の都市を持っているかもしれません、そして、ほんの少しの新しい都市が時間の経過とともに来るだけです。私が検討することは、その特定のカテゴリのLet's X-Quanileを見て、最も頻度の低いものをOthersサブカテゴリに入れることです。新しく追加されたデータポイントがほんのわずかであると仮定すると、それは非常にその他に行きますグループ。これを行うと、確かに細かさのレベルが失われますが、学習のポイントは、モデルがトレーニングデータを学習するだけでなく、最も重要なのは、目に見えないデータとそれらの新しく追加されたカテゴリについて非常によく一般化できることです。非常にデータポイントであるため、それらをすべて[ その他]グループにグループ化しても問題はありません。
その他の最近の未熟ソリューションなどのCat2Vec(NLPからWord2Vecから借りた)または類似のエンコーディング。これらは、非常に最近しているチェック紙元とそのためのgithubの及び(Word2Vecに基づいて)例えば Kaggleで、この紙後者とそのための実装。前者の考え方は、カテゴリーをベクトルに変換することです。言うまでもないことですが、仕事をするのは理にかなっていますが、使用した経験はありません。後者はいわゆるdirty_catであり、非常に有望で使いやすいように見えます。テストデータに目に見えない主要カテゴリがあることに対して堅牢であるかどうかは、私には明らかではありません。
PS:最初のコメントで与えられた地理的な場所への都市のアイデアは本当に素晴らしいことを付け加えたいと思います。それらは多くのPython APIであるため、実際には複雑ではありません。ただし、これは新しい機能を設計するための単なる方法であり、都市の機能自体によって置き換えられることはありません。
first、second、third、fourthをチェックするための興味深い参照(特定の順序はありません!)
上記のすべてのポイントは、具体的に理論的に正しいという実際的な解決策であり、確実にさらなる議論の対象となります。そして、私はもっと学ぶことが幸せです。
city
いくつかの関数に基づいて数値に変換できますか?同様にcity' = f(latitude, longitude)
そのように、あなたはどの都市のための新たな価値を創造することができます