Предварительная обработка данных в Scikit-learn

scikit-learnBeginner
Практиковаться сейчас

Введение

Добро пожаловать в лабораторию по предварительной обработке данных scikit-learn. В машинном обучении качество ваших данных напрямую влияет на производительность вашей модели. Необработанные данные часто бывают "грязными", непоследовательными и не в оптимальном формате для алгоритмов. Предварительная обработка данных — это критически важный этап, который включает очистку и преобразование данных, чтобы сделать их пригодными для модели машинного обучения.

В этой лаборатории вы научитесь выполнять две основные задачи предварительной обработки с использованием библиотеки scikit-learn:

  • Масштабирование признаков (Feature Scaling): Стандартизация диапазона независимых переменных или признаков данных.
  • Кодирование меток (Label Encoding): Преобразование категориальных меток в числовой формат.

Мы будем использовать знаменитый набор данных Iris, который удобно включен в scikit-learn, для отработки этих методов. К концу этой лаборатории вы получите твердое понимание того, как подготовить ваши данные для конвейеров машинного обучения (machine learning pipelines).

Разделите данные на признаки и целевую переменную: X = iris.data, y = iris.target

На этом шаге мы начнем с загрузки набора данных Iris и его разделения на признаки и целевую переменную. В машинном обучении X — это общепринятое обозначение для признаков (входных переменных), а y — обозначение для целевой переменной (выходной переменной, которую вы хотите предсказать).

Библиотека scikit-learn предоставляет набор данных Iris через свой модуль datasets. Загруженный объект набора данных ведет себя как словарь.

Структура набора данных Iris:

  • iris.data: Матрица признаков (150 образцов × 4 признака)
  • iris.target: Метки целевой переменной (150 образцов)
  • iris.feature_names: Названия 4 признаков
  • iris.target_names: Названия 3 видов цветов

Зачем разделять X и y?

  • X: Входные признаки (то, на чем учится модель)
  • y: Метки целевой переменной (то, что предсказывает модель)
  • Это стандартное соглашение в машинном обучении

Сначала откройте файл preprocess.py, расположенный в каталоге ~/project, с помощью файлового менеджера слева. Мы добавим наш код в этот файл.

Добавьте следующие строки под комментарием ## --- Step 1: Split data ---, чтобы присвоить признаки и целевую переменную переменным X и y соответственно. Мы также выведем их размеры для проверки.

## --- Step 1: Split data ---
X = iris.data
y = iris.target

print("Shape of features (X):", X.shape)
print("Shape of target (y):", y.shape)

Теперь сохраните файл и запустите его из терминала, чтобы увидеть вывод.

python3 preprocess.py

Вы должны увидеть следующий вывод, который указывает на то, что у нас есть 150 образцов и 4 признака, а также 150 соответствующих меток целевой переменной.

Shape of features (X): (150, 4)
Shape of target (y): (150,)

Масштабируйте признаки с помощью StandardScaler из sklearn.preprocessing

На этом шаге мы подготовимся к масштабированию наших признаков. Масштабирование признаков является распространенным требованием для многих алгоритмов машинного обучения, поскольку они могут быть чувствительны к масштабу входных признаков. StandardScaler — это популярный метод, который стандартизирует признаки, удаляя среднее значение и масштабируя их до единичной дисперсии.

Как работает StandardScaler:

  • Формула: z = (x - u) / s, где u — среднее значение обучающих выборок, а s — стандартное отклонение
  • Эффект: Преобразует данные так, чтобы среднее значение было равно 0, а стандартное отклонение — 1
  • Преимущества: Предотвращает доминирование признаков с большим масштабом в процессе обучения

Ключевые параметры StandardScaler:

  • with_mean=True (по умолчанию): Центрирует данные, удаляя среднее значение
  • with_std=True (по умолчанию): Масштабирует данные, деля на стандартное отклонение

Мы будем использовать StandardScaler из sklearn.preprocessing. Первая часть процесса — создание экземпляра масштабировщика (scaler).

В вашем файле preprocess.py добавьте следующий код под комментарием ## --- Step 2: Initialize the scaler ---, чтобы создать экземпляр StandardScaler.

## --- Step 2: Initialize the scaler ---
scaler = StandardScaler()

print("Scaler object created:", scaler)

Сохраните файл и запустите его снова.

python3 preprocess.py

Вывод теперь будет включать строку, подтверждающую успешное создание объекта StandardScaler.

Shape of features (X): (150, 4)
Shape of target (y): (150,)
Scaler object created: StandardScaler()

Обучите масштабировщик с помощью scaler.fit(X)

На этом шаге мы обучим StandardScaler на наших данных признаков X. Метод fit() является фундаментальным понятием в scikit-learn.

Что делает fit():

  • Вычисляет необходимые статистические данные (среднее значение и стандартное отклонение) из обучающих данных
  • Сохраняет эти параметры внутри объекта для последующего использования
  • Важно: Только изучает данные, не преобразует их

Почему разделены fit() и transform()?

  • Обучение только на обучающих данных: Предотвращает утечку данных, изучая параметры только из обучающего набора
  • Применение к любым данным: Может преобразовывать как обучающие, так и тестовые данные, используя те же изученные параметры
  • Согласованность: Гарантирует, что одинаковое преобразование применяется ко всем данным

Лучшая практика в реальных условиях:

  • scaler.fit(X_train) — Изучение параметров только из обучающих данных
  • X_train_scaled = scaler.transform(X_train) — Преобразование обучающих данных
  • X_test_scaled = scaler.transform(X_test) — Преобразование тестовых данных с теми же параметрами

Добавьте следующий код в ваш файл preprocess.py под комментарием ## --- Step 3: Fit the scaler ---. Мы также выведем атрибут mean_ масштабировщика, чтобы увидеть, что он изучил.

## --- Step 3: Fit the scaler ---
scaler.fit(X)

print("Scaler mean:", scaler.mean_)

Сохраните файл и выполните его.

python3 preprocess.py

Вывод теперь покажет среднее значение для каждого из четырех признаков, которое масштабировщик вычислил из данных.

Shape of features (X): (150, 4)
Shape of target (y): (150,)
Scaler object created: StandardScaler()
Scaler mean: [5.84333333 3.05733333 3.758      1.19933333]

Преобразуйте данные с помощью scaler.transform(X)

На этом шаге мы используем обученный масштабировщик для преобразования наших данных. Метод transform() применяет масштабирующее преобразование к данным, используя среднее значение и стандартное отклонение, рассчитанные на этапе fit(). Это центрирует наши данные вокруг среднего значения 0 со стандартным отклонением 1.

Мы сохраним преобразованные данные в новой переменной X_scaled, чтобы сохранить исходные данные без изменений.

Понимание кода:

  • X_scaled = scaler.transform(X): Применяет изученное преобразование к нашим данным
  • np.set_printoptions(precision=2, suppress=True): Форматирует вывод для лучшей читаемости
    • precision=2: Отображает 2 знака после запятой
    • suppress=True: Использует научную нотацию для очень маленьких/больших чисел
  • np.mean(X, axis=0): Вычисляет среднее значение вдоль оси 0 (столбцов)
    • axis=0: Вычисляет среднее значение для каждого признака (столбца) по всем выборкам
    • Результат: Одно значение среднего для каждого признака

Добавьте следующий код в ваш файл preprocess.py под комментарием ## --- Step 4: Transform the data ---. Мы выведем среднее значение исходных и масштабированных данных, чтобы наблюдать эффект преобразования.

## --- Step 4: Transform the data ---
X_scaled = scaler.transform(X)

## Use numpy to set precision for cleaner output
np.set_printoptions(precision=2, suppress=True)
print("Original data mean:", np.mean(X, axis=0))
print("Scaled data mean:", np.mean(X_scaled, axis=0))
print("Scaled data sample:\n", X_scaled[:5])

Сохраните файл и запустите его.

python3 preprocess.py

Вы увидите, что среднее значение масштабированных данных фактически равно нулю, а значения выборки данных были преобразованы.

Shape of features (X): (150, 4)
Shape of target (y): (150,)
Scaler object created: StandardScaler()
Scaler mean: [5.84333333 3.05733333 3.758      1.19933333]
Original data mean: [5.84 3.06 3.76 1.2 ]
Scaled data mean: [-0. -0. -0. -0.]
Scaled data sample:
 [[-0.9   1.02 -1.34 -1.32]
 [-1.14 -0.13 -1.34 -1.32]
 [-1.39  0.33 -1.4  -1.32]
 [-1.51  0.1  -1.28 -1.32]
 [-1.02  1.25 -1.34 -1.32]]

Кодирование категориальной целевой переменной с помощью LabelEncoder из sklearn.preprocessing

На этом шаге мы предварительно обработаем нашу целевую переменную y. Целевая переменная в наборе данных Iris является категориальной, представленной числами 0, 1 и 2, которые соответствуют трем различным видам цветов Iris. Хотя они уже являются числовыми, хорошей практикой является понимание того, как кодировать категориальные метки, особенно если они были в строковом формате (например, 'setosa', 'versicolor').

Объяснение LabelEncoder:

  • Назначение: Преобразует категориальные метки (строки или смешанные типы) в целые числа
  • Как это работает: Присваивает уникальное целое число каждой уникальной категории
  • Пример: ['cat', 'dog', 'cat'] → [0, 1, 0]

Зачем использовать LabelEncoder?

  • Многие алгоритмы машинного обучения требуют числовых входных данных
  • Эффективное хранение и вычисления
  • Сохраняет категориальный характер данных

Ключевые методы:

  • fit(y): Изучает соответствие между категориями и целыми числами
  • transform(y): Применяет изученное соответствие
  • fit_transform(y): Объединяет оба шага в одном вызове
  • inverse_transform(y_encoded): Преобразует целые числа обратно в исходные категории

Важные замечания:

  • Порядок произвольный (основан на первом появлении или сортировке)
  • Не подходит для порядковых данных, где важен порядок (вместо этого используйте OrdinalEncoder)
  • Для признаков (не целевых переменных) рассмотрите OneHotEncoder для номинальных данных

Добавьте следующий код в ваш файл preprocess.py под комментарием ## --- Step 5: Encode the target ---. Мы создадим экземпляр LabelEncoder и используем метод fit_transform(), который объединяет обучение и преобразование в один шаг.

## --- Step 5: Encode the target ---
encoder = LabelEncoder()
y_encoded = encoder.fit_transform(y)

print("\nOriginal target sample:", y[:5])  ## Show first 5 original labels
print("Encoded target sample:", y_encoded[:5])  ## Show first 5 encoded labels
print("Unique encoded values:", np.unique(y_encoded))  ## Show all unique encoded values

Сохраните файл и запустите его в последний раз.

python3 preprocess.py

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

Shape of features (X): (150, 4)
Shape of target (y): (150,)
Scaler object created: StandardScaler()
Scaler mean: [5.84333333 3.05733333 3.758      1.19933333]
Original data mean: [5.84 3.06 3.76 1.2 ]
Scaled data mean: [-0. -0. -0. -0.]
Scaled data sample:
 [[-0.9   1.02 -1.34 -1.32]
 [-1.14 -0.13 -1.34 -1.32]
 [-1.39  0.33 -1.4  -1.32]
 [-1.51  0.1  -1.28 -1.32]
 [-1.02  1.25 -1.34 -1.32]]

Original target sample: [0 0 0 0 0]
Encoded target sample: [0 0 0 0 0]
Unique encoded values: [0 1 2]

Резюме

Поздравляем с завершением лабораторной работы! Вы успешно выполнили основные задачи предварительной обработки данных с использованием scikit-learn.

В этой лабораторной работе вы научились:

  • Загружать стандартный набор данных из scikit-learn.
  • Разделять данные на признаки (X) и целевую переменную (y).
  • Масштабировать числовые признаки с помощью StandardScaler, сначала обучив его на данных для изучения параметров (fit), а затем преобразовав данные (transform).
  • Кодировать категориальные метки целевой переменной в машиночитаемый целочисленный формат с помощью LabelEncoder.

Эти шаги предварительной обработки являются основополагающими для создания надежных и высокопроизводительных моделей машинного обучения. Теперь вы лучше подготовлены к подготовке собственных наборов данных для будущих проектов машинного обучения.