Лабораторная работа №9: Логистическая регрессия и ROC-AUC
Цель: Решить задачу бинарной классификации (предсказание оттока клиентов). Мы разберем работу Логистической регрессии, увидим на практике разницу между L1 и L2 регуляризацией (как L1 обнуляет веса ненужных признаков) и научимся оценивать качество модели с помощью кривой ROC-AUC.
Данные:Telecom Churn Dataset. Данные оператора связи о клиентах: сколько говорят, какие тарифы подключены и ушел ли клиент (Churn).
Часть 1: Подготовка данных (Preprocessing)
Логистическая регрессия — это математическая модель (уравнение плоскости). Она требует:
Чисел: Все категории (“Yes”/“No”, “Kansas”) должны быть закодированы.
Масштаба: Признаки должны быть в одном диапазоне (StandardScaler), иначе регуляризация будет работать неправильно.
Задание 1.1:
Загрузите датасет.
Превратите бинарные признаки (International plan, Voice mail plan) в числа (0 и 1).
Подсказка: Можно использовать .map({'Yes': 1, 'No': 0}) или astype(int) если там булевы значения.
Удалите “мусорные” признаки, которые не влияют на физику процесса: State, Area code, Phone number.
Целевая переменная: Churn.
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns# Загрузка датасетаurl = "[https://raw.githubusercontent.com/yorko/mlcourse.ai/master/data/telecom_churn.csv](https://raw.githubusercontent.com/yorko/mlcourse.ai/master/data/telecom_churn.csv)"df = pd.read_csv(url)# TODO: Преобразуйте 'International plan' и 'Voice mail plan' в числа (0 и 1)# df['International plan'] = ...# df['Voice mail plan'] = ...# TODO: Целевая переменная 'Churn' в этом датасете - bool (True/False). Преобразуйте в int (1/0).# df['Churn'] = ...# TODO: Удалите колонки ['State', 'Area code', 'Phone number']? так как они сложны для OHE и малоинформативны# df = df.drop(..., axis=1)# print(df.info())# print(df.head())
Регуляризация (параметр C) штрафует за большие веса. Если “Минуты разговора” = 300, а “Кол-во звонков” = 5, то вес у “Минут” будет искусственно занижен. Масштабирование выравнивает игру.
Часть 2: Логистическая Регрессия и L1/L2 Регуляризация
В sklearn параметр penalty отвечает за тип регуляризации, а C — за её силу (обратная величина: чем меньше C, тем сильнее штраф).
Задание 2.1: L2 Регуляризация — Стандарт
Обучите модель с penalty='l2'. Это стандартное поведение.
from sklearn.linear_model import LogisticRegression# TODO: Обучите модель (используйте solver='liblinear' для универсальности)# logit_l2 = LogisticRegression(penalty='l2', C=1.0, solver='liblinear', random_state=17)# logit_l2.fit(...)# Выведите accuracy на тесте# print("Accuracy L2:", logit_l2.score(X_test_scaled, y_test))
Задание 2.2: L1 Регуляризация — Отбор признаков
Обучите модель с penalty='l1'. L1 имеет свойство занулять веса слабых признаков.
Используйте C=0.1 (усилим регуляризацию, чтобы увидеть эффект).
# TODO: Обучите модель с L1# logit_l1 = LogisticRegression(penalty='l1', C=0.1, solver='liblinear', random_state=17)# logit_l1.fit(...)# print("Accuracy L1:", logit_l1.score(X_test_scaled, y_test))
Задание 2.3: Визуализация весов (Инсайт)
Сравним веса двух моделей. Посмотрите, сколько весов занулила L1 модель.