[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
}