Реализация логистической регрессии не работает - PullRequest
1 голос
/ 08 мая 2019

Недавно я читал о машинном обучении, одним из которых является логистическая регрессия. После прочтения, чтобы проверить мое понимание, я попытался реализовать LR в Java. Когда я тестировал его на логическом ИЛИ и логическом И, это, казалось, работало. Но когда я попробовал это на оценках, чтобы принять решение о приеме или отклонении претендентов на работу, он не научился классифицировать его. Можете ли вы определить, что не так в этом коде?

public class LogisticRegression {

int featureLength;
ArrayList<Double> inputs = new ArrayList();
int targetOutput;
ArrayList<Double> weights = new ArrayList();
double bias;
static double learningRate = 0.1;

LogisticRegression(int fs) {
    featureLength = fs;
    for (int i = 0; i < featureLength; i++) {
        weights.add(Math.random());
    }

    bias = Math.random();
}

double sigmoidFunction(double x) {
    return 1.0 / (1.0 + Math.exp(-x));
}

double weightedSum() {
    if (inputs.size() != featureLength) {
        System.out.println("Error: input does not match feature length");
        System.exit(0);
    }

    double sum = 0;
    for (int i = 0; i < featureLength; i++) {
        double inp = inputs.get(i);
        double wh = weights.get(i);
        sum += inp * wh;
    }

    sum += bias;
    double out = sigmoidFunction(sum);
    return out;
}

void learn() {
    double inp, wh, out, gradient;
    out = weightedSum();
    for (int i = 0; i < featureLength; i++) {
        inp = inputs.get(i);
        wh = weights.get(i);
        gradient = (out - (double) targetOutput) * inp;
        wh -= learningRate * gradient;
        weights.set(i, wh);
    }

    //update bias
    gradient = (out - targetOutput) * 1;
    bias -= learningRate * gradient;
}

Я тестировал его на этом наборе данных

1 Ответ

1 голос
/ 09 мая 2019

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

  • Модель проста (или набор данных слишком сложен)

  • Ваш вес неверно аппроксимирован

Первая проблема может быть решена путем увеличения емкости / сложности вашей модели (с LR это невозможно) или выбора более сложной. Одна из проблем LR состоит в том, что он может обрабатывать только правильно линейно разделимые данные, в противном случае у него будут проблемы с предоставлением правильных прогнозов (например, XOR не является линейно разделимым).

Чтобы решить вторую проблему, вы можете использовать другой метод, кроме градиентного спуска, для расчета значения весов. Хотя, если вы хотите использовать градиентный спуск, вы должны настроить некоторые гиперпараметры Градиентный спуск работает, пытаясь найти глобальные минимумы функции потерь / затрат, это означает, что он пытается найти правильный ответ, делая маленькие шаги в направлении с самым крутым наклоном. Чтобы лучше приблизиться к весам, вы можете понизить скорость обучения (для этого потребуется больше итераций). Вы также можете изменить тип инициализации для весов, лучшая отправная точка означает более быструю сходимость. Наконец, вы можете изменить функцию потери.

Надеюсь, что поможет!

...