{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Лабораторная работа №3\n", "\n", "## Набор данных Students Performance in Exams (Успеваемость студентов на экзаменах)\n", "\n", "Выгрузка данных из CSV файла в датафрейм" ] }, { "cell_type": "code", "execution_count": 178, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "# Загрузка данных\n", "df = pd.read_csv(\"..//..//static//csv//StudentsPerformance.csv\")\n", "\n", "random_state=9" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Описание набора \n", "\n", "Контекст\n", "Оценки, полученные студентами\n", "\n", "Содержание\n", "Этот набор данных состоит из оценок, полученных учащимися по различным предметам.\n", "\n", "Вдохновение\n", "Понять влияние происхождения родителей, подготовки к тестированию и т. д. на успеваемость учащихся." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Анализ содержимого\n", "\n", "*Объекты наблюдения:* студенты, участвующие в экзаменах.\n", "\n", "*Атрибуты объектов:* \n", "\n", "1. gender — пол: определяет гендерную принадлежность студента (мужской, женский). \n", "2. race/ethnicity — этническая принадлежность: группа, к которой относится студент (например, различные расовые/этнические категории). \n", "3. parental level of education — уровень образования родителей(например, среднее образование, высшее образование и т.д.). \n", "4. lunch — тип обеда: информация о том, получает ли студент бесплатный или платный обед. \n", "5. test preparation course — курс подготовки к тесту\n", "6. math score — результаты экзаменов по математике.\n", "7. reading score — результаты экзаменов по чтению.\n", "8. writing score — результаты экзаменов по письму.\n", "\n", "\n", "### Бизнес-цель:\n", "\n", "**Цель**: Прогнозирование успеваемости студентов на основе различных факторов, таких как пол, раса/этническая принадлежность, уровень образования родителей, тип обеда и участие в подготовительных курсах. \n", "\n", "**Эффект**: Предсказание результатов студентов позволяет выявить тех, кто может столкнуться с трудностями в учебе. Это дает возможность образовательным учреждениям предпринимать превентивные меры: например, организовывать дополнительные занятия, персонализированные консультации, улучшать условия обучения и даже вмешиваться на более ранних стадиях, чтобы повысить общий уровень успеваемости.\n", "\n", "\n", "### Техническая цель\n", "**Цель**: Создание регрессионной модели, которая будет предсказывать общий балл студентов (или другой числовой показатель успеваемости) на основе категориальных и числовых данных. Это потребует использования методов линейной или нелинейной регрессии для определения зависимости между признаками (пол, уровень образования родителей и т.д.) и итоговым баллом. \n", "\n", "**Подход**: Для решения задачи нужно использовать числовые признаки, такие как \"math score\", \"reading score\", \"writing score\", и выполнить их агрегацию (например, суммирование или среднее), чтобы построить прогноз для общего балла. Модели, такие как линейная регрессия или регрессия на основе деревьев решений, подойдут для этого. у которых ожидаются низкие результаты на экзаменах, тем самым повышая их шансы на успешную сдачу экзаменов.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Конструирование признаков для решения задач\n", "\n", "Можно создать новый признак, который будет представлять общую успеваемость студента. Например, можно суммировать баллы по всем предметам и создать общий балл. \n" ] }, { "cell_type": "code", "execution_count": 179, "metadata": {}, "outputs": [], "source": [ "df['total_score'] = df['math score'] + df['reading score'] + df['writing score']\n", "df = df.drop(columns=['math score', 'reading score', 'writing score'])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Выберем три модели для задач регрессии\n", "\n", "1. Линейная регрессия служит базовой моделью, чтобы понять, насколько линейны зависимости между признаками и целевой переменной. Это важный шаг для проверки простых гипотез.\n", "\n", "2. Случайный лес используется для обработки данных с более сложными зависимостями, когда данные могут содержать нелинейные связи, которые линейная регрессия не может уловить.\n", "\n", "3. Градиентный бустинг — это более сложная модель, которая позволяет добиться высокой точности, особенно при наличии сложных закономерностей в данных. Он может предложить лучшее качество прогноза при оптимальной настройке гиперпараметров.\n", "\n", "Эти три модели дадут нам хорошее сочетание простоты (линейная регрессия), гибкости (случайный лес) и мощности (градиентный бустинг), что позволит тщательно исследовать зависимости и добиться хорошего качества предсказаний." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Разделение набора данных на обучающую и тестовые выборки (80/20) для задачи регрессии и создание ориентира\n", "\n", "Целевой признак -- total_score" ] }, { "cell_type": "code", "execution_count": 180, "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "# Разбиение на признаки и целевую переменную\n", "X = df.drop(columns=[\"total_score\"]) # Признаки\n", "y = df[\"total_score\"] # Целевая переменная\n", "\n", "# Разбиение на обучающую и тестовую выборки\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=random_state)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Формирование конвейера" ] }, { "cell_type": "code", "execution_count": 181, "metadata": {}, "outputs": [], "source": [ "from sklearn.compose import ColumnTransformer\n", "from sklearn.discriminant_analysis import StandardScaler\n", "from sklearn.impute import SimpleImputer\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.preprocessing import OneHotEncoder\n", "\n", "# Пайплайн для обработки признаков\n", "columns_to_drop = [\"total_score\"]\n", "num_columns = [column for column in X.columns if X[column].dtype != \"object\"]\n", "cat_columns = [column for column in X.columns if X[column].dtype == \"object\"]\n", "\n", "# Обработчики для числовых и категориальных признаков\n", "num_imputer = SimpleImputer(strategy=\"median\")\n", "num_scaler = StandardScaler()\n", "preprocessing_num = Pipeline([(\"imputer\", num_imputer), (\"scaler\", num_scaler)])\n", "\n", "cat_imputer = SimpleImputer(strategy=\"constant\", fill_value=\"unknown\")\n", "cat_encoder = OneHotEncoder(handle_unknown=\"ignore\", sparse_output=False, drop=\"first\")\n", "preprocessing_cat = Pipeline([(\"imputer\", cat_imputer), (\"encoder\", cat_encoder)])\n", "\n", "# Обрабатываем признаки\n", "features_preprocessing = ColumnTransformer(\n", " transformers=[\n", " (\"prepocessing_num\", preprocessing_num, num_columns),\n", " (\"prepocessing_cat\", preprocessing_cat, cat_columns),\n", " ],\n", " remainder=\"passthrough\"\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Настройка гиперпараметров для каждой модели и обучение" ] }, { "cell_type": "code", "execution_count": 182, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
GridSearchCV(cv=5,\n", " estimator=Pipeline(steps=[('features_preprocessing',\n", " ColumnTransformer(remainder='passthrough',\n", " transformers=[('prepocessing_num',\n", " Pipeline(steps=[('imputer',\n", " SimpleImputer(strategy='median')),\n", " ('scaler',\n", " StandardScaler())]),\n", " []),\n", " ('prepocessing_cat',\n", " Pipeline(steps=[('imputer',\n", " SimpleImputer(fill_value='unknown',\n", " strategy='constant')),\n", " ('enc...\n", " OneHotEncoder(drop='first',\n", " handle_unknown='ignore',\n", " sparse_output=False))]),\n", " ['gender',\n", " 'race/ethnicity',\n", " 'parental '\n", " 'level '\n", " 'of '\n", " 'education',\n", " 'lunch',\n", " 'test '\n", " 'preparation '\n", " 'course'])])),\n", " ('model',\n", " GradientBoostingRegressor(random_state=9))]),\n", " n_jobs=-1,\n", " param_grid={'model__learning_rate': [0.01, 0.1, 0.2],\n", " 'model__max_depth': [3, 5, 7],\n", " 'model__n_estimators': [50, 100, 200]})In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
GridSearchCV(cv=5,\n", " estimator=Pipeline(steps=[('features_preprocessing',\n", " ColumnTransformer(remainder='passthrough',\n", " transformers=[('prepocessing_num',\n", " Pipeline(steps=[('imputer',\n", " SimpleImputer(strategy='median')),\n", " ('scaler',\n", " StandardScaler())]),\n", " []),\n", " ('prepocessing_cat',\n", " Pipeline(steps=[('imputer',\n", " SimpleImputer(fill_value='unknown',\n", " strategy='constant')),\n", " ('enc...\n", " OneHotEncoder(drop='first',\n", " handle_unknown='ignore',\n", " sparse_output=False))]),\n", " ['gender',\n", " 'race/ethnicity',\n", " 'parental '\n", " 'level '\n", " 'of '\n", " 'education',\n", " 'lunch',\n", " 'test '\n", " 'preparation '\n", " 'course'])])),\n", " ('model',\n", " GradientBoostingRegressor(random_state=9))]),\n", " n_jobs=-1,\n", " param_grid={'model__learning_rate': [0.01, 0.1, 0.2],\n", " 'model__max_depth': [3, 5, 7],\n", " 'model__n_estimators': [50, 100, 200]})
Pipeline(steps=[('features_preprocessing',\n", " ColumnTransformer(remainder='passthrough',\n", " transformers=[('prepocessing_num',\n", " Pipeline(steps=[('imputer',\n", " SimpleImputer(strategy='median')),\n", " ('scaler',\n", " StandardScaler())]),\n", " []),\n", " ('prepocessing_cat',\n", " Pipeline(steps=[('imputer',\n", " SimpleImputer(fill_value='unknown',\n", " strategy='constant')),\n", " ('encoder',\n", " OneHotEncoder(drop='first',\n", " handle_unknown='ignore',\n", " sparse_output=False))]),\n", " ['gender', 'race/ethnicity',\n", " 'parental level of '\n", " 'education',\n", " 'lunch',\n", " 'test preparation '\n", " 'course'])])),\n", " ('model',\n", " GradientBoostingRegressor(learning_rate=0.01, n_estimators=200,\n", " random_state=9))])
ColumnTransformer(remainder='passthrough',\n", " transformers=[('prepocessing_num',\n", " Pipeline(steps=[('imputer',\n", " SimpleImputer(strategy='median')),\n", " ('scaler', StandardScaler())]),\n", " []),\n", " ('prepocessing_cat',\n", " Pipeline(steps=[('imputer',\n", " SimpleImputer(fill_value='unknown',\n", " strategy='constant')),\n", " ('encoder',\n", " OneHotEncoder(drop='first',\n", " handle_unknown='ignore',\n", " sparse_output=False))]),\n", " ['gender', 'race/ethnicity',\n", " 'parental level of education', 'lunch',\n", " 'test preparation course'])])
[]
SimpleImputer(strategy='median')
StandardScaler()
['gender', 'race/ethnicity', 'parental level of education', 'lunch', 'test preparation course']
SimpleImputer(fill_value='unknown', strategy='constant')
OneHotEncoder(drop='first', handle_unknown='ignore', sparse_output=False)
[]
passthrough
GradientBoostingRegressor(learning_rate=0.01, n_estimators=200, random_state=9)