НачатьНачать бесплатно

Алгоритм логистической регрессии

Давайте разберём внутреннее устройство логистической регрессии и реализуем её алгоритм самостоятельно. Поскольку функция logit() из statsmodels устроена очень сложно, мы ограничимся реализацией простой логистической регрессии для одного конкретного набора данных.

Вместо суммы квадратов в качестве метрики будем использовать правдоподобие. Однако логарифмическое правдоподобие вычислительно более устойчиво, поэтому воспользуемся им. Есть ещё один нюанс: поскольку нам нужно максимизировать логарифмическое правдоподобие, а функция minimize() по умолчанию ищет минимум, удобнее вычислять отрицательное логарифмическое правдоподобие.

Логарифмическое правдоподобие для каждого наблюдения вычисляется по формуле: $$ log(y_{pred}) * y_{actual} + log(1 - y_{pred}) * (1 - y_{actual}) $$

Итоговая метрика — это отрицательная сумма всех вкладов логарифмического правдоподобия.

Значения объясняющей переменной (столбец time_since_last_purchase из churn) доступны как x_actual. Значения целевой переменной (столбец has_churned из churn) доступны как y_actual. Из scipy.stats импортирована функция logistic, а также загружены logit() и minimize().

Это упражнение является частью курса

Промежуточная регрессия со statsmodels в Python

Посмотреть курс

Интерактивное практическое упражнение

Попробуйте выполнить это упражнение, дополнив этот пример кода.

# Complete the function
def calc_neg_log_likelihood(coeffs):
    # Unpack coeffs
    ____, ____ = ____
    # Calculate predicted y-values
    y_pred = ____
    # Calculate log-likelihood
    log_likelihood = ____
    # Calculate negative sum of log_likelihood
    neg_sum_ll = ____
    # Return negative sum of log_likelihood
    return ____

# Test the function with intercept 10 and slope 1
print(calc_neg_log_likelihood([10, 1]))
Редактировать и запускать код