Тюнинг влфеат СВМ

У меня есть 6 примеров 1 dim данных в качестве примера, и я пытаюсь обучить SVM vlfeat:

data:
    [188.00000000;
      168.00000000;
      191.00000000;
      150.00000000;
      154.00000000;
      124.00000000]

первые 3 образца положительные и последние 3 образца отрицательные.

и я получаю веса (в том числе смещения):

w: -0.6220197226 -0.0002974511

проблема в том, что все выборки прогнозируются как отрицательные, но они явно линейно отделимы.

Для обучения я использую решатель типа VlSvmSolverSgd и lambda 0.01.

Я использую C API, если это имеет значение.

Минимальный рабочий пример:

void vlfeat_svm_test()
{
    vl_size const numData = 6 ;
    vl_size const dimension = 1 ;
    //double x[dimension * numData] = {188.0,168.0,191.0,150.0, 154.0, 124.0};
    double x[dimension * numData] = {188.0/255,168.0/255,191.0/255,150.0/255, 154.0/255, 124.0/255};
    double y[numData] = {1, 1, 1, -1, -1, -1} ;

    double lambda = 0.01;

    VlSvm *svm = vl_svm_new(VlSvmSolverSgd, x, dimension, numData, y, lambda);
    vl_svm_train(svm);

    double const * w= vl_svm_get_model(svm);
    double bias= vl_svm_get_bias(svm);
    for(int k=0;k<numData;++k)
    {
        double res= 0.0;
        for(int i=0;i<dimension;++i)
        {
            res+= x[k*dimension+i]*w[i];
        }
        int pred= ((res+bias)>0)?1:-1;

        cout<< pred <<endl;
    }

    cout << "w: ";
    for(int i=0;i<dimension;++i)
        cout<< w[i] <<" ";
    cout<< bias <<endl;

    vl_svm_delete(svm);
}

Обновить:

Также я попытался масштабировать входные данные путем деления на 255, это не имеет никакого эффекта.

Обновление 2:

Чрезвычайно низкая лямбда = 0.000001, кажется, решает проблему.

1 ответ

Решение

Это происходит потому, что решатели SVM в VLFeat не оценивают модель и смещение напрямую, а используют обходной путь добавления постоянного компонента к данным (как упомянуто в http://www.vlfeat.org/api/svm-fundamentals.html) и вернуть соответствующий вес модели в качестве смещения.

Таким образом, термин смещения является частью регуляризатора, и модели с более высоким смещением "штрафуются" с точки зрения энергии. Этот эффект особенно силен в вашем случае, так как ваши данные чрезвычайно малоразмерны:) Поэтому вам нужно выбрать небольшое значение параметра регуляризации LAMBDA, чтобы снизить важность регуляризатора.

Другие вопросы по тегам