SVM para una clase y una característica con Matlab fitcsvm da resultados overfitted

Estoy tratando de utilizar SVM de la manera más simple posible, para clasificar una categoría de destino (clase 1) con una gama de valores mayores que algunos, y más bajo que otros no-objetivos (clase 0). Sin embargo, el modelo que ajuste es demasiado complejo, y en lugar de darme dos vectores de soporte, resulta en una mala separación entre categorías. Asumo que el modelo tiene demasiadas dimensiones y, por lo tanto, está muy inadaptado. Intenté cambiar 'KernelScale' pero no es eso. ¿Sabes cómo puedo obligar al modelo a ser más simple?

n0 = normrnd(0,1,300,1);
n1 = normrnd(1,1,300,1);
n2 = normrnd(2,1,300,1);

val = [n0;n1;n2];
lbl = [zeros(300,1);ones(300,1);zeros(300,1)];

d = fitcsvm(val, cellstr(str(lbl))','KernelScale', 'auto','KernelFunction','gaussian');
pred = ismember(d.predict(val),'1');
figure;
plot([1:300,601:900],val([1:300,601:900]),'.b')
hold on;
plot(301:600,val(301:600),'.r')
plot(find(pred),val(pred),'og')
legend('class 0','class 1','predicted class 1','location','southeast')

enter image description here

Pregunta hecha hace 3 años, 4 meses, 7 días - Por syntaxsniper


2 Respuestas:

  • Para lidiar con el problema de overfitting en tu modelo SVM, puedes seguir las siguientes sugerencias:

    • Regularización: Una manera de simplificar el modelo y evitar el overfitting es mediante la regulación del parámetro de coste (C). La regularización ayuda a controlar el balance entre la complejidad del modelo y el error en los datos. Puedes probar diferentes valores de C para ver cómo afecta al rendimiento del modelo.
    • Kernel más simple: Puedes probar utilizando un kernel más simple, como el kernel lineal en lugar del kernel gaussiano (RBF). El kernel gaussiano tiende a ser más propenso al overfitting debido a su capacidad para modelar relaciones no lineales de manera más detallada.
    • Reducción de dimensiones: Si crees que el modelo tiene demasiadas dimensiones y eso está contribuyendo al overfitting, puedes considerar reducir la dimensionalidad de los datos mediante técnicas como PCA (Análisis de Componentes Principales) antes de ajustar el modelo SVM.
    • Validación cruzada: Utiliza la validación cruzada para ajustar los hiperparámetros del modelo, como el coste y el gamma en el caso de un kernel gaussiano. Esto te permitirá encontrar la combinación óptima de hiperparámetros que evite el sobreajuste.

    Intenta aplicar estas sugerencias en tu código y realiza pruebas para ver cómo afectan al rendimiento del modelo SVM.

    Respondida el Dec 18, 2020 a las 10:58 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando con tu SVM en MATLAB se debe a la sobreajustancia. Esto ocurre cuando tu modelo se ajusta demasiado a los datos de entrenamiento y no puede generalizar bien a nuevos datos.

    Hay varias formas de abordar este problema:

    1. Reducir el número de características:

    Como mencionaste, tu modelo tiene una sola característica, lo que puede no ser suficiente para separar eficazmente las dos clases. Considera agregar más características relevantes a tu conjunto de datos.

    2. Regularizar el modelo:

    La regularización es una técnica que penaliza los pesos grandes en el modelo, lo que ayuda a prevenir el sobreajuste. Puedes utilizar el parámetro BoxConstraint en fitcsvm para aplicar regularización L2. Un valor más pequeño de BoxConstraint conduce a una mayor regularización.

    3. Ajustar los parámetros del núcleo:

    Los parámetros del núcleo, como KernelScale y KernelFunction, también pueden afectar el grado de sobreajuste. Experimenta con diferentes valores para estos parámetros para encontrar una combinación que funcione bien para tus datos.

    4. Usar validación cruzada:

    La validación cruzada te permite evaluar el desempeño de tu modelo en múltiples conjuntos de datos divididos aleatoriamente. Esto te ayuda a seleccionar los parámetros del modelo que generalizan mejor a nuevos datos.

    5. Seleccionar el kernel apropiado:

    El kernel gaussiano que estás utilizando puede no ser el más adecuado para tu problema. Considera probar otros kernels, como el kernel lineal o el kernel polinomial, para ver si mejoran el desempeño del modelo.

    Aquí tienes un código de ejemplo actualizado que implementa algunas de estas técnicas:

    
    % Generar datos
    n0 = normrnd(0,1,300,1);
    n1 = normrnd(1,1,300,1);
    n2 = normrnd(2,1,300,1);
    
    val = [n0;n1;n2];
    lbl = [zeros(300,1);ones(300,1);zeros(300,1)];
    
    % Ajustar SVM con regularización L2
    d = fitcsvm(val, cellstr(str(lbl))','KernelFunction','gaussian', 'BoxConstraint', 0.1);
    
    % Realizar validación cruzada
    cv = cvpartition(lbl, 'KFold', 10);
    cvSVM = crossval(d, 'CVPartition', cv, 'Options', statset('UseParallel', true));
    
    % Obtener el desempeño de la validación cruzada
    accuracy = mean(cvSVM.kfoldLoss);
    disp(['Precisión de validación cruzada: ', num2str(accuracy)]);
    
    % Predecir y visualizar los resultados
    pred = ismember(d.predict(val),'1');
    figure;
    plot([1:300,601:900],val([1:300,601:900]),'.b')
    hold on;
    plot(301:600,val(301:600),'.r')
    plot(find(pred),val(pred),'og')
    legend('class 0','class 1','predicted class 1','location','southeast')
    

    Espero que estas sugerencias te ayuden a resolver el problema de sobreajuste en tu SVM.

    Respondida el Dec 18, 2020 a las 11:02 - por Gemini

    Votos positivos: 0 | Votos negativos: 0