|
Эксперимент с параметром C в логистической регрессии
ОП.10 Машинное обучение
Лабораторная работа №1
Тема: Эксперимент с параметром C в логистической регрессии
Цель работы: Экспериментально исследовать влияние параметра регуляризации C на качество модели логистической регрессии. Подобрать оптимальное значение C для заданного датасета.
Время выполнения: 2 академических часа
Тип работы: Лабораторная (экспериментальное исследование)
ЗАДАНИЕ ДЛЯ СТУДЕНТА
Этап 1. Подготовка данных (10 минут)
Загрузите датасет и разделите его на обучающую и тестовую выборки:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# Загрузка данных
data = load_breast_cancer()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = pd.Series(data.target)
print(f"Размер выборки: {X.shape}")
print(f"Классы: {np.unique(y)}")
print(f"Распределение классов:\n{y.value_counts()}")
# Разделение на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)
print(f"Обучающая выборка: {X_train.shape}")
print(f"Тестовая выборка: {X_test.shape}")
Этап 2. Эксперимент: изменение параметра C (25 минут)
Проведите эксперимент с разными значениями C:
# Значения C для эксперимента (разные порядки)
C_values = [0.001, 0.01, 0.1, 1, 10, 100, 1000]
results = []
for C in C_values:
# Создаём и обучаем модель
model = LogisticRegression(C=C, max_iter=1000, random_state=42)
model.fit(X_train, y_train)
# Предсказания
y_pred = model.predict(X_test)
# Метрики качества
acc = accuracy_score(y_test, y_pred)
prec = precision_score(y_test, y_pred)
rec = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
results.append({
'C': C,
'accuracy': acc,
'precision': prec,
'recall': rec,
'f1_score': f1
})
# Результаты эксперимента
results_df = pd.DataFrame(results)
print("Результаты эксперимента:")
print(results_df)
Задание для анализа:
• При каком значении C accuracy максимальна?
• Как меняется precision при увеличении C?
• Какое значение C даёт лучший баланс метрик?
Этап 3. Визуализация зависимости качества от C (20 минут)
Постройте графики зависимости метрик от параметра C:
# Построение графиков
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.semilogx(results_df['C'], results_df['accuracy'], 'o-', label='Accuracy')
plt.semilogx(results_df['C'], results_df['precision'], 's-', label='Precision')
plt.semilogx(results_df['C'], results_df['recall'], '^-', label='Recall')
plt.semilogx(results_df['C'], results_df['f1_score'], 'd-', label='F1-score')
plt.xlabel('Параметр C (логарифмическая шкала)')
plt.ylabel('Значение метрики')
plt.title('Зависимость качества модели от параметра C')
plt.legend()
plt.grid(True, alpha=0.3)
plt.subplot(1, 2, 2)
plt.semilogx(results_df['C'], results_df['accuracy'], 'o-', linewidth=2, markersize=8)
plt.xlabel('Параметр C (логарифмическая шкала)')
plt.ylabel('Accuracy')
plt.title('Оптимизация параметра C')
plt.axhline(y=results_df['accuracy'].max(), color='r', linestyle='--', label=f"Максимум: {results_df['accuracy'].max():.3f}")
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
Вопросы для анализа:
• При каких значениях C качество модели низкое? Почему?
• На каком интервале значений C качество стабилизируется?
Этап 4. Анализ коэффициентов модели (15 минут)
Исследуйте, как меняются веса признаков при изменении C:
# Обучим модели с разными C
models = {}
for C in [0.001, 0.01, 0.1, 1, 10, 100]:
models[C] = LogisticRegression(C=C, max_iter=1000, random_state=42)
models[C].fit(X_train, y_train)
# Сравним коэффициенты для нескольких признаков
feature_names = X.columns[:5] # первые 5 признаков
coef_data = {'C': []}
for f in feature_names:
coef_data[f] = []
for C, model in models.items():
coef_data['C'].append(C)
for i, f in enumerate(feature_names):
coef_data[f].append(model.coef_[0][i])
coef_df = pd.DataFrame(coef_data)
print("Коэффициенты модели для разных C (первые 5 признаков):")
print(coef_df)
# Визуализация изменения коэффициентов
plt.figure(figsize=(10, 6))
for f in feature_names:
plt.semilogx(coef_df['C'], coef_df[f], 'o-', label=f)
plt.xlabel('Параметр C')
plt.ylabel('Значение коэффициента')
plt.title('Зависимость весов признаков от параметра C')
plt.legend(bbox_to_anchor=(1.05, 1))
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
Вопросы для анализа:
• Что происходит с коэффициентами при маленьких значениях C?
• Что происходит с коэффициентами при больших значениях C?
Этап 5. Выводы по лабораторной работе (10 минут)
Оформите отчёт, включив в него:
1. Таблицу с метриками качества для всех значений C
2. Графики зависимости метрик от C
3. Ответы на вопросы:
- Какое значение C оптимально для данного датасета?
- Как параметр C влияет на переобучение/недообучение?
- Почему при очень маленьких и очень больших C качество падает?
4. Вывод о выборе параметра регуляризации C
КРИТЕРИИ ОЦЕНКИ
| Критерий | Макс. балл |
|---|
| Эксперимент проведён для всех значений C | 3 | | Графики построены и проанализированы | 3 | | Анализ коэффициентов выполнен | 2 | | Выводы обоснованы и полные | 2 | | Итого | 10 |
ОТВЕТ ДЛЯ ПРЕПОДАВАТЕЛЯ (эталонный результат)
Нажмите, чтобы увидеть ответы
Этап 2. Оптимальное значение C:
• Accuracy максимальна при C=1 или C=10 (≈0.98)
• При C=0.001 качество низкое (недообучение)
• При C=1000 качество может немного снижаться
Этап 3. Анализ графиков:
• При C < 0.01: модель недообучена (коэффициенты слишком маленькие)
• При C от 0.1 до 100: модель работает стабильно
• При C > 1000: возможно небольшое переобучение
Этап 4. Анализ коэффициентов:
• При маленьких C: коэффициенты близки к нулю (сильная регуляризация)
• При больших C: коэффициенты растут (слабая регуляризация)
Этап 5. Вывод:
Оптимальное значение C для данного датасета находится в диапазоне [0.1, 10]. Рекомендуемое значение C=1 даёт лучший баланс между качеством и обобщающей способностью.
Автор: УМК СПО
Лицензия: Бесплатное использование с указанием источника
|
|
|