Вопрос или проблема
Я новичок в мире 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
.
Корректная стратегия будет выглядеть следующим образом:
- Убедитесь, что
Pipeline
включает все необходимые шаги: сначалаStandardScaler
, затемPCA
, и в заключениеRidge Regression
. - Используйте
GridSearchCV
как настраиваемую процедуру, чтобы найти оптимальные значения гиперпараметров вашей модели регрессии. - После выполнения
.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, которые критически важны для работы с высокоразмерными данными и мультиколлинеарными проблемами в данных.