Saltar al contenido

Análisis de regresión lineal con string/ características categóricas (variables)?

Bienvenido a nuestro espacio, aquí encontrarás la respuesta que buscas.

Solución:

Sí, tendrás que convertir todo en números. Eso requiere pensar en lo que estos attributes representar.

Normalmente hay tres posibilidades:

  1. Codificación One-Hot para datos categóricos
  2. Números arbitrarios para datos ordinales
  3. Utilice algo así como medias de grupo para datos categóricos (por ejemplo, precios medios para distritos de la ciudad).

Debe tener cuidado de no infundir información que no tiene en el caso de solicitud.

Una codificación en caliente

Si tiene datos categóricos, puede crear variables ficticias con valores 0/1 para cada valor posible.

P.ej.

idx color
0   blue
1   green
2   green
3   red

a

idx blue green red
0   1    0     0
1   0    1     0
2   0    1     0
3   0    0     1

Esto se puede hacer fácilmente con pandas:

import pandas as pd

data = pd.DataFrame('color': ['blue', 'green', 'green', 'red'])
print(pd.get_dummies(data))

resultará en:

   color_blue  color_green  color_red
0           1            0          0
1           0            1          0
2           0            1          0
3           0            0          1

Números para datos ordinales

Cree un mapeo de sus categorías clasificables, por ejemplo, antiguo

Esto también es posible con pandas:

data = pd.DataFrame('q': ['old', 'new', 'new', 'ren'])
data['q'] = data['q'].astype('category')
data['q'] = data['q'].cat.reorder_categories(['old', 'ren', 'new'], ordered=True)
data['q'] = data['q'].cat.codes
print(data['q'])

Resultado:

0    0
1    2
2    2
3    1
Name: q, dtype: int8

Usar datos categóricos para operaciones de grupo

Puede usar la media de cada categoría en el pasado (eventos conocidos).

Supongamos que tiene un DataFrame con los últimos precios medios conocidos para las ciudades:

prices = pd.DataFrame(
    'city': ['A', 'A', 'A', 'B', 'B', 'C'],
    'price': [1, 1, 1, 2, 2, 3],
)
mean_price = prices.groupby('city').mean()
data = pd.DataFrame('city': ['A', 'B', 'C', 'A', 'B', 'A'])

print(data.merge(mean_price, on='city', how='left'))

Resultado:

  city  price
0    A      1
1    B      2
2    C      3
3    A      1
4    B      2
5    A      1

Puede utilizar “Codificación ficticia” en este caso. Hay bibliotecas de Python para hacer codificación ficticia, tiene algunas opciones:

  • Puedes utilizar scikit-learn Biblioteca. Échale un vistazo aquí.
  • O, si está trabajando con pandas, tiene una función incorporada para crear variables ficticias.

A continuación se muestra un ejemplo con pandas:

import pandas as pd

sample_data = [[1,2,'a'],[3,4,'b'],[5,6,'c'],[7,8,'b']]
df = pd.DataFrame(sample_data, columns=['numeric1','numeric2','categorical'])
dummies = pd.get_dummies(df.categorical)
df.join(dummies)

En regresión lineal con variables categóricas, debe tener cuidado con la trampa de variable ficticia. La trampa de la variable ficticia es un escenario en el que las variables independientes son multicolineales, un escenario en el que dos o más variables están altamente correlacionadas; en términos simples, una variable se puede predecir a partir de las demás. Esto puede producir la singularidad de un modelo, lo que significa que su modelo simplemente no funcionará. Leer sobre esto aquí

La idea es usar codificación de variable ficticia con drop_first=True, esto omitirá una columna de cada categoría después de convertir la variable categórica en variables ficticias / indicadoras. Ustedes NO pierda cualquier información relevante al hacerlo simplemente porque todo su punto en el conjunto de datos se puede explicar completamente por el resto de las características.

Aquí hay un código completo sobre cómo puede hacerlo para su conjunto de datos de vivienda

Entonces tienes características categóricas:

District, Condition, Material, Security, Type

Y una característica numérica que está tratando de predecir:

Price

Primero debe dividir su conjunto de datos inicial en variables de entrada y predicción, asumiendo que su marco de datos pandas se vería así:

Variables de entrada:

X = housing[['District','Condition','Material','Security','Type']]

Predicción:

Y = housing['Price']

Convierta la variable categórica en variables ficticias / indicadoras y coloque una en cada categoría:

X = pd.get_dummies(data=X, drop_first=True)

Así que ahora si verificas la forma de X con drop_first=True verá que tiene 4 columnas menos, una para cada una de sus variables categóricas.

Ahora puede seguir utilizándolos en su modelo lineal. Para la implementación de scikit-learn, podría verse así:

from sklearn import linear_model
from sklearn.model_selection import train_test_split

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = .20, random_state = 40)

regr = linear_model.LinearRegression() # Do not use fit_intercept = False if you have removed 1 column after dummy encoding
regr.fit(X_train, Y_train)
predicted = regr.predict(X_test)

Te mostramos comentarios y puntuaciones

Eres capaz de patrocinar nuestra tarea dejando un comentario o dejando una puntuación te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *