ОП.10 Машинное обучение
Практическая работа №1
Тема: Введение в scikit-learn. Загрузка данных и разбиение на выборки
Цель работы: Научиться загружать встроенные датасеты scikit-learn, выполнять разбиение на обучающую и тестовую выборки, проводить базовую нормализацию данных.
Время выполнения: 2 академических часа
Инструменты: Python + Jupyter Notebook, sklearn, pandas, numpy
ЗАДАНИЕ ДЛЯ СТУДЕНТА
Этап 1. Загрузка встроенных датасетов (10 минут)
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris, load_wine, load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# Загрузка датасета Iris
iris = load_iris()
print("Датасет Iris:")
print(f"Количество образцов: {len(iris.data)}")
print(f"Количество признаков: {iris.data.shape[1]}")
print(f"Названия признаков: {iris.feature_names}")
print(f"Классы: {iris.target_names}")
print(f"Первые 5 строк:\n{iris.data[:5]}")
# Загрузка датасета Wine
wine = load_wine()
print("\nДатасет Wine:")
print(f"Количество образцов: {len(wine.data)}")
print(f"Количество признаков: {wine.data.shape[1]}")
print(f"Классы: {wine.target_names}")
# Загрузка датасета Breast Cancer
cancer = load_breast_cancer()
print("\nДатасет Breast Cancer:")
print(f"Количество образцов: {len(cancer.data)}")
print(f"Количество признаков: {cancer.data.shape[1]}")
print(f"Классы: {cancer.target_names}")
Этап 2. Разбиение на обучающую и тестовую выборки (15 минут)
# Разбиение с разными параметрами
X = iris.data
y = iris.target
# Вариант 1: стандартное разбиение 70/30
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
print(f"Стандартное разбиение (70/30):")
print(f"Обучающая выборка: {X_train.shape}")
print(f"Тестовая выборка: {X_test.shape}")
# Вариант 2: стратифицированное разбиение (сохраняет пропорции классов)
X_train_strat, X_test_strat, y_train_strat, y_test_strat = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)
print(f"\nСтратифицированное разбиение:")
print(f"Распределение классов в обучении: {np.bincount(y_train_strat)}")
print(f"Распределение классов в тесте: {np.bincount(y_test_strat)}")
# Вариант 3: разное соотношение выборок
splits = [0.1, 0.2, 0.3, 0.4, 0.5]
for test_size in splits:
_, X_test_temp, _, _ = train_test_split(X, y, test_size=test_size, random_state=42)
print(f"test_size={test_size}: тестовая выборка = {len(X_test_temp)} образцов")
Вопрос: Зачем нужно стратифицированное разбиение? В каких случаях оно критически важно?
Этап 3. Нормализация данных (15 минут)
# Стандартизация (StandardScaler)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print("До нормализации:")
print(f"Среднее: {X.mean(axis=0)[:5]}")
print(f"Стандартное отклонение: {X.std(axis=0)[:5]}")
print("\nПосле стандартизации:")
print(f"Среднее: {X_scaled.mean(axis=0)[:5]}")
print(f"Стандартное отклонение: {X_scaled.std(axis=0)[:5]}")
# Нормализация в диапазон [0, 1]
from sklearn.preprocessing import MinMaxScaler
minmax_scaler = MinMaxScaler()
X_minmax = minmax_scaler.fit_transform(X)
print("\nПосле MinMax нормализации:")
print(f"Минимумы: {X_minmax.min(axis=0)[:5]}")
print(f"Максимумы: {X_minmax.max(axis=0)[:5]}")
Вопрос: В чём разница между StandardScaler и MinMaxScaler? Когда какой применять?
Этап 4. Создание DataFrame для удобного анализа (10 минут)
# Преобразование в DataFrame
iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)
iris_df['target'] = iris.target
iris_df['target_name'] = iris_df['target'].map({i: name for i, name in enumerate(iris.target_names)})
print("Первые 10 строк DataFrame:")
print(iris_df.head(10))
print("\nСтатистика по классам:")
print(iris_df.groupby('target_name')['sepal length (cm)'].describe())
Вопрос: Какой класс ирисов имеет наибольшую длину чашелистика?
Этап 5. Практическое задание (15 минут)
# Загрузка датасета о диабете
from sklearn.datasets import load_diabetes
diabetes = load_diabetes()
# Задание 1: Выведите информацию о датасете
print("Датасет Diabetes:")
print(f"Размер: {diabetes.data.shape}")
print(f"Признаки: {diabetes.feature_names}")
# Задание 2: Разбейте данные на train/test (80/20) со стратификацией
X = diabetes.data
y = diabetes.target
# Для регрессии stratify не используется
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# Задание 3: Примените нормализацию к обучающей выборке
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test) # используем параметры из обучения
print(f"Обучающая выборка после нормализации: среднее = {X_train_scaled.mean():.3f}")
print(f"Тестовая выборка после нормализации: среднее = {X_test_scaled.mean():.3f}")
# Задание 4: Создайте DataFrame с признаками и целевой переменной
diabetes_df = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)
diabetes_df['target'] = diabetes.target
print(diabetes_df.head())
Этап 6. Выводы (10 минут)
Напишите вывод, ответив на вопросы:
1. Какие датасеты встроены в scikit-learn? Для каких задач они используются?
2. Как разбиение данных влияет на оценку качества модели?
3. Почему нормализацию нужно выполнять после разбиения на выборки?
КРИТЕРИИ ОЦЕНКИ
| Критерий | Макс. балл |
|---|
| Все этапы выполнены | 3 | |
Разбиение на выборки корректно | 3 | |
| Нормализация выполнена верно | 2 | | Выводы осмысленные | 2 | | Итого | 10 |
Автор: УМК СПО
Лицензия: Бесплатное использование с указанием источника
|