2012-11-29 14 views
12

Ich arbeite an einem Projekt mit k-Nearest-Neighbour-Regression. Ich habe numerische und kategorische Felder gemischt. Die kategorischen Werte sind ordinal (z. B. Bankname, Kontotyp). Numerische Typen sind z. Gehalt und Alter. Es gibt auch einige binäre Typen (z. B. männlich, weiblich).KNN-Klassifizierung mit kategorischen Daten

Wie gehe ich vor, kategorische Werte in die KNN-Analyse einzubeziehen?

Soweit mir bekannt ist, kann man nicht einfach jedes kategorische Feld auf Zifferntasten abbilden (z. B. Bank 1 = 1; Bank 2 = 2 usw.), also brauche ich einen besseren Ansatz für die Verwendung der kategorialen Felder. Ich habe gehört, dass man Binärzahlen verwenden kann - ist das eine machbare Methode? Beratung wäre sehr willkommen.

+0

Sie Frage ist sehr vage. Bitte fügen Sie einige Beispiele hinzu, um es konkreter zu machen: Was genau sind die Daten, mit denen Sie es zu tun haben? Welche Art von Clustern erwarten Sie? Nach welchen Kriterien? Welche Algorithmen verwendest du? – Shai

+0

In Bezug auf die Umwandlung kategorischer Daten in binäre Werte: siehe http://arxiv.org/pdf/1210.7070v3.pdf der Beginn der sek. 2 beschreiben diese Umwandlung. – Shai

+1

Ich verwende k-nearest neighbor clustering. Ich möchte einen Cluster von k = 20 Punkten um einen Testpunkt unter Verwendung mehrerer Parameter/Dimensionen erzeugen (Alter, Geschlecht, Bank, Gehalt, Kontotyp). Für Kontoart, z. B. haben Sie Girokonto, Konto und Sparkonto (kategorische Daten). Das Gehalt ist jedoch kontinuierlich (numerisch). Wie verwende ich kategorische Felder mit kontinuierlichen Feldern, um KNN-Clustering durchzuführen? – Graham

Antwort

11

Sie müssen eine Distanzfunktion finden, die für Ihre Daten funktioniert. Die Verwendung binärer Indikatorvariablen löst dieses Problem implizit. Dies hat den Vorteil, dass Sie Ihre wahrscheinlich matrixbasierte Implementierung mit dieser Art von Daten fortsetzen können, aber ein viel einfacherer Weg - und für die meisten entfernungsbasierten Methoden geeignet - ist es, nur eine modifizierte Distanzfunktion zu verwenden.

Es gibt eine unendliche Anzahl solcher Kombinationen. Sie müssen experimentieren, was am besten für Sie funktioniert. Im Wesentlichen möchten Sie vielleicht eine klassische Metrik für die numerischen Werte verwenden (normalerweise mit angewendeter Normalisierung; aber es könnte sinnvoll sein, diese Normierung auch in die Entfernungsfunktion zu verschieben), plus eine Distanz für die anderen Attribute, die entsprechend skaliert werden.

In den meisten realen Anwendungsdomänen von entfernungsbasierten Algorithmen ist dies der schwierigste Teil, der Ihre domänenspezifische Abstandsfunktion optimiert. Sie können dies als Teil der Vorverarbeitung sehen: Definition der Ähnlichkeit.

Es gibt viel mehr als nur euklidische Entfernung. Es gibt verschiedene mengentheoretische Maßnahmen, die in Ihrem Fall viel geeigneter sein können. Zum Beispiel, Tanimoto-Koeffizient, Jaccard-Ähnlichkeit, Würfelkoeffizient und so weiter. Cosine könnte auch eine Option sein.

Es gibt ganze Konferenzen zu den Themen Ähnlichkeitssuche gewidmet - niemand behauptet, dies alles andere als euklidische Vektorräume trivial ist (und eigentlich gar nicht da): http://www.sisap.org/2012

+0

Danke für die Antwort. Ich habe immer noch Probleme mit der Umsetzung. Ich benutze eine einfache Matlab-Funktion, "nmsearch", die euklidische Entfernungen zu jedem Punkt berechnet. Nun, sicher, ich könnte sagen männlich/weiblich = 0/1, oder Bank 1 = 100, Bank 2 = 010, Bank 3 = 001. Wie aber benutze ich das? Ich brauche nur eine kleine Anleitung darüber, wo ich mit der Implementierung einer Distanzfunktion beginnen soll und ob Matlab noch funktionieren kann ... – Graham

+0

Ich benutze Matlab nicht, also weiß ich nicht, wie ich es dort machen soll. Euklidischer Abstand ist in physikalischer 2d/3d sinnvoll, in nicht-physikalischen Daten höherer Dimension jedoch nicht so gut. Ich persönlich mag die "Bitcodierung" solcher Werte nicht. Beachten Sie, dass in Ihrem Beispiel männlich/weiblich ein geringeres Gewicht (Entfernung 0 oder 1) des Bankattributs (Entfernung 0 oder sqrt (2) in euklidisch) hat! –

1

Der einfachste Weg, um kategorische Daten in numerische umzuwandeln, ist die Verwendung von Indikatorvektoren. Siehe die Referenz, die ich bei meinem vorherigen Kommentar gepostet habe.

+0

Danke Shai - Ich bin ein bisschen durch die technischen Details in Ihrem Papier belastet. Bitte beachten Sie die Kommentare unten. – Graham

+1

Erstellen Sie für jede kategoriale Variable einfach n Dimensionen, wobei die Variable n mögliche Werte annimmt. Jede dieser Dimensionen entspricht einem bestimmten Wert und kann entweder 0 (nicht vorhanden) oder 1 (vorhanden) sein. Daher ist Ihre n-way kategoriale Variable jetzt n binäre Features. Jetzt können Sie euklidische Distanz oder jede andere Metrik verwenden, die Sie mögen –

+0

@BenAllison Wenn Ihre Vektoren binäre Einsen sind (dh nur aus Nullen und Einsen bestehen), kann ein gutes Distanzmaß die ** Hamming ** Distanz sein: http: // en.wikipedia.org/wiki/Hamming_distanz. Es kann sehr einfach und effizient berechnet werden. – Shai

0

Können wir Lokalität Sensitive Hashing verwenden (LSH) + Abstand bearbeiten und davon ausgehen, dass jedes Feld eine andere Kategorie darstellt? Ich verstehe, dass kategorische Daten keine Reihenfolge zeigen und die Bins in LSH sind nach einer Hash-Funktion angeordnet. Das Finden der Hash-Funktion, die eine sinnvolle Anzahl von Bins ergibt, klingt für mich wie das Lernen eines metrischen Raums.

Verwandte Themen