Автор материала: Юрий Кашницкий (@yorko в Slack ODS). Материал распространяется на условиях лицензии Creative Commons CC BY-NC-SA 4.0. Можно использовать в любых целях (редактировать, поправлять и брать за основу), кроме коммерческих, но с обязательным упоминанием автора материала.
Заполните пропущенный код и ответьте на вопросы в онлайн-форме.
# отключим всякие предупреждения Anaconda
import warnings
warnings.filterwarnings('ignore')
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import Lasso, LassoCV, LinearRegression
from sklearn.metrics.regression import mean_squared_error
from sklearn.model_selection import (GridSearchCV, cross_val_score,
train_test_split)
from sklearn.preprocessing import StandardScaler
Будем работать с набором данных по качеству белого вина (репозиторий UCI). Загружаем данные.
data = pd.read_csv('../../data/winequality-white.csv', sep=';')
data.head()
data.info()
Отделите целевой признак, разделите обучающую выборку в отношении 7:3 (30% - под оставленную выборку, пусть random_state=17) и отмасштабируйте данные с помощью StandardScaler.
y = # Ваш код здесь
X_train, X_holdout, y_train, y_holdout = train_test_split # Ваш код здесь
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform # Ваш код здесь
X_holdout_scaled = scaler.transform # Ваш код здесь
Обучите простую линейную регрессию.
linreg = # Ваш код здесь
linreg.fit # Ваш код здесь
Вопрос 1: Каковы среднеквадратичные ошибки линейной регрессии на обучающей и отложенной выборках?
print("Mean squared error (train): %.3f" % # Ваш код здесь
print("Mean squared error (test): %.3f" % # Ваш код здесь
Посмотрите на коэффициенты модели и отранжируйте признаки по влиянию на качество вина (учтите, что большие по модулю отрицательные значения коэффициентов тоже говорят о сильном влиянии). Создайте для этого новый небольшой DataFrame.
Вопрос 2: Какой признак линейная регрессия считает наиболее сильно влияющим на качество вина?
linreg_coef = pd.DataFrame # Ваш код здесь
linreg_coef.sort_values # Ваш код здесь
Обучите Lasso-регрессию с небольшим коэффициентом $\alpha = 0.01$ (слабая регуляризация). Пусть опять random_state=17.
lasso1 = Lasso # Ваш код здесь
lasso1.fit # Ваш код здесь
Посмотрите на коэффициенты модели и отранжируйте признаки по влиянию на качество вина. Какой признак "отвалился" первым, то есть наименее важен для объяснения целевого признака в модели Lasso?
lasso1_coef = pd.DataFrame # Ваш код здесь
lasso1_coef.sort_values # Ваш код здесь
Теперь определите лучшее значение $\alpha$ в процессе кросс-валидации 5-кратной кросс-валидации. Используйте LassoCV и random_state=17.
alphas = np.logspace(-6, 2, 200)
lasso_cv = LassoCV # Ваш код здесь
lasso_cv.fit # Ваш код здесь
lasso_cv.alpha_
Выведите коэффициенты "лучшего" Lasso в порядке убывания влияния на качество вина.
Вопрос 3: Какой признак "обнулился первым" в настроенной модели LASSO?
lasso_cv_coef = pd.DataFrame # Ваш код здесь
lasso_cv_coef.sort_values # Ваш код здесь
Оцените среднеквадратичную ошибку модели на обучающей и тестовой выборках.
Вопрос 4: Каковы среднеквадратичные ошибки настроенной LASSO-регрессии на обучающей и отложенной выборках?
print("Mean squared error (train): %.3f" % # Ваш код здесь
print("Mean squared error (test): %.3f" % # Ваш код здесь
Обучите случайный лес с параметрами "из коробки", фиксируя только random_state=17.
forest = RandomForestRegressor # Ваш код здесь
forest.fit # Ваш код здесь
Вопрос 5: Каковы среднеквадратичные ошибки случайного леса на обучающей выборке, на кросс-валидации (cross_val_score с scoring='neg_mean_squared_error' и остальными параметрами по умолчанию) и на отложенной выборке?
print("Mean squared error (train): %.3f" % # Ваш код здесь
print("Mean squared error (cv): %.3f" % # Ваш код здесь
print("Mean squared error (test): %.3f" % # Ваш код здесь
Настройте параметры min_samples_leaf и max_depth с помощью GridSearchCV и опять проверьте качество модели на кросс-валидации и на отложенной выборке.
forest_params = {'max_depth': list(range(10, 25)),
'min_samples_leaf': list(range(1, 8)),
'max_features': list(range(6,12))}
locally_best_forest = GridSearchCV # Ваш код здесь
locally_best_forest.fit # Ваш код здесь
locally_best_forest.best_params_, locally_best_forest.best_score_
К сожалению, результаты GridSearchCV не полностью воспроизводимы (могут отличаться на разных платформах даже при фиксировании random_state). Поэтому обучите лес с параметрами max_depth=19, max_features=7, и min_samples_leaf=1 (лучшие в моем случае).
Вопрос 6: Каковы среднеквадратичные ошибки настроенного случайного леса на обучающей выборке, на кросс-валидации (cross_val_score с scoring='neg_mean_squared_error') и на отложенной выборке?
# Ваш код здесь
print("Mean squared error (cv): %.3f" % # Ваш код здесь
print("Mean squared error (test): %.3f" % # Ваш код здесь
Оцените важность признаков с помощью случайного леса.
Вопрос 7: Какой признак оказался главным в настроенной модели случайного леса?
rf_importance = pd.DataFrame # Ваш код здесь
rf_importance.sort_values # Ваш код здесь
Сделайте выводы о качестве моделей и оценках влияния признаков на качество вина с помощью этих трех моделей.