УМК СПО

Учебно-методические комплексы

для преподавателей СПО








Введение в scikit-learn. Загрузка данных и разбиение на выборки

ОП.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


Автор: УМК СПО
Лицензия: Бесплатное использование с указанием источника





Логин: Пароль: Забыли пароль?Регистрация

Самозанятый: Стешенко Светлана Николаевна ИНН: 231408226339

Актуальная версия — 2026
Сайт сделан на SiNG cms © 2010-2020