Кейс 1. Логистическая регрессия для оттока клиентов
Pure PHP: обучение логистической регрессии
Каждый пользователь описывается тремя признаками:
x = [logins, avgSession, daysFromSignup]
Целевая переменная y равна 1, если пользователь ушел, и 0 иначе.
function sigmoid(float $z): float
{
return 1.0 / (1.0 + exp(-$z));
}
function dot(array $a, array $b): float
{
$sum = 0.0;
foreach ($a as $i => $v) {
$sum += $v * $b[$i];
}
return $sum;
}
$X = [
[1.0, 5.2, 30.0],
[12.0, 15.1, 400.0],
[3.0, 4.8, 60.0],
[20.0, 25.0, 800.0],
];
$y = [1, 0, 1, 0];
$weights = [0.0, 0.0, 0.0];
$bias = 0.0;
$learningRate = 0.01;
$epochs = 1000;
for ($epoch = 0; $epoch < $epochs; $epoch++) {
foreach ($X as $i => $x) {
$z = dot($weights, $x) + $bias;
$p = sigmoid($z);
// градиент log loss
$error = $p - $y[$i];
foreach ($weights as $j => $w) {
$weights[$j] -= $learningRate * $error * $x[$j];
}
$bias -= $learningRate * $error;
}
}
$newUser = [5.0, 7.0, 120.0];
$probability = sigmoid(dot($weights, $newUser) + $bias);
echo "Вероятность ухода: " . round($probability, 3) . PHP_EOL;Этот пример намеренно прост. Он показывает, что логистическая регрессия – это линейная модель плюс сигмоида и правильная функция потерь.
RubixML: тот же кейс короче и практичнее
В реальных проектах удобнее использовать готовые реализации.
RubixML скрывает детали оптимизации, но концептуально это та же самая модель: линейная комбинация признаков, сигмоида и decision boundary.
Визуализация decision boundary для кейса оттока
Чтобы сделать поведение модели наглядным, полезно временно упростить задачу и оставить только два признака. Например:
– количество входов за последний месяц,
– число дней с момента регистрации.
Среднюю длительность сессии можно зафиксировать или исключить из визуализации. Тогда каждый пользователь становится точкой на плоскости признаков.
В этом случае decision boundary логистической регрессии задается уравнением:
w₁·x₁ + w₂·x₂ + b = 0
Геометрически это прямая, которая делит пространство на две области. По одну сторону находятся пользователи с вероятностью ухода больше 0.5, по другую – с вероятностью меньше 0.5.
Важно подчеркнуть: хотя граница линейна, вероятность меняется плавно. Чем дальше точка от границы, тем увереннее модель в своем прогнозе.
[IMAGE 4: churn_decision_boundary]
Промпт для изображения
“Двумерный scatter plot пользователей сервиса подписки. Ось X – количество входов за месяц, ось Y – дни с момента регистрации. Точки двух классов: ушел (красные) и остался (синие). Прямая decision boundary логистической регрессии. Полупрозрачный градиент вероятности по обе стороны линии. Учебный стиль, чистый белый фон.”
Такая визуализация хорошо иллюстрирует ключевую идею логистической регрессии: модель линейно разделяет пространство признаков, но результат интерпретируется через вероятность, а не через жесткое правило.
В более высоких размерностях decision boundary перестает быть линией, но логика остается той же – это гиперплоскость в пространстве признаков.
Last updated