Открытый курс по машинному обучению

Автор материала: Юрий Кашницкий, программист-исследователь Mail.Ru Group

Материал распространяется на условиях лицензии Creative Commons CC BY-NC-SA 4.0. Можно использовать в любых целях (редактировать, поправлять и брать за основу), кроме коммерческих, но с обязательным упоминанием автора материала.

Домашнее задание 6 (демо). Линейная регрессия, Lasso и RF-регрессия в задаче по определению качества вина

Заполните пропущенный код и ответьте на вопросы в онлайн-форме.

In [1]:
# отключим всякие предупреждения Anaconda
import warnings
warnings.filterwarnings('ignore')
import numpy as np
import pandas as pd
from sklearn.metrics.regression import mean_squared_error
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.linear_model import LinearRegression, LassoCV, Lasso
from sklearn.ensemble import RandomForestRegressor

Будем работать с набором данных по качеству белого вина (репозиторий UCI). Загружаем данные.

In [3]:
data = pd.read_csv('../../data/winequality-white.csv', sep=';')
In [4]:
data.head()
Out[4]:
fixed acidity volatile acidity citric acid residual sugar chlorides free sulfur dioxide total sulfur dioxide density pH sulphates alcohol quality
0 7.0 0.27 0.36 20.7 0.045 45.0 170.0 1.0010 3.00 0.45 8.8 6
1 6.3 0.30 0.34 1.6 0.049 14.0 132.0 0.9940 3.30 0.49 9.5 6
2 8.1 0.28 0.40 6.9 0.050 30.0 97.0 0.9951 3.26 0.44 10.1 6
3 7.2 0.23 0.32 8.5 0.058 47.0 186.0 0.9956 3.19 0.40 9.9 6
4 7.2 0.23 0.32 8.5 0.058 47.0 186.0 0.9956 3.19 0.40 9.9 6
In [5]:
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4898 entries, 0 to 4897
Data columns (total 12 columns):
fixed acidity           4898 non-null float64
volatile acidity        4898 non-null float64
citric acid             4898 non-null float64
residual sugar          4898 non-null float64
chlorides               4898 non-null float64
free sulfur dioxide     4898 non-null float64
total sulfur dioxide    4898 non-null float64
density                 4898 non-null float64
pH                      4898 non-null float64
sulphates               4898 non-null float64
alcohol                 4898 non-null float64
quality                 4898 non-null int64
dtypes: float64(11), int64(1)
memory usage: 459.3 KB

Отделите целевой признак, разделите обучающую выборку в отношении 7:3 (30% - под оставленную выборку, пусть random_state=17) и отмасштабируйте данные с помощью StandardScaler.

In [ ]:
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 # Ваш код здесь

Линейная регрессия

Обучите простую линейную регрессию.

In [ ]:
linreg = # Ваш код здесь
linreg.fit # Ваш код здесь

Вопрос 1: Каковы среднеквадратичные ошибки линейной регрессии на обучающей и отложенной выборках?

In [ ]:
print("Mean squared error (train): %.3f" % # Ваш код здесь
print("Mean squared error (test): %.3f" % # Ваш код здесь

Посмотрите на коэффициенты модели и отранжируйте признаки по влиянию на качество вина (учтите, что большие по модулю отрицательные значения коэффициентов тоже говорят о сильном влиянии). Создайте для этого новый небольшой DataFrame.
Вопрос 2: Какой признак линейная регрессия считает наиболее сильно влияющим на качество вина?

In [ ]:
linreg_coef = pd.DataFrame # Ваш код здесь
linreg_coef.sort_values # Ваш код здесь

Lasso-регрессия

Обучите Lasso-регрессию с небольшим коэффициентом $\alpha = 0.01$ (слабая регуляризация). Пусть опять random_state=17.

In [ ]:
lasso1 = Lasso # Ваш код здесь
lasso1.fit # Ваш код здесь 

Посмотрите на коэффициенты модели и отранжируйте признаки по влиянию на качество вина. Какой признак "отвалился" первым, то есть наименее важен для объяснения целевого признака в модели Lasso?

In [ ]:
lasso1_coef = pd.DataFrame # Ваш код здесь
lasso1_coef.sort_values # Ваш код здесь

Теперь определите лучшее значение $\alpha$ в процессе кросс-валидации 5-кратной кросс-валидации. Используйте LassoCV и random_state=17.

In [ ]:
alphas = np.logspace(-6, 2, 200)
lasso_cv = LassoCV # Ваш код здесь
lasso_cv.fit # Ваш код здесь
In [ ]:
lasso_cv.alpha_

Выведите коэффициенты "лучшего" Lasso в порядке убывания влияния на качество вина.
Вопрос 3: Какой признак "обнулился первым" в настроенной модели LASSO?

In [ ]:
lasso_cv_coef = pd.DataFrame # Ваш код здесь
lasso_cv_coef.sort_values # Ваш код здесь

Оцените среднеквадратичную ошибку модели на обучающей и тестовой выборках.
Вопрос 4: Каковы среднеквадратичные ошибки настроенной LASSO-регрессии на обучающей и отложенной выборках?

In [ ]:
print("Mean squared error (train): %.3f" % # Ваш код здесь
print("Mean squared error (test): %.3f" % # Ваш код здесь

Случайный лес

Обучите случайный лес с параметрами "из коробки", фиксируя только random_state=17.

In [ ]:
forest = RandomForestRegressor # Ваш код здесь
forest.fit # Ваш код здесь

Вопрос 5: Каковы среднеквадратичные ошибки случайного леса на обучающей выборке, на кросс-валидации (cross_val_score с scoring='neg_mean_squared_error' и остальными параметрами по умолчанию) и на отложенной выборке?

In [ ]:
print("Mean squared error (train): %.3f" % # Ваш код здесь
print("Mean squared error (cv): %.3f" % # Ваш код здесь
print("Mean squared error (test): %.3f" % # Ваш код здесь

Настройте параметры min_samples_leaf и max_depth с помощью GridSearchCV и опять проверьте качество модели на кросс-валидации и на отложенной выборке.

In [ ]:
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 # Ваш код здесь
In [ ]:
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') и на отложенной выборке?

In [ ]:
# Ваш код здесь
In [ ]:
print("Mean squared error (cv): %.3f" % # Ваш код здесь
print("Mean squared error (test): %.3f" % # Ваш код здесь

Оцените важность признаков с помощью случайного леса.
Вопрос 7: Какой признак оказался главным в настроенной модели случайного леса?

In [ ]:
rf_importance = pd.DataFrame # Ваш код здесь
rf_importance.sort_values # Ваш код здесь

Сделайте выводы о качестве моделей и оценках влияния признаков на качество вина с помощью этих трех моделей.