español - Características categóricas y numéricas-Objetivo categórico-Scikit Learn-Python
scikit learn español (2)
Tengo un conjunto de datos que contiene columnas categóricas y numéricas y mi columna de destino también es categórica. Estoy usando la biblioteca Scikit en Python34. Sé que Scikit necesita que todos los valores categóricos se transformen en valores numéricos antes de realizar cualquier enfoque de aprendizaje automático.
¿Cómo debería transformar mis columnas categóricas en valores numéricos? Intenté muchas cosas pero recibo diferentes errores, como que el objeto "str" no tiene el objeto "numpy.ndarray" no tiene ningún atributo "items".
Here is an example of my data:
UserID LocationID AmountPaid ServiceID Target
29876 IS345 23.9876 FRDG JFD
29877 IS712 135.98 WERS KOI
Mi conjunto de datos se guarda en un archivo CSV, aquí está el pequeño código que escribí para darle una idea sobre lo que quiero hacer:
#reading my csv file
data_dir = ''C:/Users/davtalab/Desktop/data/''
train_file = data_dir + ''train.csv''
train = pd.read_csv( train_file )
#numeric columns:
x_numeric_cols = train[''AmountPaid'']
#Categrical columns:
categorical_cols = [''UserID'' + ''LocationID'' + ''ServiceID'']
x_cat_cols = train[categorical_cols].as_matrix()
y_target = train[''Target''].as_matrix()
Necesito que x_cat_cols se convierta en valores numéricos y que los agregue a x_numeric_cols y que así tengan mis valores de entrada (x) completos.
Luego, necesito convertir también mi función objetivo en valor numérico y convertirla en mi columna de destino final (y).
Entonces quiero hacer un Bosque Aleatorio utilizando estos dos conjuntos completos como:
rf = RF(n_estimators=n_trees,max_features=max_features,verbose =verbose, n_jobs =n_jobs)
rf.fit( x_train, y_train )
¡Gracias por tu ayuda!
Esto fue por la forma en que enumero los datos. Si imprimo los datos (usando otra muestra), verá:
>>> import pandas as pd
>>> train = pd.DataFrame({''a'' : [''a'', ''b'', ''a''], ''d'' : [''e'', ''e'', ''f''],
... ''b'' : [0, 1, 1], ''c'' : [''b'', ''c'', ''b'']})
>>> samples = [dict(enumerate(sample)) for sample in train]
>>> samples
[{0: ''a''}, {0: ''b''}, {0: ''c''}, {0: ''d''}]
Esta es una lista de dicts. Deberíamos hacer esto en su lugar:
>>> train_as_dicts = [dict(r.iteritems()) for _, r in train.iterrows()]
>>> train_as_dicts
[{''a'': ''a'', ''c'': ''b'', ''b'': 0, ''d'': ''e''},
{''a'': ''b'', ''c'': ''c'', ''b'': 1, ''d'': ''e''},
{''a'': ''a'', ''c'': ''b'', ''b'': 1, ''d'': ''f''}]
Now we need to vectorize the dicts:
>>> from sklearn.feature_extraction import DictVectorizer
>>> vectorizer = DictVectorizer()
>>> vectorized_sparse = vectorizer.fit_transform(train_as_dicts)
>>> vectorized_sparse
<3x7 sparse matrix of type ''<type ''numpy.float64''>''
with 12 stored elements in Compressed Sparse Row format>
>>> vectorized_array = vectorized_sparse.toarray()
>>> vectorized_array
array([[ 1., 0., 0., 1., 0., 1., 0.],
[ 0., 1., 1., 0., 1., 1., 0.],
[ 1., 0., 1., 1., 0., 0., 1.]])
To get the meaning of each column, ask the vectorizer:
>>> vectorizer.get_feature_names()
[''a=a'', ''a=b'', ''b'', ''c=b'', ''c=c'', ''d=e'', ''d=f'']
Para el objetivo, puede usar LabelEncoder de sklearn . Esto le dará un conversor de etiquetas de cadena a numéricas (y también una asignación inversa). Ejemplo en el enlace.
En cuanto a las características, los algoritmos de aprendizaje en general esperan (o funcionan mejor con) datos ordinales. Entonces, la mejor opción es usar OneHotEncoder para convertir las características categóricas. Esto generará una nueva característica binaria para cada categoría, que denota encendido / apagado para cada categoría. Nuevamente, ejemplo de uso en el enlace.