Масштабирование и метод главных компонент (PCA) для тестовых данных перед предсказанием.

Вопрос или проблема

Я новичок в мире ML и Data Science. Я прошел сертификационный курс на Coursera/IBM и пытаюсь улучшить свои навыки, используя некоторые упражнения из Kaggle. Курс не познакомил меня с концепциями PCA, поэтому я изучаю это самостоятельно. Насколько я понимаю, PCA требует масштабирования данных. У меня есть данные, для которых я хотел бы создать модель и затем выполнить прогноз. Я планирую использовать Ridge Regression как мою модель. Я также хотел бы использовать GridSearchCV для настройки гиперпараметров модели. Основываясь на некоторых чтениях, я думаю, что мне следует запускать функции fit_transform() для шкалера и PCA на обучающих данных отдельно, а затем просто вызывать метод transform() обоих на тестовых данных перед вызовом функции predict() модели. Это правильно? Я использую конвейер для запуска шкалера, PCA и регрессии вместе. Перед этим я создаю три объекта (StandardScaler, PCA, Ridge) отдельно, чтобы у меня был объект, на который можно ссылаться для каждого. Я предположил, что функция GridSearchCV вызовет функции fit_transform() для шкалера и PCA, и таким образом объекты шкалера и PCA могут быть использованы позже для вызова функции transform() на тестовых данных. Но, похоже, это невозможно. Я вставляю свой код ниже для справки. Я получаю ошибку (NotFittedError: Этот экземпляр StandardScaler еще не подходит.), указывающую на то, что функция fit_transform() шкалера не была вызвана. Какой правильный способ достичь моей цели?

pca = PCA()
scaler = StandardScaler()
ridge = Ridge()

params = [{'ridgereg__alpha': [0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0]}]
pipeline = Pipeline([('scaler', scaler), ('pca', pca), ('ridgereg', ridge)])

X = df[['OverallQual', 'YearBuilt', 'YearRemodAdd', 'TotalBsmtSF', '1stFlrSF', 'GrLivArea', 'FullBath', 'TotRmsAbvGrd', 'GarageCars', 'GarageArea']]
y = df['SalePrice']

x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.10, random_state=1)

model = GridSearchCV(pipeline, params, cv=4)
model.fit(x_train, y_train)

# Теперь мы должны масштабировать и трансформировать тестовые данные
x_scaled = scaler.transform(x_test) # предполагая, что scaler.fit_transform() был вызван конвейером
X_scaled_df = pd.DataFrame(x_scaled, columns=X.columns)
X_pca = pca.transform(X_scaled_df) # предполагая, что pca.fit_transform() был вызван конвейером
X_pca_df = pd.DataFrame(X_pca, columns=X.columns)

y_pred = model.predict(X_pca_df)

mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
rmse = root_mean_squared_error(y_test, y_pred)

print('MSE: %.2f; R2: %.2f; rmse: %.2f\n' % (mse, r2, rmse))
```

Ответ или решение

Вводя в курс дела, при использовании машинного обучения (ML) и анализа данных одним из основных этапов является подготовка данных. Подготовка данных происходит через масштабирование и редукцию размерности, где главную роль может сыграть метод главных компонент (PCA). В соответствии с расширенными усилиями, вы уже понимаете основные концепции и приступаете к их реализации через практические задачи.

Теория:
Масштабирование данных необходимо для приведения всех признаков к общему масштабу для улучшения сходимости многих моделей машинного обучения, включая методы регрессии, такие как гребневая регрессия (Ridge Regression). Стандартное масштабирование (StandardScaler) приводит данные к стандартной нормальной форме с нулевым средним значением и единичным стандартным отклонением. PCA, в свою очередь, служит для уменьшения размерности наборов данных и выявления основных осей вариативности, уменьшая влияние несущественной информации. Эти техники улучшения данных обязателены перед применением некоторых моделей, особенно таких, как гребневая регрессия, чтобы избежать проблем мультиколлинеарности.

Пример:
Предположим, у вас есть данные по характеристикам недвижимости, которые вы хотите использовать для прогнозирования их рыночной стоимости. Здесь вы хотите уменьшить размерность данных через PCA после масштабирования, а затем применить гребневую регрессию. Вы настроили параметры с помощью GridSearchCV для оптимизации гиперпараметров вашей модели.

Применение:
Переходя к шагам вашего кода, идея о структурировании через Pipeline— это идеальный подход, чтобы последовательно применять несколько этапов трансформации данных и обучения модели. Однако важно помнить, что при использовании GridSearchCV с .fit() на ваших данных, подходящий объект Pipeline должен масштабировать и трансформировать ваши обучающие данные. Для тестовых данных, вы только применяете трансформацию, используя ту же последовательность трансформаций, которая была адаптирована к обучающим данным.

Проблема, с которой вы столкнулись, связана с тем, что после использования GridSearchCV, который сам по себе включает в себя процесс трансформации через вызовы методов fit вашего Pipeline, вы должны напрямую использовать модель для предсказаний на тестовых данных. Ваш подход трансформации тестового набора данных вручную (явно вызывая методы transform для scaler и PCA) вызывает ошибку из-за того, что вы опускаете автоматическую функциональность Pipeline.

Корректная стратегия будет выглядеть следующим образом:

  1. Убедитесь, что Pipeline включает все необходимые шаги: сначала StandardScaler, затем PCA, и в заключение Ridge Regression.
  2. Используйте GridSearchCV как настраиваемую процедуру, чтобы найти оптимальные значения гиперпараметров вашей модели регрессии.
  3. После выполнения .fit() от GridSearchCV на обучающих данных, используйте ваш Pipeline в режиме .predict() напрямую с тестовыми данными.

Изучим это на практике:

# Весь код идентичен вашему до последних 4-х строк
# Уберите ручные трансформации, просто используйте предсказание согласно вашему обучению на всей модели:
y_pred = model.predict(x_test)

# Вычислите метрики на тестовом наборе данных:
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
rmse = np.sqrt(mse)

print(f'MSE: {mse:.2f}; R2: {r2:.2f}; RMSE: {rmse:.2f}')

Использование Pipeline и GridSearchCV совместно упрощает сложные процессы, автоматизируя рутинные задачи подготовки и подбора параметров данных, что позволяет сосредоточиться на интерпретации результатов, эффективности и точности вашей модели.

Развитие в области машинного обучения требует постоянного обучения и адаптации новых концепций. Поздравляем с тем, что вы взяли на себя инициативу расширять свои знания о более продвинутых методах, таких как PCA и Ridge Regression, которые критически важны для работы с высокоразмерными данными и мультиколлинеарными проблемами в данных.

Оцените материал
Добавить комментарий

Капча загружается...