machine-learning Лабораторная работа

Лабораторная работа №1: Python Refresher и Векторизация с NumPy

Лабораторная работа №1: Python Refresher и Векторизация с NumPy

Цель: Освежить навыки владения Python и научиться мыслить “векторно”. Мы откажемся от медленных циклов for при работе с числами и перейдем на эффективные операции библиотеки NumPy. Это фундамент для дальнейшей работы с Pandas и моделями машинного обучения.

Инструменты:

  • Python 3 (List comprehensions, lambda)
  • NumPy (Arrays, Broadcasting, Masking)

Часть 1: Python Refresher

В Data Science мы ценим лаконичность. Код должен быть читаемым и компактным.


Часть 2: Введение в NumPy

Списки Python — это медленно и дорого по памяти. Переходим к ndarray.

Важное правило NumPy

Использование циклов for для обхода элементов массива ndarray в NumPy категорически не рекомендуется, так как это сводит на нет все преимущества векторизации и производительности библиотеки.


Часть 3: Broadcasting и Masking

Это “суперсилы” NumPy.

Задание 3.1: Нормализация данных (Min-Max Scaling)

В ML часто нужно приводить признаки к диапазону [0, 1]. Формула: Xnorm=XXminXmaxXminX_{norm} = \frac{X - X_{min}}{X_{max} - X_{min}}

Пусть у нас есть матрица X (10×310 \times 3), где строки — это объекты, а столбцы — признаки (например: Рост, Вес, Возраст).

Задача: Нормализовать каждый столбец отдельно, используя Broadcasting.

np.random.seed(42) # Фиксируем random state для воспроизводимости
X = np.random.randint(0, 100, (10, 3))

print("Исходная матрица X (первые 5 строк):")
print(X[:5])

# TODO: Найдите минимум и максимум ДЛЯ КАЖДОГО СТОЛБЦА (axis=0)
# min_vals = ...
# max_vals = ...

# TODO: Примените формулу Min-Max Scaling (Broadcasting сработает автоматически)
# X_norm = ...

# print("\nНормализованная матрица X_norm (первые 5 строк):")
# print(X_norm[:5])

# Проверка: минимумы столбцов должны стать 0, максимумы 1
# print("\nПроверка (Min/Max столбцов X_norm):")
# print(X_norm.min(axis=0), X_norm.max(axis=0))

Задание 3.2: Фильтрация по условию (Masking)

Вам нужно найти выбросы или отобрать специфические данные.

Задача:

  1. Создайте массив sales из 100 случайных чисел (нормальное распределение: среднее 1000, стд 200).
  2. Найдите все значения, которые отклоняются от среднего более чем на 1.5 стандартных отклонения (выбросы).
  3. Замените эти выбросы на значение среднего (imputation).
sales = np.random.normal(1000, 200, 100)

# TODO: Вычислите границы
mean_val = np.mean(sales)
std_val = np.std(sales)

# TODO: Создайте булеву маску для выбросов ( |x - mean| > 1.5 * std )
# outliers_mask = ...

print(f"Найдено выбросов: {np.sum(outliers_mask)}")

# TODO: Используйте маску для замены значений в sales
# sales_clean = sales.copy()
# sales_clean[...] = ...

# print("Данные очищены.")

🧠 Проверка знаний

Какое преимущество дает использование Broadcasting при нормализации столбцов матрицы (Min-Max Scaling) в NumPy?

Что является результатом применения логического условия к массиву NumPy (например, sales < 1000)?