with sklearn forest decision code classifier python scikit-learn decision-tree

python - forest - sklearn decision tree classifier



Pasando datos categóricos a Sklearn Decision Tree (3)

Hay varias publicaciones sobre cómo codificar datos categóricos en los árboles de Decisiones de Sklearn, pero de la documentación de Sklearn, obtuvimos estos

Algunas ventajas de los árboles de decisión son:

(...)

Capaz de manejar datos tanto numéricos como categóricos. Otras técnicas suelen estar especializadas en analizar conjuntos de datos que tienen un solo tipo de variable. Ver algoritmos para más información.

Pero ejecutando el siguiente script

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''])

produce el siguiente error:

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

Sé que en R es posible pasar datos categóricos, con Sklearn, ¿es posible?


(..)

Capaz de manejar datos tanto numéricos como categóricos.

Esto solo significa que puedes usar

  • La clase DecisionTreeClassifier para problemas de clasificación
  • La clase DecisionTreeRegressor para regresión.

En cualquier caso, necesita codificar las variables categóricas antes de ajustar un árbol con sklearn, así:

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''])


Contrariamente a la respuesta aceptada, preferiría usar las herramientas proporcionadas por Scikit-Learn para este propósito. La razón principal para hacerlo es que pueden integrarse fácilmente en un Pipeline .

Scikit-Learn proporciona clases muy buenas para manejar datos categóricos. En lugar de escribir su función personalizada, debe usar LabelEncoder que está especialmente diseñado para este propósito .

Consulte el siguiente código de la documentación:

le = preprocessing.LabelEncoder() le.fit(["paris", "paris", "tokyo", "amsterdam"]) le.transform(["tokyo", "tokyo", "paris"])

Esto los codifica automáticamente en números para sus algoritmos de aprendizaje automático. Ahora esto también es compatible con volver a cadenas de enteros. Puede hacerlo simplemente llamando a inverse_transform siguiente manera:

list(le.inverse_transform([2, 2, 1]))

Esto devolvería [''tokyo'', ''tokyo'', ''paris''] .

También tenga en cuenta que para muchos otros clasificadores, además de los árboles de decisión, como la regresión logística o SVM, le gustaría codificar sus variables categóricas utilizando la codificación One-Hot . Scikit-learn también lo admite a través de la clase OneHotEncoder .

¡Espero que esto ayude!


Los árboles de decisión de Sklearn no manejan la conversión de cadenas categóricas a números. Te sugiero que encuentres una función en Sklearn (quizás this ) que lo haga o escribas manualmente algún código como:

def cat2int(column): vals = list(set(column)) for i, string in enumerate(column): column[i] = vals.index(string) return column