Введение
Добро пожаловать в лабораторию по предварительной обработке данных 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.
Эти шаги предварительной обработки являются основополагающими для создания надежных и высокопроизводительных моделей машинного обучения. Теперь вы лучше подготовлены к подготовке собственных наборов данных для будущих проектов машинного обучения.



