2016-03-06 12 views
11

Ich habe ein Tool entwickelt, das automatisch Daten im pandas.DataFrame-Format vorverarbeitet. Während dieses Vorverarbeitungsschritts möchte ich kontinuierliche und kategoriale Daten unterschiedlich behandeln. Insbesondere möchte ich in der Lage sein, z. B. einen OneHotEncoder auf nur die kategorischen Daten anzuwenden.Was ist eine gute Heuristik, um festzustellen, ob eine Spalte in einem pandas.DataFrame kategorisch ist?

Nehmen wir nun an, dass ein pandas.DataFrame bereitgestellt wird und keine weiteren Informationen über die Daten im DataFrame verfügbar sind. Was ist eine gute Heuristik, um zu bestimmen, ob eine Spalte im pandas.DataFrame kategorisch ist?

Meine ersten Gedanken sind:

1) Wenn Zeichenfolgen in der Spalte sind (zum Beispiel die Spaltendatentyp ist object), dann sehr die Spalte enthält wahrscheinlich kategorische Daten

2) Wenn ein gewisser Prozentsatz der Werte in der Spalte ist einzigartig (zB> = 20%), dann enthält die Spalte sehr wahrscheinlich kontinuierliche Daten

Ich habe 1) gefunden, um gut zu funktionieren, aber 2) hat nicht sehr gut aus. Ich brauche bessere Heuristiken. Wie würdest du dieses Problem lösen?

Bearbeiten: Jemand gebeten, dass ich erkläre, warum 2) nicht gut funktioniert. Es gab einige Testfälle, in denen wir noch kontinuierliche Werte in einer Spalte hatten, aber es gab nicht viele eindeutige Werte in der Spalte. Die Heuristik in 2) ist in diesem Fall offensichtlich gescheitert. Es gab auch Probleme, bei denen wir eine kategorische Spalte hatten, die viele, viele eindeutige Werte hatte, z. B. Passagiernamen in der Titanic-Datei. Gleiches Fehlertyp-Problem bei Spalten.

+0

Ich glaube, diese Frage ist fast völlig undefiniert. Was ist die Verteilung über alle Datensätze in der Welt? Ihre Regel 1 schlägt zum Beispiel für den Postdienst oder das Telefonbuch kläglich fehl. –

+3

Versuchen Sie [Benfords Gesetz] (https://en.wikipedia.org/wiki/Benford%27s_law), numerische Daten von kategorischen zu unterscheiden. –

+0

@ Barmaley.exe Können Sie bitte auf diese Idee näher eingehen? –

Antwort

1

IMO die entgegengesetzte Strategie, kategorische zu identifizieren ist besser, weil es darauf ankommt, worum es bei den Daten geht. Technisch können Adressdaten als ungeordnete kategorische Daten betrachtet werden, aber normalerweise würde ich sie nicht auf diese Weise verwenden.

Für Umfragedaten wäre eine Idee, nach Likert-Skalen zu suchen, z.B. 5-8 Werte, entweder Zeichenfolgen (die wahrscheinlich hartcodierte (und übersetzte) Ebenen benötigen, um nach "gut", "schlecht", "stimme zu.", "sehr. *", ...) oder int-Werten zu suchen im Bereich von 0 bis 8 + NA.

Länder und solche Dinge könnten auch identifizierbar ...

Altersgruppen sein ("-..") könnten auch funktionieren.

8

Hier sind ein paar Ansätze:

  1. das Verhältnis der Anzahl der eindeutigen Werte auf die Gesamtzahl der eindeutigen Werte finden.So etwas wie die folgenden

    likely_cat = {} 
    for var in df.columns: 
        likely_cat[var] = 1.*df[var].nunique()/df[var].count() < 0.05 #or some other threshold 
    
  2. Überprüfen Sie, ob die obere n eindeutige Werte entfallen mehr als ein bestimmter Anteil aller Werte

    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 
    

Ansatz 1) hat im Allgemeinen besser für mich gearbeitet als Ansatz 2). Aber Ansatz 2) ist besser, wenn es eine "long-tailed distribution" gibt, bei der eine kleine Anzahl von kategorischen Variablen eine hohe Frequenz hat, während eine große Anzahl von kategorischen Variablen eine niedrige Frequenz aufweist.

1

Es gibt viele Orte, an denen Sie die Definitionen von Formaten "stehlen" könnten, die als "Zahl" umgewandelt werden können. ##, # e- # wäre eines dieser Formate, nur um es zu veranschaulichen. Vielleicht finden Sie dazu eine Bibliothek. Ich versuche zuerst alles nach Zahlen zu sortieren und was übrig ist, nun, es gibt keinen anderen Weg, als sie zu kategorisieren.

+0

Ich mag diese Idee. Kennt jemand eine solche Bibliothek? –

+0

Wenn Sie die Idee mögen, erwägen Sie, die Antwort zu verbessern, damit sie für andere sichtbarer wird und sie die Bibliothek vorschlagen können. – Diego

1

Ich denke, die wirkliche Frage hier ist, ob Sie den Benutzer hin und wieder stören oder gelegentlich stolpern wollen.

Wenn es Ihnen nichts ausmacht, den Benutzer zu belästigen, ist es vielleicht die beste Methode, Unklarheiten zu entdecken und einen Fehler zu melden.

Wenn es Ihnen nichts ausmacht, stumm zu sein, dann sind Ihre Heuristiken in Ordnung. Ich glaube nicht, dass Sie etwas finden, das wesentlich besser ist. Ich schätze, du könntest das zu einem Lernproblem machen, wenn du es wirklich willst. Laden Sie eine Reihe von Datensätzen herunter, nehmen Sie an, dass sie gemeinsam eine anständige Darstellung aller Datensätze in der Welt darstellen, und trainieren Sie basierend auf Funktionen über jedem Datensatz/jeder Spalte, um kategorische vs. kontinuierliche Vorhersagen zu treffen.

Aber natürlich kann am Ende nichts perfekt sein. Z.B. bezieht sich die Spalte [1, 8, 22, 8, 9, 8] auf Stunden des Tages oder auf Hunderassen?

1

Ich habe über ein ähnliches Problem nachgedacht und je mehr ich es betrachte, es scheint, dass dies selbst ein Klassifizierungsproblem ist, das vom Training eines Modells profitieren könnte.

Ich wette, wenn Sie eine Reihe von Datensätzen untersucht und extrahiert diese Funktionen für jede Spalte/pandas.Series:

  • % Schwimmern: Anzahl von Werten, die float
  • % int sind: Anzahl von Werten, die sind ganze Zahlen
  • % string: Prozentsatz des Wertes, die Strings
  • % eindeutige Zeichenfolge, sind: Anzahl der eindeutigen Zeichenfolgenwerte/Gesamtzahl
  • % einzigartige ganze Zahlen: Anzahl der eindeutigen ganzzahligen Werte/Gesamtzahl
  • mittlerer Zahlenwert (nicht numerischer 0 für diesen als Wert)
  • std Abweichung von numerischen Werten

und ein Modell trainiert, könnte es bei Folgern Spaltentypen ziemlich gut erhalten, in dem die Mögliche Ausgabewerte sind: kategorisch, ordinal, quantitativ.

Seitennotiz: so weit wie eine Serie mit einer begrenzten Anzahl von numerischen Werten geht, scheint es, dass das interessante Problem sein würde, kategorisch gegen ordinal zu bestimmen; Es tut nicht weh zu denken, dass eine Variable Ordinal ist, wenn sie sich als quantitativ richtig herausstellt? Die Vorverarbeitungsschritte würden die Ordinalwerte sowieso numerisch codieren, ohne eine Ein-Hot-Codierung.

Ein ähnliches Problem, das interessant ist: Können Sie bei einer Gruppe von Spalten feststellen, ob sie bereits ein-hot-codiert sind? ZB würde man im Kaggle-Wettbewerb für die Vorhersage von Waldbedeckung automatisch wissen, dass der Bodentyp eine einzige kategoriale Variable ist.

+0

> Ein verwandtes Problem, das interessant ist: Können Sie bei einer Gruppe von Spalten feststellen, ob sie bereits ein-hot-codiert sind? || Dies würde kolumnare Metadaten erfordern. Siehe https://github.com/pandas-dev/pandas/issues/3402 –

Verwandte Themen