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

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

👀 Загрузка...

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

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

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

Часть 1: Python Refresher

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

Задание 1.1: Дан список "сырых" строк (например, названия файлов или столбцов CSV).

Задача:

  1. Привести все строки к нижнему регистру.
  2. Удалить пробелы в начале и конце.
  3. Оставить только те строки, которые содержат подстроку data.
  4. Сделать это одной строкой кода, используя List Comprehension.
import numpy as np
 
raw_files = [
    "  Log_Data_2023.csv  ",
    "image_001.jpg",
    "  CONFIG.XML ",
    "data_preprocessing.py",
    "Sales_Data_Final.xlsx",
    "readme.md"
]
 
# TODO: Ваш код здесь. Результат сохраните в clean_files
# clean_files = ...
 
print(f"Исходный список: {raw_files}")
# Ожидаемый результат: ['log_data_2023.csv', 'data_preprocessing.py', 'sales_data_final.xlsx']
# print(f"Обработанный список: {clean_files}")

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

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

Задание 2.1: Создание массивов и формы

Задача:

  1. Создайте матрицу A размера 10×510 \times 5, заполненную случайными числами (используйте np.random.rand).
  2. Создайте матрицу B, состоящую только из единиц, такого же размера, как A.
  3. Выведите атрибуты shape, size и dtype матрицы A.
# TODO: Ваш код здесь
# A = ...
# B = ...
 
# print(f"Shape: {A.shape}")
# print(f"Size: {A.size}")
# print(f"Dtype: {A.dtype}")

Важное правило 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)?