¿Cómo codificar una variable categórica en sklearn?

Estoy tratando de usar el conjunto de datos de evaluación de automóviles del repository de UCI y me pregunto si hay una manera conveniente de binarizar variables categóricas en sklearn. Un enfoque sería usar el DictVectorizer de LabelBinarizer, pero aquí obtengo k características diferentes, mientras que debería tener solo k-1 para evitar la colinealización. Supongo que podría escribir mi propia función y eliminar una columna, pero esta contabilidad es tediosa. ¿Existe una manera fácil de realizar tales transformaciones y obtener como resultado una matriz dispersa?

Si sus datos son un dataframe de pandas, simplemente puede llamar a get_dummies. Suponga que su dataframe es df, y desea tener una variable binaria por nivel de variable ‘clave’. Usted puede simplemente llamar:

 pd.get_dummies(df['key']) 

y luego elimine una de las variables ficticias, para evitar el problema de multicolinealidad. Espero que esto ayude …

El método básico es

 import numpy as np import pandas as pd, os from sklearn.feature_extraction import DictVectorizer def one_hot_dataframe(data, cols, replace=False): vec = DictVectorizer() mkdict = lambda row: dict((col, row[col]) for col in cols) vecData = pd.DataFrame(vec.fit_transform(data[cols].apply(mkdict, axis=1)).toarray()) vecData.columns = vec.get_feature_names() vecData.index = data.index if replace is True: data = data.drop(cols, axis=1) data = data.join(vecData) return (data, vecData, vec) data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'], 'year': [2000, 2001, 2002, 2001, 2002], 'pop': [1.5, 1.7, 3.6, 2.4, 2.9]} df = pd.DataFrame(data) df2, _, _ = one_hot_dataframe(df, ['state'], replace=True) print df2 

Aquí es cómo hacerlo en formato disperso.

 import numpy as np import pandas as pd, os import scipy.sparse as sps import itertools def one_hot_column(df, cols, vocabs): mats = []; df2 = df.drop(cols,axis=1) mats.append(sps.lil_matrix(np.array(df2))) for i,col in enumerate(cols): mat = sps.lil_matrix((len(df), len(vocabs[i]))) for j,val in enumerate(np.array(df[col])): mat[j,vocabs[i][val]] = 1. mats.append(mat) res = sps.hstack(mats) return res data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'], 'year': ['2000', '2001', '2002', '2001', '2002'], 'pop': [1.5, 1.7, 3.6, 2.4, 2.9]} df = pd.DataFrame(data) print df vocabs = [] vals = ['Ohio','Nevada'] vocabs.append(dict(itertools.izip(vals,range(len(vals))))) vals = ['2000','2001','2002'] vocabs.append(dict(itertools.izip(vals,range(len(vals))))) print vocabs print one_hot_column(df, ['state','year'], vocabs).todense()