{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "##
[mlcourse.ai](https://mlcourse.ai) – открытый курс OpenDataScience по машинному обучению \n", " \n", "Автор материала: Юрий Кашницкий (@yorko в Slack ODS). Материал распространяется на условиях лицензии [Creative Commons CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/). Можно использовать в любых целях (редактировать, поправлять и брать за основу), кроме коммерческих, но с обязательным упоминанием автора материала." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#
Домашнее задание 6 (демо). Линейная регрессия, Lasso и RF-регрессия в задаче по определению качества вина
\n", "\n", "\n", "**Заполните пропущенный код и ответьте на вопросы в [онлайн-форме](https://docs.google.com/forms/d/1gsNxgkd0VqidZp4lh9mnCQnJw3b0IFR1C4WBES86J40).**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# отключим всякие предупреждения Anaconda\n", "import warnings\n", "\n", "warnings.filterwarnings('ignore')\n", "import numpy as np\n", "import pandas as pd\n", "from sklearn.ensemble import RandomForestRegressor\n", "from sklearn.linear_model import Lasso, LassoCV, LinearRegression\n", "from sklearn.metrics.regression import mean_squared_error\n", "from sklearn.model_selection import (GridSearchCV, cross_val_score,\n", " train_test_split)\n", "from sklearn.preprocessing import StandardScaler" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Будем работать с набором данных по качеству белого вина (репозиторий UCI).**\n", "**Загружаем данные.**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data = pd.read_csv('../../data/winequality-white.csv', sep=';')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Отделите целевой признак, разделите обучающую выборку в отношении 7:3 (30% - под оставленную выборку, пусть random_state=17) и отмасштабируйте данные с помощью StandardScaler.**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "y = # Ваш код здесь\n", "\n", "X_train, X_holdout, y_train, y_holdout = train_test_split # Ваш код здесь\n", "scaler = StandardScaler()\n", "X_train_scaled = scaler.fit_transform # Ваш код здесь\n", "X_holdout_scaled = scaler.transform # Ваш код здесь" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Линейная регрессия" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Обучите простую линейную регрессию.**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "linreg = # Ваш код здесь\n", "linreg.fit # Ваш код здесь" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Вопрос 1: Каковы среднеквадратичные ошибки линейной регрессии на обучающей и отложенной выборках?**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"Mean squared error (train): %.3f\" % # Ваш код здесь\n", "print(\"Mean squared error (test): %.3f\" % # Ваш код здесь" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Посмотрите на коэффициенты модели и отранжируйте признаки по влиянию на качество вина (учтите, что большие по модулю отрицательные значения коэффициентов тоже говорят о сильном влиянии). Создайте для этого новый небольшой DataFrame.**
\n", "**Вопрос 2: Какой признак линейная регрессия считает наиболее сильно влияющим на качество вина?**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "linreg_coef = pd.DataFrame # Ваш код здесь\n", "linreg_coef.sort_values # Ваш код здесь" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Lasso-регрессия" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Обучите Lasso-регрессию с небольшим коэффициентом $\\alpha = 0.01$ (слабая регуляризация). Пусть опять random_state=17.**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lasso1 = Lasso # Ваш код здесь\n", "lasso1.fit # Ваш код здесь " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Посмотрите на коэффициенты модели и отранжируйте признаки по влиянию на качество вина. Какой признак \"отвалился\" первым, то есть наименее важен для объяснения целевого признака в модели Lasso?**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lasso1_coef = pd.DataFrame # Ваш код здесь\n", "lasso1_coef.sort_values # Ваш код здесь" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Теперь определите лучшее значение $\\alpha$ в процессе кросс-валидации 5-кратной кросс-валидации. Используйте LassoCV и random_state=17.**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "alphas = np.logspace(-6, 2, 200)\n", "lasso_cv = LassoCV # Ваш код здесь\n", "lasso_cv.fit # Ваш код здесь" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lasso_cv.alpha_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Выведите коэффициенты \"лучшего\" Lasso в порядке убывания влияния на качество вина. **
\n", "**Вопрос 3: Какой признак \"обнулился первым\" в настроенной модели LASSO?**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lasso_cv_coef = pd.DataFrame # Ваш код здесь\n", "lasso_cv_coef.sort_values # Ваш код здесь" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Оцените среднеквадратичную ошибку модели на обучающей и тестовой выборках.**
\n", "**Вопрос 4: Каковы среднеквадратичные ошибки настроенной LASSO-регрессии на обучающей и отложенной выборках?**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"Mean squared error (train): %.3f\" % # Ваш код здесь\n", "print(\"Mean squared error (test): %.3f\" % # Ваш код здесь" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Случайный лес" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Обучите случайный лес с параметрами \"из коробки\", фиксируя только random_state=17.**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "forest = RandomForestRegressor # Ваш код здесь\n", "forest.fit # Ваш код здесь" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Вопрос 5: Каковы среднеквадратичные ошибки случайного леса на обучающей выборке, на кросс-валидации (cross_val_score с scoring='neg_mean_squared_error' и остальными параметрами по умолчанию) и на отложенной выборке?**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"Mean squared error (train): %.3f\" % # Ваш код здесь\n", "print(\"Mean squared error (cv): %.3f\" % # Ваш код здесь\n", "print(\"Mean squared error (test): %.3f\" % # Ваш код здесь" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Настройте параметры min_samples_leaf и max_depth с помощью GridSearchCV и опять проверьте качество модели на кросс-валидации и на отложенной выборке.**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "forest_params = {'max_depth': list(range(10, 25)), \n", " 'min_samples_leaf': list(range(1, 8)),\n", " 'max_features': list(range(6,12))}\n", "\n", "locally_best_forest = GridSearchCV # Ваш код здесь\n", "locally_best_forest.fit # Ваш код здесь" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "locally_best_forest.best_params_, locally_best_forest.best_score_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**К сожалению, результаты GridSearchCV не полностью воспроизводимы (могут отличаться на разных платформах даже при фиксировании *random_state*). Поэтому обучите лес с параметрами max_depth=19, max_features=7, и min_samples_leaf=1 (лучшие в моем случае).**
\n", "**Вопрос 6: Каковы среднеквадратичные ошибки настроенного случайного леса на обучающей выборке, на кросс-валидации (cross_val_score с scoring='neg_mean_squared_error') и на отложенной выборке?**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ваш код здесь" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"Mean squared error (cv): %.3f\" % # Ваш код здесь\n", "print(\"Mean squared error (test): %.3f\" % # Ваш код здесь" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Оцените важность признаков с помощью случайного леса.**
\n", "**Вопрос 7: Какой признак оказался главным в настроенной модели случайного леса?**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "rf_importance = pd.DataFrame # Ваш код здесь\n", "rf_importance.sort_values # Ваш код здесь" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Сделайте выводы о качестве моделей и оценках влияния признаков на качество вина с помощью этих трех моделей.**" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" }, "name": "lesson8_part1_kmeans.ipynb" }, "nbformat": 4, "nbformat_minor": 1 }