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:
- Codificación One-Hot para datos categóricos
- Números arbitrarios para datos ordinales
- 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: Resultado: 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: Resultado: Puede utilizar “Codificación ficticia” en este caso. Hay bibliotecas de Python para hacer codificación ficticia, tiene algunas opciones: A continuación se muestra un ejemplo con pandas: 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 Aquí hay un código completo sobre cómo puede hacerlo para su conjunto de datos de vivienda Entonces tienes características categóricas: Y una característica numérica que está tratando de predecir: 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: Predicción: Convierta la variable categórica en variables ficticias / indicadoras y coloque una en cada categoría: Así que ahora si verificas la forma de X con Ahora puede seguir utilizándolos en su modelo lineal. Para la implementación de scikit-learn, podría verse así: Eres capaz de patrocinar nuestra tarea dejando un comentario o dejando una puntuación te lo agradecemos.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'])
0 0
1 2
2 2
3 1
Name: q, dtype: int8
Usar datos categóricos para operaciones de grupo
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'))
city price
0 A 1
1 B 2
2 C 3
3 A 1
4 B 2
5 A 1
scikit-learn
Biblioteca. Échale un vistazo aquí. pandas
, tiene una función incorporada para crear variables ficticias.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)
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. District, Condition, Material, Security, Type
Price
X = housing[['District','Condition','Material','Security','Type']]
Y = housing['Price']
X = pd.get_dummies(data=X, drop_first=True)
drop_first=True
verá que tiene 4 columnas menos, una para cada una de sus variables categóricas. 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