Es gibt mehrere Beiträge zum Codieren kategorialer Daten in Sklearn-Entscheidungsbäume, aber aus der Sklearn-Dokumentation haben wir diese erhalten
Einige Vorteile von Entscheidungsbäumen sind:
(...)
Kann sowohl numerische als auch kategoriale Daten verarbeiten. Andere Techniken sind normalerweise auf die Analyse von Datensätzen spezialisiert, die nur einen Variablentyp aufweisen. Weitere Informationen finden Sie in den Algorithmen.
Führen Sie jedoch das folgende Skript aus
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
data = pd.DataFrame()
data['A'] = ['a','a','b','a']
data['B'] = ['b','b','a','b']
data['C'] = [0, 0, 1, 0]
data['Class'] = ['n','n','y','n']
tree = DecisionTreeClassifier()
tree.fit(data[['A','B','C']], data['Class'])
gibt den folgenden Fehler aus:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/sklearn/tree/tree.py", line 154, in fit
X = check_array(X, dtype=DTYPE, accept_sparse="csc")
File "/usr/local/lib/python2.7/site-packages/sklearn/utils/validation.py", line 377, in check_array
array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: could not convert string to float: b
Ich weiß, dass es in R möglich ist, kategoriale Daten mit Sklearn zu übergeben. Ist das möglich?
quelle
DecisionTreeClassifier()
als numerisch behandelt werden . Wenn Ihre kategorialen Daten nicht ordinal sind, ist dies nicht gut - Sie erhalten Splits, die keinen Sinn ergeben. Die Verwendung von aOneHotEncoder
ist der einzig gültige Weg, ist jedoch rechenintensiv.LabelEncoder
auf mehrere Spalten eines Datenrahmens gleichzeitig anzuwenden? Können wir beispielsweise im Datenrahmen der Frage so etwas wiele.fit_transform(data[['A','B','C']])
Beschriftungen für alle kategorialen Spalten gleichzeitig abrufen ? Oder Sie sollten die kategorialen Spalten explizit angeben, um nur die kategorialen Spalten zu konvertieren.(Dies ist nur eine Neuformatierung meines obigen Kommentars aus dem Jahr 2016 ... es gilt immer noch.)
Die akzeptierte Antwort auf diese Frage ist irreführend.
Derzeit verarbeiten sklearn-Entscheidungsbäume keine kategorialen Daten - siehe Problem Nr. 5442 .
Der empfohlene Ansatz zur Verwendung der Beschriftungscodierung wird in Ganzzahlen konvertiert, die als numerisch
DecisionTreeClassifier()
behandelt werden . Wenn Ihre kategorialen Daten nicht ordinal sind, ist dies nicht gut - Sie erhalten Splits, die keinen Sinn ergeben.Die Verwendung von a
OneHotEncoder
ist der einzig gültige Weg, der beliebige Teilungen zulässt, die nicht von der Etikettenreihenfolge abhängen, aber rechenintensiv sind.quelle
Dies bedeutet nur, dass Sie verwenden können
In jedem Fall müssen Sie kategoriale Variablen einmalig codieren, bevor Sie einen Baum mit sklearn anpassen, wie folgt:
import pandas as pd from sklearn.tree import DecisionTreeClassifier data = pd.DataFrame() data['A'] = ['a','a','b','a'] data['B'] = ['b','b','a','b'] data['C'] = [0, 0, 1, 0] data['Class'] = ['n','n','y','n'] tree = DecisionTreeClassifier() one_hot_data = pd.get_dummies(data[['A','B','C']],drop_first=True) tree.fit(one_hot_data, data['Class'])
quelle
Für nominelle kategoriale Variablen würde ich nicht verwenden,
LabelEncoder
sondernsklearn.preprocessing.OneHotEncoder
oderpandas.get_dummies
stattdessen, weil es normalerweise keine Reihenfolge in dieser Art von Variablen gibt.quelle
Sklearn-Entscheidungsbäume verarbeiten keine Konvertierung von kategorialen Zeichenfolgen in Zahlen. Ich schlage vor, Sie finden in Sklearn eine Funktion (vielleicht diese ), die dies tut, oder schreiben manuell Code wie:
def cat2int(column): vals = list(set(column)) for i, string in enumerate(column): column[i] = vals.index(string) return column
quelle