固定されていないカテゴリデータを使用して分類するにはどうすればよいですか?


10

カテゴリカルデータと数値データの両方に分類問題があります。私が直面している問題は、カテゴリデータが固定されていないことです。つまり、ラベルを予測したい新しい候補者には、事前に観察されなかった新しいカテゴリがある可能性があります。

例えば、私のカテゴリーデータであった場合、sex唯一の可能なラベルがないだろうfemalemaleother、ないかは重要。ただし、私のカテゴリー変数はcity、予測しようとしている人物が私の分類子が見たことのない新しい都市を持っている可能性があるためです。

これらの用語で分類を行う方法があるのか​​、またはこの新しいカテゴリーデータを考慮して再度トレーニングを行う必要があるのか​​と思います。


1
cityいくつかの関数に基づいて数値に変換できますか?同様にcity' = f(latitude, longitude)そのように、あなたはどの都市のための新たな価値を創造することができます
ムハンマド・Athar

@MohammadAtharはここで完璧なソリューションを提供しました。OPがそれを見てくれることを願っています!
Francesco Pegoraro

回答:


11

とても良い質問です。実際、この問題はしばらく前からあり、私はまだ完全な解決策を見つけていません。それでも私の経験を共有して幸せです:

  • ワンホットエンコードはできるだけ避けてください(上記の提案とは異なり)。その理由は、それが機能しないことです。one-hot-encode機能を持つモデルは、それらすべてのサブレベルがトレーニングデータに存在している場合にのみ機能します。手動で調整しない限り、モデルは予測を実行できません。検索すると、データをトレーニング/テストに分割するときに多くの人がこの問題に遭遇し、特定の機能の一部のサブレベルがトレーニング分割に存在せず、その後テストで予測を実行できないという問題に直面したことがわかります。余談ですが、非常に重要な機能(たとえば、200の都市名がある都市など)がある場合、データの次元が不必要に増加します。何らかの理由でワンホットエンコーディングを行う必要がある場合は、これらを念頭に置いてください。
  • 他のエンコーディング方法を使用します。多分、この問題に対してロバストな他の方法についてもっと学んでみてください。少なくとも、しばらくの間は、ターゲットベースのコーディングやハッシュのようなものです(以下の参考文献を参照)。Pythonを使用している場合は、mantエンコーディングオプションを提供する素晴らしいパッケージがあります。他の単純な方法がうまく機能することがよくあるのに驚くかもしれません。

  • モデルを再トレーニングします。理論的には、学習時に列車/セットは同じ分布を持っているはずです(ほとんどの場合、これはターゲット分布と見なされますが、変数についても当てはまります)。新しいアイテムが登場し、テスト(目に見えない)データの分布が変更されました。次に、これらの新しい都市が考慮されるように、モデルを再トレーニングするのが最善です。

  • 新しく追加されたサブカテゴリ(および最も頻度の低いサブカテゴリ)を[ その他]に配置します。以前のポイントは理論的には真実ですが、(その特定のカテゴリの)テスト分布はほとんどの場合に大幅に変更されない可能性が非常に高く、たとえば、トレーニングセットのカテゴリの上位にあるアイテムはほとんどありません。おそらくあなたの場合のように、あなたは都市の特徴に100の都市を持っているかもしれません、そして、ほんの少しの新しい都市が時間の経過とともに来るだけです。私が検討することは、その特定のカテゴリのLet's X-Quanileを見て、最も頻度の低いものをOthersサブカテゴリに入れることです。新しく追加されたデータポイントがほんのわずかであると仮定すると、それは非常にその他に行きますグループ。これを行うと、確かに細かさのレベルが失われますが、学習のポイントは、モデルがトレーニングデータを学習するだけでなく、最も重要なのは、目に見えないデータとそれらの新しく追加されたカテゴリについて非常によく一般化できることです。非常にデータポイントであるため、それらをすべて[ その他]グループにグループ化しても問題はありません。

  • その他の最近の未熟ソリューションなどのCat2Vec(NLPからWord2Vecから借りた)または類似のエンコーディング。これらは、非常に最近しているチェック元とそのためのgithubの及び(Word2Vecに基づいて)例えば Kaggleで、この後者とそのための実装。前者の考え方は、カテゴリーをベクトルに変換することです。言うまでもないことですが、仕事をするのは理にかなっていますが、使用した経験はありません。後者はいわゆるdirty_catであり、非常に有望で使いやすいように見えます。テストデータに目に見えない主要カテゴリがあることに対して堅牢であるかどうかは、私には明らかではありません。

PS:最初のコメントで与えられた地理的な場所への都市のアイデアは本当に素晴らしいことを付け加えたいと思います。それらは多くのPython APIであるため、実際には複雑ではありません。ただし、これは新しい機能を設計するための単なる方法であり、都市の機能自体によって置き換えられることはありません。

firstsecondthirdfourthをチェックするための興味深い参照(特定の順序はありません!)

上記のすべてのポイントは、具体的に理論的に正しいという実際的な解決策であり、確実にさらなる議論の対象となります。そして、私はもっと学ぶことが幸せです。


1
同様の都市のクラスタリングを作成するのはどうですか?新しい都市があったとしても、それは私たちがすでに持っているものと何も変わらないので、最も近い都市とクロスチェックできますか?
Aditya 2018

喜びアディティア。それはまた別の優れたアイデアです。新しい "Similarity Encoding"については知りません。まったく同じことをしているのかもしれません。チュートリアルを確認してください。また、すべての距離が数値と同様の意味を持たないため、kモードなどのカテゴリデータに使用するクラスタリングに注意する必要があることにも注意してください。
TwinPenguins 2018

すばらしい回答ありがとうございます。どうすれば再トレーニングできますか?つまり、新しい候補者がいて、彼/彼女が良いか悪いかを予測したいのですが、彼/彼女の真のラベルが良いかどうかを示すラベルがない場合、どうやってモデルを再トレーニングできますか?再トレーニングを行うためにこの新しいデータを含める方法がわからないので、予測のポイントがありません。私が間違っている?
Marisa

どういたしまして。再トレーニングについて:文字どおり、最初からやり直し、すべてのデータを混合して、新しいデータが入っていることを確認してから、もう一度学習を始めます。あなたがその特定の新しいデータポイントの真のラベルを持っていないと述べたもう一つのポイント:これはそれ自体は非常に異なる話です。このデータポイントにラベルを付けるためにできることは、非常に単純なKNNアルゴリズムのように、最も類似したデータポイントを探し、そこからラベルを取得することです。
TwinPenguins

4

最も簡単な方法(通常、開始するのに適した場所)は、都市を1つのホットエンコードするだけです。この場合、すべての都市が単一のフィーチャになり、値は1(人物はその都市の出身)または0(出身ではない)になります。その都市)。トレーニングセットに存在しないテストセットに新しい都市が表示される場合、その人はトレーニングセットのすべての都市に対して0を持ちます。これは奇妙に思えるかもしれませんが、その都市がトレーニングセットに含まれていない場合、その都市からの人に重みを置く必要はありません。

次のステップは、Mohammad Atharが提案したものに沿ったものであり、トレーニングセット内の他の都市への地理的な近接性についてのアイデアを得るでしょう。これはもっと複雑になるので、他の人にコメントさせてもらいます。


単純なものから始めて、そこから成長することは素晴らしいアドバイスです!
Escachator

0

Vowpal Wabbitをチェックアウトする必要があります。VowpalWabbitはハッシュトリックと適応学習率を使用して非常に優れた新機能を処理します。

新しい機能が表示されたときに(トレーニング時またはテスト時に)クラッシュしないだけでなく、ウェイトも更新されます。その上、その邪悪な高速。ただし、線形モデルのバリアントのみを実装するため、その側に制限されます。知っておくべき非常に強力なツール

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