Muy buenas, les saluda Miguel y hoy les traigo otro post.
Cómo utilizar SVM en problemas de regresión
Es un error común pensar que las máquinas de vectores de soporte solo son útiles para resolver problemas de clasificación.
El propósito de usar SVM para problemas de regresión es definir un hiperplano como en la imagen de arriba, y ajustar tantas instancias como sea posible dentro de este hiperplano y al mismo tiempo limitar las violaciones de los márgenes.
De esta manera, las SVM utilizadas de esta manera difieren de las tareas de clasificación, donde el objetivo es ajustar el hiperplano más grande posible entre dos clases separadas (al mismo tiempo que se limitan las violaciones de los márgenes).
De hecho, las SVM pueden manejar el modelado de regresión con bastante eficacia. Tomemos como ejemplo las reservas de hotel.
Suponga que estamos construyendo un modelo de regresión para predecir la tarifa diaria promedio (o tarifa que un cliente paga en promedio por día) por una reserva de hotel. Un modelo se construye con las siguientes características:
- Cancelación (si un cliente cancela su reserva o no)
- País de origen
- Segmento de mercado
- Tipo de depósito
- tipo de cliente
- Espacios de estacionamiento de automóviles requeridos
- Semana de llegada
Tenga en cuenta que los valores de ADR también se completan para los clientes que cancelaron; la variable de respuesta en este caso refleja el ADR que se habría pagado si el cliente hubiera procedido con la reserva.
Se puede acceder al estudio original de Antonio, Almeida y Nunes (2016) en la sección Referencias a continuación.
Utilizando las características descritas anteriormente, el modelo SVM se entrena y valida en el conjunto de entrenamiento (H1), con las predicciones comparadas con los valores reales de ADR en el conjunto de prueba (H2).
El modelo se entrena de la siguiente manera:
>>> from sklearn.svm import LinearSVR >>> svm_reg = LinearSVR(epsilon=1.5) >>> svm_reg.fit(X_train, y_train)LinearSVR(C=1.0, dual=True, epsilon=1.5, fit_intercept=True, intercept_scaling=1.0, loss='epsilon_insensitive', max_iter=1000, random_state=None, tol=0.0001, verbose=0)>>> predictions = svm_reg.predict(X_val) >>> predictionsarray([100.75090575, 109.08222631, 79.81544167, ..., 94.50700112, 55.65495607, 65.5248653 ])
Ahora, se usa el mismo modelo en las características del conjunto de prueba para generar valores ADR predichos:
bpred = svm_reg.predict(atest) bpred
Comparemos el ADR predicho con el ADR real sobre la base del error absoluto medio (MAE) y el error cuadrático medio (RMSE).
>>> mean_absolute_error(btest, bpred) 29.50931462735928>>> print('mse (sklearn): ', mean_squared_error(btest,bpred)) >>> math.sqrt(mean_squared_error(btest, bpred)) 44.60420935095296
Tenga en cuenta que la sensibilidad de la SVM a instancias de entrenamiento adicionales la establece el épsilon (ϵ) parámetro, es decir, cuanto mayor sea el parámetro, mayor impacto tendrán las instancias de entrenamiento adicionales en los resultados del modelo.
En este caso, un gran margen de 1,5 se utilizó. Aquí está el rendimiento del modelo cuando un margen de 0,5 se utiliza.
>>> mean_absolute_error(btest, bpred)29.622491512816826>>> print('mse (sklearn): ', mean_squared_error(btest,bpred)) >>> math.sqrt(mean_squared_error(btest, bpred))44.7963000500928
Podemos ver que virtualmente no ha habido ningún cambio en los parámetros MAE o RMSE mediante la modificación del ϵ parámetro.
Dicho esto, queremos asegurarnos de que el modelo SVM no esté sobreajustado. Específicamente, si encontramos que el mejor ajuste se logra cuando ϵ = 0, entonces esto podría ser una señal de que el modelo está sobreajustado.
Estos son los resultados cuando establecemos ϵ = 0.
Dado que no vemos una mayor precisión cuando ϵ = 0, no parece haber ninguna evidencia de que el sobreajuste sea un problema en nuestro modelo, al menos no desde este punto de vista.
Cuando se utilizan las mismas funciones, ¿cómo se compara la precisión del rendimiento de SVM con la de una red neuronal?
Considere la siguiente configuración de red neuronal:
>>> model = Sequential() >>> model.add(Dense(8, input_dim=8, kernel_initializer='normal', activation='elu')) >>> model.add(Dense(1669, activation='elu')) >>> model.add(Dense(1, activation='linear')) >>> model.summary()Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) (None, 8) 72 _________________________________________________________________ dense_1 (Dense) (None, 1669) 15021 _________________________________________________________________ dense_2 (Dense) (None, 1) 1670 ================================================================= Total params: 16,763 Trainable params: 16,763 Non-trainable params: 0 _________________________________________________________________
El modelo está entrenado en 30 épocas con un tamaño de lote de 150:
>>> model.compile(loss='mse', optimizer='adam', metrics=['mse','mae']) >>> history=model.fit(X_train, y_train, epochs=30, batch_size=150, verbose=1, validation_split=0.2) >>> predictions = model.predict(X_test)
Los siguientes MAE y RMSE se obtienen en el equipo de prueba:
Observamos que cuando ϵ estaba configurado para 1,5 para el modelo SVM, el MAE y RMSE llegaron a 29,5 y 44,6 respectivamente. En este sentido, el SVM ha igualado a la red neuronal en precisión de predicción en el conjunto de prueba.
Es un error común pensar que las SVM solo son adecuadas para trabajar con datos de clasificación.
Sin embargo, hemos visto en este ejemplo que el modelo SVM ha sido bastante eficaz para predecir los valores de ADR para la red neuronal.
Muchas gracias por leer y agradecemos cualquier pregunta o comentario.
El repositorio de GitHub para este ejemplo, así como otras referencias relevantes, están disponibles a continuación.
Descargo de responsabilidad: este artículo está escrito «tal cual» y sin garantía. Fue escrito con la intención de proporcionar una descripción general de los conceptos de la ciencia de datos y no debe interpretarse como asesoramiento profesional de ninguna manera.
Gracias por leer hasta el final.
Añadir comentario