Menu
CoddyTech

PCA перед обучением модели

Часть раздела Обучение без учителя путешествия по Machine Learning на Coddy. Урок 32 из 51.

Меньшее количество признаков ускоряет модель и уменьшает шум, за которым она гоняется. PCA можно поместить в конвейер непосредственно перед моделью:

for n in [2, 5, 10, 20, 40, 64]:
    model = make_pipeline(PCA(n_components=n), KNeighborsClassifier())
    print(n, f"{cross_val_score(model, X, y, cv=5).mean():.3f}")

На наборе цифр:

График точности k-NN на наборе цифр в зависимости от числа оставленных компонент: 0.595 при 2, 0.884 при 5, 0.940 при 10, затем почти без изменений, 0.958 при 20 и до 0.963 при всех 64

Точность перестаёт расти примерно на 20: остальные 44 направления почти ничего не добавляют. На каждом фолде PCA обучается на собственных обучающих строках, поэтому утечки данных не происходит.

Смешанные единицы измерения? Сначала поставь StandardScaler(), как всегда.

challenge icon

Задание

Средне

Лаборатория оливкового масла оценивает масла по тому, сколько света они поглощают на 36 длинах волн, а также по результатам 4 лабораторных тестов. Какого минимального количества признаков будет достаточно? Программа считывает допустимое отклонение.

  1. Для каждого n в sizes проведи кросс-валидацию (5 блоков) конвейера: масштабирование, PCA с n компонентами, LogisticRegression(max_iter=1000). Выведи оценку для каждого.
  2. Выведи наименьшее количество компонент, результат для которого находится в пределах допустимого отклонения от лучшего результата.

Для другой лаборатории и 0.05:

2 components: 0.817
3 components: 0.833
4 components: 0.889
5 components: 0.928
10 components: 0.928
20 components: 0.917
40 components: 0.922
Fewest within 0.05 of the best: 4 components

Попробуйте сами

import pandas as pd
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

# 180 образцов оливкового масла: поглощение света на 36 длинах волн, результаты 4 лабораторных тестов и категория качества
oils = pd.read_csv("oils.csv")
X = oils.drop(columns=["oil", "grade"])
y = oils["grade"]
sizes = [2, 3, 4, 5, 10, 20, 40]
slack = float(input())

# Напишите свой код ниже
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Обучение без учителя

Потренируйтесь самостоятельно: Онлайн-компилятор Python