2016-03-06 4 views
11

私は、pandas.DataFrame形式のデータを自動的に前処理するツールを開発してきました。この前処理ステップでは、連続的なデータとカテゴリ的なデータを別々に扱いたい。特に、私はのみカテゴリーデータに、例​​えば、OneHotEncoderを適用することができるようにしたいです。pandas.DataFrameの列がカテゴリ型であるかどうかを検出する優れたヒューリスティックは何ですか?

それでは、私たちはpandas.DataFrameを提供し、データフレーム内のデータについてのその他の情報を持っていないしていると仮定しましょう。 pandas.DataFrameの列がカテゴリであるかどうかを判断するために使用する優れたヒューリスティックは何ですか?

私の最初の考えは以下のとおりです。

1)列内の文字列(例えば、列のデータ型がobjectである)がある場合、その列は非常に可能性が含まれているカテゴリーデータ )であれば、いくつかの割合(例えば> = 20%)、列には連続データが含まれている可能性が非常に高い

1)は正常に動作していますが、2)は非常にうまく機能していません。私はより良いヒューリスティックが必要です。どのようにこの問題を解決しますか?

編集:誰かがなぜ2)がうまく動作しなかったのかを説明するように依頼しました。列に連続した値がまだあるが、列に一意の値が多くないテストケースがいくつかありました。その場合、2)のヒューリスティックは明らかに失敗しました。また、タイタニックデータセットの乗客名など、多くの固有値が数多くあるカテゴリの列がある問題もありました。そこに同じ列型の誤分類問題があります。

+0

この質問はほぼ完全に定義されていないと思います。世界のすべてのデータセットに対する分布は何ですか?ルール1は、郵便サービスや電話帳などのために悲惨に失敗します。 –

+3

[Benfordの法則](https://en.wikipedia.org/wiki/Benford%27s_law)を使用して、カテゴリデータから数値データを識別してください。 –

+0

@ Barmaley.exeあなたはそのアイデアを具体化できますか? –

答えて

1

それはデータが何であるかに依存するため、IMO反対の戦略は、categoricalsを識別することは良いです。技術的なアドレスデータは、順序付けられていないカテゴリデータと考えることができますが、通常はそれを使用しません。調査データについては

、アイデアは、例えば、リッカート尺度を探すことになります"良い"、 "悪い"、 "。が一致します。"、 "very。*"、...)またはint値を検索するためにハードコードされた(および変換された) 0〜8の範囲+ NAである。

国とこのようなことでも識別できるかもしれない...

年齢グループ( "- 。。")も動作する可能性があります。ここで

8

はアプローチのカップルです:

  1. は、ユニークな値の総数にユニークな値の数の割合を検索します。次

    likely_cat = {} 
    for var in df.columns: 
        likely_cat[var] = 1.*df[var].nunique()/df[var].count() < 0.05 #or some other threshold 
    
  2. チェックのようなもの上位n個の一意の値がすべての値

    top_n = 10 
    likely_cat = {} 
    for var in df.columns: 
        likely_cat[var] = 1.*df[var].value_counts(normalize=True).head(top_n) > 0.8 #or some other threshold 
    

アプローチ1)の一定割合以上を占めている場合にアプローチ2よりも一般的に私にとってはうまくいきました。しかし、アプローチ2)は、「長いテールディストリビューション」があると良いでしょう。少数のカテゴリ変数は頻度が高く、多数のカテゴリ変数は頻度が低いです。

1

「数字」としてキャストできるフォーマットの定義を「盗む」ことができる場所はたくさんあります。 ##、#e-#は説明のためのフォーマットの1つです。おそらく、そうするためのライブラリを見つけることができるでしょう。 私はすべてを最初に数字にキャストしようとしています。残っているものは、他の方法はありませんが、それらをカテゴリー的に保つことです。

+0

私はこの考えが好きです。誰もそのような図書館を知っていますか? –

+0

アイデアが好きなら、答えをアップアップしてみて、他の人にはもっと見えるようにし、彼らはライブラリを提案するかもしれません。 – Diego

1

ここで本当に疑問に思うのは、ユーザーをしばらく悩ますか、しばらくして黙って失敗するかどうかです。

ユーザーが気にしない場合は、あいまいさを検出してエラーを発生させることができます。

静かに失敗しても問題がなければ、ヒューリスティックは問題ありません。私はあなたがそれよりもはるかに優れたものを見つけられるとは思わない。あなたが本当にしたいのなら、これを学習問題にすることができると思います。一連のデータセットをダウンロードし、それらがまとめて世界のすべてのデータセットの適切な表現であると仮定し、各データセット/列の機能に基づいて列挙して、カテゴリと継続を予測します。

もちろん、最終的には何も完璧ではありません。例えば。日の時間や犬の品種を指す列[1,8,22,8,9,8]ですか?

1

私は同様の問題を考えていましたが、それを考慮すると、モデル自体を訓練の恩恵を受ける分類問題と思われます。

あなたがデータセットの束を検討し、各列/ pandas.Seriesのため、これらの機能を抽出した場合、私は賭け:

  • %の山車:フロート
  • % int型である値の割合:値の割合全体の数字がある
  • %文字列:一意の文字列値の数/総数
  • %一意の整数:ユニークな整数の数の文字列が
  • %一意の文字列である値の割合値/総数
  • 平均数値(この0と見なさ非数値)数値

とモデルを訓練し、それは、ここで列タイプを推測にかなり良い得ることができるの

  • STD偏差可能な出力値は、カテゴリ、順序、量的です。

    サイドノート:限られた数の数値を持つシリーズに行く限り、興味深い問題はカテゴリと序数を決定するようです。それは定量的な権利であることが判明した場合、変数が順序的であると考えることを傷つけることはありませんか?前処理ステップは、一度のホットエンコーディングを行わずに序数を数値で符号化します。

    興味深い関連する問題:列のグループを指定すると、それらがすでにワンホットエンコードされているかどうかを知ることができますか?たとえば、森林被覆タイプの予測競争コンテストでは、土壌タイプが単一のカテゴリ変数であることを自動的に知ることができます。

  • +0

    >興味深い関連問題:列のグループがある場合、それらがすでにワンホットエンコードされているかどうかを知ることができますか? || これには、列のメタデータが必要です。 https://github.com/pandas-dev/pandas/issues/3402を参照してください。 –

    関連する問題