2392 lines
207 KiB
Plaintext
2392 lines
207 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Лабораторная 4\n",
|
||
"\n",
|
||
"Датасет: Информация об онлайн обучении учеников\n",
|
||
"\n",
|
||
"Бизнес-цель 1: Улучшение доступа к онлайн-образованию для учеников с низким уровнем финансового обеспечения."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 104,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Index(['Education Level', 'Institution Type', 'Gender', 'Age', 'Device',\n",
|
||
" 'IT Student', 'Location', 'Financial Condition', 'Internet Type',\n",
|
||
" 'Network Type', 'Flexibility Level'],\n",
|
||
" dtype='object')\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import seaborn as sns\n",
|
||
"from typing import Tuple\n",
|
||
"from pandas import DataFrame\n",
|
||
"from sklearn import ensemble, linear_model, naive_bayes, neighbors, neural_network, tree, metrics, set_config\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"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",
|
||
"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",
|
||
"from sklearn.metrics import ConfusionMatrixDisplay\n",
|
||
"from sklearn.model_selection import GridSearchCV\n",
|
||
"\n",
|
||
"set_config(transform_output=\"pandas\")\n",
|
||
"df = pd.read_csv(\"..\\\\static\\\\csv\\\\students_adaptability_level_online_education.csv\")\n",
|
||
"print(df.columns)\n",
|
||
"\n",
|
||
"map_flexibility_to_int = {'Low': 0, 'Moderate': 1, 'High': 2}\n",
|
||
"\n",
|
||
"df['Flexibility Level'] = df['Flexibility Level'].map(map_flexibility_to_int).astype('int32')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Предварительно создадим колонку для работы с ней (ключевой фактор)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 105,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"fincond_mapping = {'Poor': 2, 'Mid': 1, 'Rich': 0}\n",
|
||
"internet_type_mapping = {'Mobile Data': 1, 'Wifi': 0}\n",
|
||
"device_mapping = {'Mobile': 1, 'Computer': 0}\n",
|
||
"network_type = {'2G': 2, '3G': 1, '4G': 0}\n",
|
||
"\n",
|
||
"df['Financial Score'] = df['Financial Condition'].map(fincond_mapping)\n",
|
||
"df['Internet Score'] = df['Internet Type'].map(internet_type_mapping)\n",
|
||
"df['Device Score'] = df['Device'].map(device_mapping)\n",
|
||
"df['Network Score'] = df['Network Type'].map(network_type)\n",
|
||
"\n",
|
||
"df['Access Difficulty Score'] = df['Financial Score'] + df['Internet Score'] + df['Device Score'] + df['Network Score']\n",
|
||
"\n",
|
||
"df['Access Difficulty'] = (df['Access Difficulty Score'] >= 3).astype(int)\n",
|
||
"df.drop(columns=['Financial Score', 'Device Score', 'Internet Score', 'Network Score', 'Access Difficulty Score'], inplace=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Формируем выборки"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 106,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'X_train'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Education Level</th>\n",
|
||
" <th>Institution Type</th>\n",
|
||
" <th>Gender</th>\n",
|
||
" <th>Age</th>\n",
|
||
" <th>Device</th>\n",
|
||
" <th>IT Student</th>\n",
|
||
" <th>Location</th>\n",
|
||
" <th>Financial Condition</th>\n",
|
||
" <th>Internet Type</th>\n",
|
||
" <th>Network Type</th>\n",
|
||
" <th>Flexibility Level</th>\n",
|
||
" <th>Access Difficulty</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>649</th>\n",
|
||
" <td>School</td>\n",
|
||
" <td>Public</td>\n",
|
||
" <td>Male</td>\n",
|
||
" <td>18</td>\n",
|
||
" <td>Mobile</td>\n",
|
||
" <td>No</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Mid</td>\n",
|
||
" <td>Wifi</td>\n",
|
||
" <td>4G</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>637</th>\n",
|
||
" <td>School</td>\n",
|
||
" <td>Private</td>\n",
|
||
" <td>Female</td>\n",
|
||
" <td>9</td>\n",
|
||
" <td>Mobile</td>\n",
|
||
" <td>No</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Mid</td>\n",
|
||
" <td>Mobile Data</td>\n",
|
||
" <td>4G</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>68</th>\n",
|
||
" <td>School</td>\n",
|
||
" <td>Public</td>\n",
|
||
" <td>Female</td>\n",
|
||
" <td>11</td>\n",
|
||
" <td>Mobile</td>\n",
|
||
" <td>No</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Mid</td>\n",
|
||
" <td>Wifi</td>\n",
|
||
" <td>4G</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>276</th>\n",
|
||
" <td>University</td>\n",
|
||
" <td>Private</td>\n",
|
||
" <td>Female</td>\n",
|
||
" <td>18</td>\n",
|
||
" <td>Mobile</td>\n",
|
||
" <td>Yes</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Mid</td>\n",
|
||
" <td>Mobile Data</td>\n",
|
||
" <td>3G</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>547</th>\n",
|
||
" <td>School</td>\n",
|
||
" <td>Public</td>\n",
|
||
" <td>Male</td>\n",
|
||
" <td>11</td>\n",
|
||
" <td>Mobile</td>\n",
|
||
" <td>No</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Mid</td>\n",
|
||
" <td>Wifi</td>\n",
|
||
" <td>4G</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1097</th>\n",
|
||
" <td>University</td>\n",
|
||
" <td>Private</td>\n",
|
||
" <td>Male</td>\n",
|
||
" <td>23</td>\n",
|
||
" <td>Mobile</td>\n",
|
||
" <td>Yes</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Rich</td>\n",
|
||
" <td>Wifi</td>\n",
|
||
" <td>4G</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>854</th>\n",
|
||
" <td>School</td>\n",
|
||
" <td>Public</td>\n",
|
||
" <td>Female</td>\n",
|
||
" <td>18</td>\n",
|
||
" <td>Mobile</td>\n",
|
||
" <td>No</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Mid</td>\n",
|
||
" <td>Mobile Data</td>\n",
|
||
" <td>4G</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>756</th>\n",
|
||
" <td>University</td>\n",
|
||
" <td>Public</td>\n",
|
||
" <td>Male</td>\n",
|
||
" <td>18</td>\n",
|
||
" <td>Computer</td>\n",
|
||
" <td>No</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Mid</td>\n",
|
||
" <td>Wifi</td>\n",
|
||
" <td>3G</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>133</th>\n",
|
||
" <td>College</td>\n",
|
||
" <td>Public</td>\n",
|
||
" <td>Male</td>\n",
|
||
" <td>18</td>\n",
|
||
" <td>Mobile</td>\n",
|
||
" <td>No</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Poor</td>\n",
|
||
" <td>Mobile Data</td>\n",
|
||
" <td>4G</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>53</th>\n",
|
||
" <td>University</td>\n",
|
||
" <td>Public</td>\n",
|
||
" <td>Male</td>\n",
|
||
" <td>27</td>\n",
|
||
" <td>Mobile</td>\n",
|
||
" <td>Yes</td>\n",
|
||
" <td>Rural</td>\n",
|
||
" <td>Poor</td>\n",
|
||
" <td>Mobile Data</td>\n",
|
||
" <td>4G</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>964 rows × 12 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Education Level Institution Type Gender Age Device IT Student \\\n",
|
||
"649 School Public Male 18 Mobile No \n",
|
||
"637 School Private Female 9 Mobile No \n",
|
||
"68 School Public Female 11 Mobile No \n",
|
||
"276 University Private Female 18 Mobile Yes \n",
|
||
"547 School Public Male 11 Mobile No \n",
|
||
"... ... ... ... ... ... ... \n",
|
||
"1097 University Private Male 23 Mobile Yes \n",
|
||
"854 School Public Female 18 Mobile No \n",
|
||
"756 University Public Male 18 Computer No \n",
|
||
"133 College Public Male 18 Mobile No \n",
|
||
"53 University Public Male 27 Mobile Yes \n",
|
||
"\n",
|
||
" Location Financial Condition Internet Type Network Type \\\n",
|
||
"649 Town Mid Wifi 4G \n",
|
||
"637 Town Mid Mobile Data 4G \n",
|
||
"68 Town Mid Wifi 4G \n",
|
||
"276 Town Mid Mobile Data 3G \n",
|
||
"547 Town Mid Wifi 4G \n",
|
||
"... ... ... ... ... \n",
|
||
"1097 Town Rich Wifi 4G \n",
|
||
"854 Town Mid Mobile Data 4G \n",
|
||
"756 Town Mid Wifi 3G \n",
|
||
"133 Town Poor Mobile Data 4G \n",
|
||
"53 Rural Poor Mobile Data 4G \n",
|
||
"\n",
|
||
" Flexibility Level Access Difficulty \n",
|
||
"649 1 0 \n",
|
||
"637 1 1 \n",
|
||
"68 0 0 \n",
|
||
"276 0 1 \n",
|
||
"547 1 0 \n",
|
||
"... ... ... \n",
|
||
"1097 0 0 \n",
|
||
"854 0 1 \n",
|
||
"756 1 0 \n",
|
||
"133 0 1 \n",
|
||
"53 1 1 \n",
|
||
"\n",
|
||
"[964 rows x 12 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'y_train'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Access Difficulty</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>649</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>637</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>68</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>276</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>547</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1097</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>854</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>756</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>133</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>53</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>964 rows × 1 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Access Difficulty\n",
|
||
"649 0\n",
|
||
"637 1\n",
|
||
"68 0\n",
|
||
"276 1\n",
|
||
"547 0\n",
|
||
"... ...\n",
|
||
"1097 0\n",
|
||
"854 1\n",
|
||
"756 0\n",
|
||
"133 1\n",
|
||
"53 1\n",
|
||
"\n",
|
||
"[964 rows x 1 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'X_test'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Education Level</th>\n",
|
||
" <th>Institution Type</th>\n",
|
||
" <th>Gender</th>\n",
|
||
" <th>Age</th>\n",
|
||
" <th>Device</th>\n",
|
||
" <th>IT Student</th>\n",
|
||
" <th>Location</th>\n",
|
||
" <th>Financial Condition</th>\n",
|
||
" <th>Internet Type</th>\n",
|
||
" <th>Network Type</th>\n",
|
||
" <th>Flexibility Level</th>\n",
|
||
" <th>Access Difficulty</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>265</th>\n",
|
||
" <td>School</td>\n",
|
||
" <td>Private</td>\n",
|
||
" <td>Female</td>\n",
|
||
" <td>9</td>\n",
|
||
" <td>Mobile</td>\n",
|
||
" <td>No</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Poor</td>\n",
|
||
" <td>Wifi</td>\n",
|
||
" <td>4G</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>358</th>\n",
|
||
" <td>School</td>\n",
|
||
" <td>Private</td>\n",
|
||
" <td>Female</td>\n",
|
||
" <td>10</td>\n",
|
||
" <td>Mobile</td>\n",
|
||
" <td>No</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Mid</td>\n",
|
||
" <td>Mobile Data</td>\n",
|
||
" <td>3G</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>316</th>\n",
|
||
" <td>University</td>\n",
|
||
" <td>Private</td>\n",
|
||
" <td>Male</td>\n",
|
||
" <td>23</td>\n",
|
||
" <td>Tab</td>\n",
|
||
" <td>No</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Mid</td>\n",
|
||
" <td>Wifi</td>\n",
|
||
" <td>4G</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>907</th>\n",
|
||
" <td>School</td>\n",
|
||
" <td>Private</td>\n",
|
||
" <td>Female</td>\n",
|
||
" <td>9</td>\n",
|
||
" <td>Mobile</td>\n",
|
||
" <td>No</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Poor</td>\n",
|
||
" <td>Mobile Data</td>\n",
|
||
" <td>4G</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1042</th>\n",
|
||
" <td>University</td>\n",
|
||
" <td>Private</td>\n",
|
||
" <td>Male</td>\n",
|
||
" <td>23</td>\n",
|
||
" <td>Mobile</td>\n",
|
||
" <td>No</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Mid</td>\n",
|
||
" <td>Mobile Data</td>\n",
|
||
" <td>3G</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>421</th>\n",
|
||
" <td>School</td>\n",
|
||
" <td>Private</td>\n",
|
||
" <td>Female</td>\n",
|
||
" <td>10</td>\n",
|
||
" <td>Mobile</td>\n",
|
||
" <td>No</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Mid</td>\n",
|
||
" <td>Mobile Data</td>\n",
|
||
" <td>3G</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>936</th>\n",
|
||
" <td>University</td>\n",
|
||
" <td>Private</td>\n",
|
||
" <td>Male</td>\n",
|
||
" <td>23</td>\n",
|
||
" <td>Tab</td>\n",
|
||
" <td>No</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Rich</td>\n",
|
||
" <td>Wifi</td>\n",
|
||
" <td>4G</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>722</th>\n",
|
||
" <td>University</td>\n",
|
||
" <td>Private</td>\n",
|
||
" <td>Male</td>\n",
|
||
" <td>23</td>\n",
|
||
" <td>Mobile</td>\n",
|
||
" <td>Yes</td>\n",
|
||
" <td>Rural</td>\n",
|
||
" <td>Poor</td>\n",
|
||
" <td>Mobile Data</td>\n",
|
||
" <td>3G</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1075</th>\n",
|
||
" <td>University</td>\n",
|
||
" <td>Private</td>\n",
|
||
" <td>Male</td>\n",
|
||
" <td>23</td>\n",
|
||
" <td>Computer</td>\n",
|
||
" <td>Yes</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Mid</td>\n",
|
||
" <td>Wifi</td>\n",
|
||
" <td>4G</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>577</th>\n",
|
||
" <td>University</td>\n",
|
||
" <td>Private</td>\n",
|
||
" <td>Male</td>\n",
|
||
" <td>23</td>\n",
|
||
" <td>Mobile</td>\n",
|
||
" <td>Yes</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Mid</td>\n",
|
||
" <td>Wifi</td>\n",
|
||
" <td>4G</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>241 rows × 12 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Education Level Institution Type Gender Age Device IT Student \\\n",
|
||
"265 School Private Female 9 Mobile No \n",
|
||
"358 School Private Female 10 Mobile No \n",
|
||
"316 University Private Male 23 Tab No \n",
|
||
"907 School Private Female 9 Mobile No \n",
|
||
"1042 University Private Male 23 Mobile No \n",
|
||
"... ... ... ... ... ... ... \n",
|
||
"421 School Private Female 10 Mobile No \n",
|
||
"936 University Private Male 23 Tab No \n",
|
||
"722 University Private Male 23 Mobile Yes \n",
|
||
"1075 University Private Male 23 Computer Yes \n",
|
||
"577 University Private Male 23 Mobile Yes \n",
|
||
"\n",
|
||
" Location Financial Condition Internet Type Network Type \\\n",
|
||
"265 Town Poor Wifi 4G \n",
|
||
"358 Town Mid Mobile Data 3G \n",
|
||
"316 Town Mid Wifi 4G \n",
|
||
"907 Town Poor Mobile Data 4G \n",
|
||
"1042 Town Mid Mobile Data 3G \n",
|
||
"... ... ... ... ... \n",
|
||
"421 Town Mid Mobile Data 3G \n",
|
||
"936 Town Rich Wifi 4G \n",
|
||
"722 Rural Poor Mobile Data 3G \n",
|
||
"1075 Town Mid Wifi 4G \n",
|
||
"577 Town Mid Wifi 4G \n",
|
||
"\n",
|
||
" Flexibility Level Access Difficulty \n",
|
||
"265 1 1 \n",
|
||
"358 1 1 \n",
|
||
"316 1 0 \n",
|
||
"907 1 1 \n",
|
||
"1042 1 1 \n",
|
||
"... ... ... \n",
|
||
"421 1 1 \n",
|
||
"936 2 0 \n",
|
||
"722 1 1 \n",
|
||
"1075 0 0 \n",
|
||
"577 0 0 \n",
|
||
"\n",
|
||
"[241 rows x 12 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'y_test'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Access Difficulty</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>265</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>358</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>316</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>907</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1042</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>421</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>936</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>722</th>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1075</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>577</th>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>241 rows × 1 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Access Difficulty\n",
|
||
"265 1\n",
|
||
"358 1\n",
|
||
"316 0\n",
|
||
"907 1\n",
|
||
"1042 1\n",
|
||
"... ...\n",
|
||
"421 1\n",
|
||
"936 0\n",
|
||
"722 1\n",
|
||
"1075 0\n",
|
||
"577 0\n",
|
||
"\n",
|
||
"[241 rows x 1 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"def split_stratified_into_train_val_test(\n",
|
||
" df_input,\n",
|
||
" stratify_colname=\"y\",\n",
|
||
" frac_train=0.6,\n",
|
||
" frac_val=0.15,\n",
|
||
" frac_test=0.25,\n",
|
||
" random_state=None,\n",
|
||
") -> Tuple[DataFrame, DataFrame, DataFrame, DataFrame, DataFrame, DataFrame]:\n",
|
||
" \n",
|
||
" if frac_train + frac_val + frac_test != 1.0:\n",
|
||
" raise ValueError(\n",
|
||
" \"fractions %f, %f, %f do not add up to 1.0\"\n",
|
||
" % (frac_train, frac_val, frac_test)\n",
|
||
" )\n",
|
||
" if stratify_colname not in df_input.columns:\n",
|
||
" raise ValueError(\"%s is not a column in the dataframe\" % (stratify_colname))\n",
|
||
" X = df_input\n",
|
||
" y = df_input[\n",
|
||
" [stratify_colname]\n",
|
||
" ]\n",
|
||
" df_train, df_temp, y_train, y_temp = train_test_split(\n",
|
||
" X, y, stratify=y, test_size=(1.0 - frac_train), random_state=random_state\n",
|
||
" )\n",
|
||
" if frac_val <= 0:\n",
|
||
" assert len(df_input) == len(df_train) + len(df_temp)\n",
|
||
" return df_train, pd.DataFrame(), df_temp, y_train, pd.DataFrame(), y_temp\n",
|
||
" \n",
|
||
" relative_frac_test = frac_test / (frac_val + frac_test)\n",
|
||
" df_val, df_test, y_val, y_test = train_test_split(\n",
|
||
" df_temp,\n",
|
||
" y_temp,\n",
|
||
" stratify=y_temp,\n",
|
||
" test_size=relative_frac_test,\n",
|
||
" random_state=random_state,\n",
|
||
" )\n",
|
||
" assert len(df_input) == len(df_train) + len(df_val) + len(df_test)\n",
|
||
" return df_train, df_val, df_test, y_train, y_val, y_test\n",
|
||
"\n",
|
||
"X_train, X_val, X_test, y_train, y_val, y_test = split_stratified_into_train_val_test(\n",
|
||
" df, stratify_colname=\"Access Difficulty\", frac_train=0.80, frac_val=0, frac_test=0.20, random_state=9\n",
|
||
")\n",
|
||
"\n",
|
||
"display(\"X_train\", X_train)\n",
|
||
"display(\"y_train\", y_train)\n",
|
||
"\n",
|
||
"display(\"X_test\", X_test)\n",
|
||
"display(\"y_test\", y_test)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 107,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Пропущенные значения по столбцам:\n",
|
||
"Education Level 0\n",
|
||
"Institution Type 0\n",
|
||
"Gender 0\n",
|
||
"Age 0\n",
|
||
"Device 0\n",
|
||
"IT Student 0\n",
|
||
"Location 0\n",
|
||
"Financial Condition 0\n",
|
||
"Internet Type 0\n",
|
||
"Network Type 0\n",
|
||
"Flexibility Level 0\n",
|
||
"Access Difficulty 0\n",
|
||
"dtype: int64\n",
|
||
"\n",
|
||
"Статистический обзор данных:\n",
|
||
" Age Flexibility Level Access Difficulty\n",
|
||
"count 1205.000000 1205.000000 1205.000000\n",
|
||
"mean 17.065560 0.684647 0.624896\n",
|
||
"std 5.830369 0.618221 0.484351\n",
|
||
"min 9.000000 0.000000 0.000000\n",
|
||
"25% 11.000000 0.000000 0.000000\n",
|
||
"50% 18.000000 1.000000 1.000000\n",
|
||
"75% 23.000000 1.000000 1.000000\n",
|
||
"max 27.000000 2.000000 1.000000\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"null_values = df.isnull().sum()\n",
|
||
"print(\"Пропущенные значения по столбцам:\")\n",
|
||
"print(null_values)\n",
|
||
"\n",
|
||
"stat_summary = df.describe()\n",
|
||
"print(\"\\nСтатистический обзор данных:\")\n",
|
||
"print(stat_summary)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Формируем конвеер для классификации данных и проверка конвеера"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 108,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Access Difficulty</th>\n",
|
||
" <th>Institution Type_Public</th>\n",
|
||
" <th>Device_Mobile</th>\n",
|
||
" <th>Device_Tab</th>\n",
|
||
" <th>Location_Town</th>\n",
|
||
" <th>Financial Condition_Poor</th>\n",
|
||
" <th>Financial Condition_Rich</th>\n",
|
||
" <th>Internet Type_Wifi</th>\n",
|
||
" <th>Network Type_3G</th>\n",
|
||
" <th>Network Type_4G</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>649</th>\n",
|
||
" <td>-1.289567</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>637</th>\n",
|
||
" <td>0.775454</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>68</th>\n",
|
||
" <td>-1.289567</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>276</th>\n",
|
||
" <td>0.775454</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>547</th>\n",
|
||
" <td>-1.289567</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1097</th>\n",
|
||
" <td>-1.289567</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>854</th>\n",
|
||
" <td>0.775454</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>756</th>\n",
|
||
" <td>-1.289567</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>133</th>\n",
|
||
" <td>0.775454</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>53</th>\n",
|
||
" <td>0.775454</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>964 rows × 10 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Access Difficulty Institution Type_Public Device_Mobile Device_Tab \\\n",
|
||
"649 -1.289567 1.0 1.0 0.0 \n",
|
||
"637 0.775454 0.0 1.0 0.0 \n",
|
||
"68 -1.289567 1.0 1.0 0.0 \n",
|
||
"276 0.775454 0.0 1.0 0.0 \n",
|
||
"547 -1.289567 1.0 1.0 0.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"1097 -1.289567 0.0 1.0 0.0 \n",
|
||
"854 0.775454 1.0 1.0 0.0 \n",
|
||
"756 -1.289567 1.0 0.0 0.0 \n",
|
||
"133 0.775454 1.0 1.0 0.0 \n",
|
||
"53 0.775454 1.0 1.0 0.0 \n",
|
||
"\n",
|
||
" Location_Town Financial Condition_Poor Financial Condition_Rich \\\n",
|
||
"649 1.0 0.0 0.0 \n",
|
||
"637 1.0 0.0 0.0 \n",
|
||
"68 1.0 0.0 0.0 \n",
|
||
"276 1.0 0.0 0.0 \n",
|
||
"547 1.0 0.0 0.0 \n",
|
||
"... ... ... ... \n",
|
||
"1097 1.0 0.0 1.0 \n",
|
||
"854 1.0 0.0 0.0 \n",
|
||
"756 1.0 0.0 0.0 \n",
|
||
"133 1.0 1.0 0.0 \n",
|
||
"53 0.0 1.0 0.0 \n",
|
||
"\n",
|
||
" Internet Type_Wifi Network Type_3G Network Type_4G \n",
|
||
"649 1.0 0.0 1.0 \n",
|
||
"637 0.0 0.0 1.0 \n",
|
||
"68 1.0 0.0 1.0 \n",
|
||
"276 0.0 1.0 0.0 \n",
|
||
"547 1.0 0.0 1.0 \n",
|
||
"... ... ... ... \n",
|
||
"1097 1.0 0.0 1.0 \n",
|
||
"854 0.0 0.0 1.0 \n",
|
||
"756 1.0 1.0 0.0 \n",
|
||
"133 0.0 0.0 1.0 \n",
|
||
"53 0.0 0.0 1.0 \n",
|
||
"\n",
|
||
"[964 rows x 10 columns]"
|
||
]
|
||
},
|
||
"execution_count": 108,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"columns_to_drop = ['Age', 'Education Level', 'Gender', 'IT Student', 'Flexibility Level']\n",
|
||
"num_columns = [\n",
|
||
" column\n",
|
||
" for column in df.columns\n",
|
||
" if column not in columns_to_drop and df[column].dtype != \"object\"\n",
|
||
"]\n",
|
||
"cat_columns = [\n",
|
||
" column\n",
|
||
" for column in df.columns\n",
|
||
" if column not in columns_to_drop and df[column].dtype == \"object\"\n",
|
||
"]\n",
|
||
"\n",
|
||
"num_imputer = SimpleImputer(strategy=\"median\")\n",
|
||
"num_scaler = StandardScaler()\n",
|
||
"preprocessing_num = Pipeline(\n",
|
||
" [\n",
|
||
" (\"imputer\", num_imputer),\n",
|
||
" (\"scaler\", num_scaler),\n",
|
||
" ]\n",
|
||
")\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(\n",
|
||
" [\n",
|
||
" (\"imputer\", cat_imputer),\n",
|
||
" (\"encoder\", cat_encoder),\n",
|
||
" ]\n",
|
||
")\n",
|
||
"\n",
|
||
"features_preprocessing = ColumnTransformer(\n",
|
||
" verbose_feature_names_out=False,\n",
|
||
" transformers=[\n",
|
||
" (\"prepocessing_num\", preprocessing_num, num_columns),\n",
|
||
" (\"prepocessing_cat\", preprocessing_cat, cat_columns),\n",
|
||
" ],\n",
|
||
" remainder=\"passthrough\"\n",
|
||
")\n",
|
||
"\n",
|
||
"drop_columns = ColumnTransformer(\n",
|
||
" verbose_feature_names_out=False,\n",
|
||
" transformers=[\n",
|
||
" (\"drop_columns\", \"drop\", columns_to_drop),\n",
|
||
" ],\n",
|
||
" remainder=\"passthrough\",\n",
|
||
")\n",
|
||
"\n",
|
||
"\n",
|
||
"pipeline_end = Pipeline(\n",
|
||
" [\n",
|
||
" (\"features_preprocessing\", features_preprocessing),\n",
|
||
" (\"drop_columns\", drop_columns),\n",
|
||
" ]\n",
|
||
")\n",
|
||
"\n",
|
||
"preprocessing_result = pipeline_end.fit_transform(X_train)\n",
|
||
"preprocessed_df = pd.DataFrame(\n",
|
||
" preprocessing_result,\n",
|
||
" columns=pipeline_end.get_feature_names_out(),\n",
|
||
")\n",
|
||
"\n",
|
||
"preprocessed_df"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Формируем набор моделей"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 109,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"class_models = {\n",
|
||
" \"logistic\": {\"model\": linear_model.LogisticRegression()},\n",
|
||
" \"ridge\": {\"model\": linear_model.LogisticRegression(penalty=\"l2\", class_weight=\"balanced\")},\n",
|
||
" \"decision_tree\": {\n",
|
||
" \"model\": tree.DecisionTreeClassifier(max_depth=7, random_state=9)\n",
|
||
" },\n",
|
||
" \"knn\": {\"model\": neighbors.KNeighborsClassifier(n_neighbors=7)},\n",
|
||
" \"naive_bayes\": {\"model\": naive_bayes.GaussianNB()},\n",
|
||
" \"gradient_boosting\": {\n",
|
||
" \"model\": ensemble.GradientBoostingClassifier(n_estimators=210)\n",
|
||
" },\n",
|
||
" \"random_forest\": {\n",
|
||
" \"model\": ensemble.RandomForestClassifier(\n",
|
||
" max_depth=11, class_weight=\"balanced\", random_state=9\n",
|
||
" )\n",
|
||
" },\n",
|
||
" \"mlp\": {\n",
|
||
" \"model\": neural_network.MLPClassifier(\n",
|
||
" hidden_layer_sizes=(7,),\n",
|
||
" max_iter=500,\n",
|
||
" early_stopping=True,\n",
|
||
" random_state=9,\n",
|
||
" )\n",
|
||
" },\n",
|
||
"}"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Обучаем модели и тестируем их"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 110,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Model: logistic\n",
|
||
"Model: ridge\n",
|
||
"Model: decision_tree\n",
|
||
"Model: knn\n",
|
||
"Model: naive_bayes\n",
|
||
"Model: gradient_boosting\n",
|
||
"Model: random_forest\n",
|
||
"Model: mlp\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"d:\\ulstu\\cr3\\sem1\\MAI\\AIM-PIbd-31-Makarov-DV\\.venv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
|
||
" _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
|
||
"d:\\ulstu\\cr3\\sem1\\MAI\\AIM-PIbd-31-Makarov-DV\\.venv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
|
||
" _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"for model_name in class_models.keys():\n",
|
||
" print(f\"Model: {model_name}\")\n",
|
||
" model = class_models[model_name][\"model\"]\n",
|
||
"\n",
|
||
" model_pipeline = Pipeline([(\"pipeline\", pipeline_end), (\"model\", model)])\n",
|
||
" model_pipeline = model_pipeline.fit(X_train, y_train.values.ravel())\n",
|
||
"\n",
|
||
" y_train_predict = model_pipeline.predict(X_train)\n",
|
||
" y_test_probs = model_pipeline.predict_proba(X_test)[:, 1]\n",
|
||
" y_test_predict = np.where(y_test_probs > 0.5, 1, 0)\n",
|
||
"\n",
|
||
" class_models[model_name][\"pipeline\"] = model_pipeline\n",
|
||
" class_models[model_name][\"probs\"] = y_test_probs\n",
|
||
" class_models[model_name][\"preds\"] = y_test_predict\n",
|
||
"\n",
|
||
" class_models[model_name][\"Precision_train\"] = metrics.precision_score(\n",
|
||
" y_train, y_train_predict\n",
|
||
" )\n",
|
||
" class_models[model_name][\"Precision_test\"] = metrics.precision_score(\n",
|
||
" y_test, y_test_predict\n",
|
||
" )\n",
|
||
" class_models[model_name][\"Recall_train\"] = metrics.recall_score(\n",
|
||
" y_train, y_train_predict\n",
|
||
" )\n",
|
||
" class_models[model_name][\"Recall_test\"] = metrics.recall_score(\n",
|
||
" y_test, y_test_predict\n",
|
||
" )\n",
|
||
" class_models[model_name][\"Accuracy_train\"] = metrics.accuracy_score(\n",
|
||
" y_train, y_train_predict\n",
|
||
" )\n",
|
||
" class_models[model_name][\"Accuracy_test\"] = metrics.accuracy_score(\n",
|
||
" y_test, y_test_predict\n",
|
||
" )\n",
|
||
" class_models[model_name][\"ROC_AUC_test\"] = metrics.roc_auc_score(\n",
|
||
" y_test, y_test_probs\n",
|
||
" )\n",
|
||
" class_models[model_name][\"F1_train\"] = metrics.f1_score(y_train, y_train_predict, average=None)\n",
|
||
" class_models[model_name][\"F1_test\"] = metrics.f1_score(y_test, y_test_predict, average=None)\n",
|
||
" class_models[model_name][\"MCC_test\"] = metrics.matthews_corrcoef(\n",
|
||
" y_test, y_test_predict\n",
|
||
" )\n",
|
||
" class_models[model_name][\"Cohen_kappa_test\"] = metrics.cohen_kappa_score(\n",
|
||
" y_test, y_test_predict\n",
|
||
" )\n",
|
||
" class_models[model_name][\"Confusion_matrix\"] = metrics.confusion_matrix(\n",
|
||
" y_test, y_test_predict\n",
|
||
" )"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 111,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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Pm3y7F3Lli31F0FX+umnn+7+Jv/gv//9LyIiIvDyyy/r23777bcq/U6fPo1z584hNDRUvx8nJydERUUhKCgIoaGhOHHiBIYPH27W/omIyPEwm6vHbCZr4U09SBWGDx+OBg0aYODAgdi6dStOnjyJrKwsPPfcczhz5gwAYOLEiXj99dexatUqHD58GM8880y1zylp1KgRRo4cidGjR2PVqlX6ba5cuRIAEBERAUVRsGbNGly8eBElJSXw9vZGSkoKJk+ejGXLliE3Nxd79+7Fu+++q78Yd9y4cTh27BheeOEFHDlyBCtWrEBGRoZZ77dZs2Y4ffo0Pv/8c+Tm5mL+/PlGL4J2d3fHyJEjsX//fmzduhXPPfccEhISEBwcDABIT0/Ha6+9hvnz5+Po0aM4cOAAli5din/+859mjYeIiOhOzGZmM1mIrS9iI8fzxwuHzVmfn58vRowYIRo0aCA0Go1o3LixGDNmjCgqKhJCVFwoPHHiROHj4yP8/PzElClTxIgRI0xeOCyEEDdv3hSTJ08WISEhws3NTTRt2lQsWbJEv37GjBkiODhYKIoiRo4cKYSouNh57ty5IioqSri6uoqGDRuK+Ph4sXnzZv3rvvvuO9G0aVOh0WhE9+7dxZIlS8y+cPiFF14Q9evXF15eXmLIkCFizpw5wtfXV78+NTVVtGvXTixcuFCEhoYKd3d38Ze//EUUFhYabDczM1NER0cLNzc34e/vL3r06CG+/vprIQQvHCYiogrMZuOYzVQXFCFMXFVJREREREREVsUpi0RERERERDbCgoyIiIiIiMhGWJARERERERHZCAsyIiIiIiIiG2FBRkREREREZCMsyIiIiIiIiGyEBRkREREREZGNsCAjIiIiIiKyERZkRERERERENsKCjIiIiIiIyEZYkBEREREREdkICzIiIiIiIiIbYUFGRERERERkIyzIyKbS0tKgKIrdbPvUqVNQFAUZGRlWGRMRERHVTGWOX7p0ydZDIbIqFmREdmjt2rVIS0uz9TCIiIiIyMpYkJG0XnnlFdy8edOs10RERODmzZv429/+ZqVR1czatWuRnp5u0zEQERERkfW52HoARNbi4uICFxfz/oorigJ3d3crjcg6ysvLodPp4ObmZuuhEBEREZGZ+A0Z1Zlt27bhoYcegru7O5o0aYL333/faL9PP/0UHTp0gIeH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//d/WLt2LZ577jn06NEDp06dwpIlS9CkSRMUFhZW2GePHj1Qu3ZtfPXVV+jWrRt8fHx01r/wwgtYs2YNRo0ahW3btqFdu3ZQq9U4duwY1qxZg59++gmtW7dGUlISduzYgR49eiAoKAiXL1/GokWLULduXbRv377Kn5GIiMwnISEBP//8M9q1a4fRo0dDrVZj4cKFaNq0KdLT0+/7/h49euCDDz5A165d8fzzz+Py5cv46KOPEBISgj///FO7XVhYGAYOHIhFixYhPz8fbdu2xdatW6v0C4u7uzsWL16MF154AU888QQGDBgAb29vnD17Fj/88APatWun8zzQqnB2dkaTJk2wevVqNGzYEF5eXmjatCmaNm1a5X14eXmhffv2GDp0KC5duoR58+YhJCREO/GFg4MD5syZg6FDhyIiIgIDBw7UTntfr149TJgwQbuvd999F926dUN4eDji4uK0096rVCrt89Fu3LiBunXr4t///jdatGgBV1dXbNmyBb///jvef/997b5atWqF1atXY+LEiXjyySfh6uqKnj17GvX93KtPnz546qmn8MorryAzMxONGjXC999/r704Wx2/ytFDMu8kj2SLyqe9v3cK9nunzv3+++9F8+bNhZOTk6hXr56YM2eOWLZsmc42QlSc9r5cQUGBcHZ2FgDEF198obcvN27cENOmTRMhISHC0dFR1KlTR7Rt21a899572qnqqyIiIkI8/vjjYv/+/SI8PFw4OTmJoKAgsXDhQp3tNBqNmDVrlggKChJKpVK0bNlSbNiwQcTExOid9lYIIcaMGSMAiJUrV+pdX1xcLObMmSMef/xxoVQqhaenp2jVqpVITEwU+fn5Qgghtm7dKnr37i0CAgKEo6OjCAgIEAMHDqww5T8REVm2rVu3ipYtWwpHR0fRoEED8dlnn4lXXnlFODk5abcBYHC69aVLl4rHHntMKJVK0ahRI5GcnKzN5bvdvn1bvPTSS6J27drCxcVF9OzZU2RnZ9932vty27ZtE9HR0UKlUgknJyfRoEEDERsbK/bv36/dJiYmRri4uFToo77+/Prrr6JVq1bC0dHRqCnwy6e9//LLL8W0adOEj4+PcHZ2Fj169BBnzpypsP3q1atFy5YthVKpFF5eXmLQoEHi3LlzFbbbsmWLaNeunXB2dhbu7u6iZ8+e4u+//9auLyoqEpMn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",
|
||
"text/plain": [
|
||
"<Figure size 1200x1000 with 16 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"_, ax = plt.subplots(int(len(class_models) / 2), 2, figsize=(12, 10), sharex=False, sharey=False)\n",
|
||
"for index, key in enumerate(class_models.keys()):\n",
|
||
" c_matrix = class_models[key][\"Confusion_matrix\"]\n",
|
||
" disp = ConfusionMatrixDisplay(\n",
|
||
" confusion_matrix=c_matrix, display_labels=[\"Low dif-ty\", \"High dif-ty\"]\n",
|
||
" ).plot(ax=ax.flat[index])\n",
|
||
" disp.ax_.set_title(key)\n",
|
||
"\n",
|
||
"plt.subplots_adjust(top=1, bottom=0, hspace=0.4, wspace=0.1)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Точность, полнота, верность (аккуратность), F-мера"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 112,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Precision_train</th>\n",
|
||
" <th>Precision_test</th>\n",
|
||
" <th>Recall_train</th>\n",
|
||
" <th>Recall_test</th>\n",
|
||
" <th>Accuracy_train</th>\n",
|
||
" <th>Accuracy_test</th>\n",
|
||
" <th>F1_train</th>\n",
|
||
" <th>F1_test</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>logistic</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>ridge</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>decision_tree</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>knn</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>naive_bayes</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>gradient_boosting</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>random_forest</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>mlp</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.375519</td>\n",
|
||
" <td>0.373444</td>\n",
|
||
" <td>[0.5460030165912518, 0.0]</td>\n",
|
||
" <td>[0.5438066465256798, 0.0]</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Precision_train Precision_test Recall_train Recall_test \\\n",
|
||
"logistic 1.0 1.0 1.0 1.0 \n",
|
||
"ridge 1.0 1.0 1.0 1.0 \n",
|
||
"decision_tree 1.0 1.0 1.0 1.0 \n",
|
||
"knn 1.0 1.0 1.0 1.0 \n",
|
||
"naive_bayes 1.0 1.0 1.0 1.0 \n",
|
||
"gradient_boosting 1.0 1.0 1.0 1.0 \n",
|
||
"random_forest 1.0 1.0 1.0 1.0 \n",
|
||
"mlp 0.0 0.0 0.0 0.0 \n",
|
||
"\n",
|
||
" Accuracy_train Accuracy_test F1_train \\\n",
|
||
"logistic 1.000000 1.000000 [1.0, 1.0] \n",
|
||
"ridge 1.000000 1.000000 [1.0, 1.0] \n",
|
||
"decision_tree 1.000000 1.000000 [1.0, 1.0] \n",
|
||
"knn 1.000000 1.000000 [1.0, 1.0] \n",
|
||
"naive_bayes 1.000000 1.000000 [1.0, 1.0] \n",
|
||
"gradient_boosting 1.000000 1.000000 [1.0, 1.0] \n",
|
||
"random_forest 1.000000 1.000000 [1.0, 1.0] \n",
|
||
"mlp 0.375519 0.373444 [0.5460030165912518, 0.0] \n",
|
||
"\n",
|
||
" F1_test \n",
|
||
"logistic [1.0, 1.0] \n",
|
||
"ridge [1.0, 1.0] \n",
|
||
"decision_tree [1.0, 1.0] \n",
|
||
"knn [1.0, 1.0] \n",
|
||
"naive_bayes [1.0, 1.0] \n",
|
||
"gradient_boosting [1.0, 1.0] \n",
|
||
"random_forest [1.0, 1.0] \n",
|
||
"mlp [0.5438066465256798, 0.0] "
|
||
]
|
||
},
|
||
"execution_count": 112,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"class_metrics = pd.DataFrame.from_dict(class_models, \"index\")[\n",
|
||
" [\n",
|
||
" \"Precision_train\",\n",
|
||
" \"Precision_test\",\n",
|
||
" \"Recall_train\",\n",
|
||
" \"Recall_test\",\n",
|
||
" \"Accuracy_train\",\n",
|
||
" \"Accuracy_test\",\n",
|
||
" \"F1_train\",\n",
|
||
" \"F1_test\",\n",
|
||
" ]\n",
|
||
"]\n",
|
||
"class_metrics.sort_values(\n",
|
||
" by=\"Accuracy_test\", ascending=False\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"ROC-кривая, каппа Коэна, коэффициент корреляции Мэтьюса"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 113,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Accuracy_test</th>\n",
|
||
" <th>F1_test</th>\n",
|
||
" <th>ROC_AUC_test</th>\n",
|
||
" <th>Cohen_kappa_test</th>\n",
|
||
" <th>MCC_test</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>logistic</th>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>ridge</th>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>decision_tree</th>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>knn</th>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>naive_bayes</th>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>gradient_boosting</th>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>random_forest</th>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>mlp</th>\n",
|
||
" <td>0.373444</td>\n",
|
||
" <td>[0.5438066465256798, 0.0]</td>\n",
|
||
" <td>0.068065</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Accuracy_test F1_test ROC_AUC_test \\\n",
|
||
"logistic 1.000000 [1.0, 1.0] 1.000000 \n",
|
||
"ridge 1.000000 [1.0, 1.0] 1.000000 \n",
|
||
"decision_tree 1.000000 [1.0, 1.0] 1.000000 \n",
|
||
"knn 1.000000 [1.0, 1.0] 1.000000 \n",
|
||
"naive_bayes 1.000000 [1.0, 1.0] 1.000000 \n",
|
||
"gradient_boosting 1.000000 [1.0, 1.0] 1.000000 \n",
|
||
"random_forest 1.000000 [1.0, 1.0] 1.000000 \n",
|
||
"mlp 0.373444 [0.5438066465256798, 0.0] 0.068065 \n",
|
||
"\n",
|
||
" Cohen_kappa_test MCC_test \n",
|
||
"logistic 1.0 1.0 \n",
|
||
"ridge 1.0 1.0 \n",
|
||
"decision_tree 1.0 1.0 \n",
|
||
"knn 1.0 1.0 \n",
|
||
"naive_bayes 1.0 1.0 \n",
|
||
"gradient_boosting 1.0 1.0 \n",
|
||
"random_forest 1.0 1.0 \n",
|
||
"mlp 0.0 0.0 "
|
||
]
|
||
},
|
||
"execution_count": 113,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"class_metrics = pd.DataFrame.from_dict(class_models, \"index\")[\n",
|
||
" [\n",
|
||
" \"Accuracy_test\",\n",
|
||
" \"F1_test\",\n",
|
||
" \"ROC_AUC_test\",\n",
|
||
" \"Cohen_kappa_test\",\n",
|
||
" \"MCC_test\",\n",
|
||
" ]\n",
|
||
"]\n",
|
||
"class_metrics.sort_values(by=\"ROC_AUC_test\", ascending=False)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Лучшая модель"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 114,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'logistic'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"best_model = str(class_metrics.sort_values(by=\"MCC_test\", ascending=False).iloc[0].name)\n",
|
||
"\n",
|
||
"display(best_model)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Находим ошибки"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 115,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'Error items count: 0'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Education Level</th>\n",
|
||
" <th>Predicted</th>\n",
|
||
" <th>Institution Type</th>\n",
|
||
" <th>Gender</th>\n",
|
||
" <th>Age</th>\n",
|
||
" <th>Device</th>\n",
|
||
" <th>IT Student</th>\n",
|
||
" <th>Location</th>\n",
|
||
" <th>Financial Condition</th>\n",
|
||
" <th>Internet Type</th>\n",
|
||
" <th>Network Type</th>\n",
|
||
" <th>Flexibility Level</th>\n",
|
||
" <th>Access Difficulty</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
"Empty DataFrame\n",
|
||
"Columns: [Education Level, Predicted, Institution Type, Gender, Age, Device, IT Student, Location, Financial Condition, Internet Type, Network Type, Flexibility Level, Access Difficulty]\n",
|
||
"Index: []"
|
||
]
|
||
},
|
||
"execution_count": 115,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"preprocessing_result = pipeline_end.transform(X_test)\n",
|
||
"preprocessed_df = pd.DataFrame(\n",
|
||
" preprocessing_result,\n",
|
||
" columns=pipeline_end.get_feature_names_out(),\n",
|
||
")\n",
|
||
"\n",
|
||
"y_pred = class_models[best_model][\"preds\"]\n",
|
||
"\n",
|
||
"error_index = y_test[y_test[\"Access Difficulty\"] != y_pred].index.tolist()\n",
|
||
"display(f\"Error items count: {len(error_index)}\")\n",
|
||
"\n",
|
||
"error_predicted = pd.Series(y_pred, index=y_test.index).loc[error_index]\n",
|
||
"error_df = X_test.loc[error_index].copy()\n",
|
||
"error_df.insert(loc=1, column=\"Predicted\", value=error_predicted)\n",
|
||
"error_df.sort_index()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Пример использования модели (конвейера) для предсказания"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 116,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Education Level</th>\n",
|
||
" <th>Institution Type</th>\n",
|
||
" <th>Gender</th>\n",
|
||
" <th>Age</th>\n",
|
||
" <th>Device</th>\n",
|
||
" <th>IT Student</th>\n",
|
||
" <th>Location</th>\n",
|
||
" <th>Financial Condition</th>\n",
|
||
" <th>Internet Type</th>\n",
|
||
" <th>Network Type</th>\n",
|
||
" <th>Flexibility Level</th>\n",
|
||
" <th>Access Difficulty</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>450</th>\n",
|
||
" <td>School</td>\n",
|
||
" <td>Private</td>\n",
|
||
" <td>Female</td>\n",
|
||
" <td>11</td>\n",
|
||
" <td>Mobile</td>\n",
|
||
" <td>No</td>\n",
|
||
" <td>Town</td>\n",
|
||
" <td>Poor</td>\n",
|
||
" <td>Mobile Data</td>\n",
|
||
" <td>4G</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Education Level Institution Type Gender Age Device IT Student Location \\\n",
|
||
"450 School Private Female 11 Mobile No Town \n",
|
||
"\n",
|
||
" Financial Condition Internet Type Network Type Flexibility Level \\\n",
|
||
"450 Poor Mobile Data 4G 1 \n",
|
||
"\n",
|
||
" Access Difficulty \n",
|
||
"450 1 "
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Access Difficulty</th>\n",
|
||
" <th>Institution Type_Public</th>\n",
|
||
" <th>Device_Mobile</th>\n",
|
||
" <th>Device_Tab</th>\n",
|
||
" <th>Location_Town</th>\n",
|
||
" <th>Financial Condition_Poor</th>\n",
|
||
" <th>Financial Condition_Rich</th>\n",
|
||
" <th>Internet Type_Wifi</th>\n",
|
||
" <th>Network Type_3G</th>\n",
|
||
" <th>Network Type_4G</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>450</th>\n",
|
||
" <td>0.775454</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Access Difficulty Institution Type_Public Device_Mobile Device_Tab \\\n",
|
||
"450 0.775454 0.0 1.0 0.0 \n",
|
||
"\n",
|
||
" Location_Town Financial Condition_Poor Financial Condition_Rich \\\n",
|
||
"450 1.0 1.0 0.0 \n",
|
||
"\n",
|
||
" Internet Type_Wifi Network Type_3G Network Type_4G \n",
|
||
"450 0.0 0.0 1.0 "
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'predicted: 1 (proba: [0.00310819 0.99689181])'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'real: 1'"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"model = class_models[best_model][\"pipeline\"]\n",
|
||
"\n",
|
||
"example_id = 450\n",
|
||
"test = pd.DataFrame(X_test.loc[example_id, :]).T\n",
|
||
"test_preprocessed = pd.DataFrame(preprocessed_df.loc[example_id, :]).T\n",
|
||
"display(test)\n",
|
||
"display(test_preprocessed)\n",
|
||
"result_proba = model.predict_proba(test)[0]\n",
|
||
"result = model.predict(test)[0]\n",
|
||
"real = int(y_test.loc[example_id].values[0])\n",
|
||
"display(f\"predicted: {result} (proba: {result_proba})\")\n",
|
||
"display(f\"real: {real}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Создаем гиперпараметры методом поиска по сетке. "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 121,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"{'model__criterion': 'gini',\n",
|
||
" 'model__max_depth': 2,\n",
|
||
" 'model__max_features': 'sqrt',\n",
|
||
" 'model__n_estimators': 10}"
|
||
]
|
||
},
|
||
"execution_count": 121,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"optimized_model_type = 'random_forest'\n",
|
||
"random_state = 9\n",
|
||
"\n",
|
||
"random_forest_model = class_models[optimized_model_type][\"pipeline\"]\n",
|
||
"\n",
|
||
"param_grid = {\n",
|
||
" \"model__n_estimators\": [10, 20, 30, 40, 50, 100, 150, 200, 250, 500],\n",
|
||
" \"model__max_features\": [\"sqrt\", \"log2\", 2],\n",
|
||
" \"model__max_depth\": [2, 3, 4, 5, 6, 7, 8, 9 ,10],\n",
|
||
" \"model__criterion\": [\"gini\", \"entropy\", \"log_loss\"],\n",
|
||
"}\n",
|
||
"\n",
|
||
"gs_optomizer = GridSearchCV(\n",
|
||
" estimator=random_forest_model, param_grid=param_grid, n_jobs=-1\n",
|
||
")\n",
|
||
"gs_optomizer.fit(X_train, y_train.values.ravel())\n",
|
||
"gs_optomizer.best_params_"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Обучение модели с новыми гиперпараметрами"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 122,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"optimized_model = ensemble.RandomForestClassifier(\n",
|
||
" random_state=random_state,\n",
|
||
" criterion=\"gini\",\n",
|
||
" max_depth=2,\n",
|
||
" max_features=\"sqrt\",\n",
|
||
" n_estimators=10,\n",
|
||
")\n",
|
||
"\n",
|
||
"result = {}\n",
|
||
"\n",
|
||
"result[\"pipeline\"] = Pipeline([(\"pipeline\", pipeline_end), (\"model\", optimized_model)]).fit(X_train, y_train.values.ravel())\n",
|
||
"result[\"train_preds\"] = result[\"pipeline\"].predict(X_train)\n",
|
||
"result[\"probs\"] = result[\"pipeline\"].predict_proba(X_test)[:, 1]\n",
|
||
"result[\"preds\"] = np.where(result[\"probs\"] > 0.5, 1, 0)\n",
|
||
"\n",
|
||
"result[\"Precision_train\"] = metrics.precision_score(y_train, result[\"train_preds\"])\n",
|
||
"result[\"Precision_test\"] = metrics.precision_score(y_test, result[\"preds\"])\n",
|
||
"result[\"Recall_train\"] = metrics.recall_score(y_train, result[\"train_preds\"])\n",
|
||
"result[\"Recall_test\"] = metrics.recall_score(y_test, result[\"preds\"])\n",
|
||
"result[\"Accuracy_train\"] = metrics.accuracy_score(y_train, result[\"train_preds\"])\n",
|
||
"result[\"Accuracy_test\"] = metrics.accuracy_score(y_test, result[\"preds\"])\n",
|
||
"result[\"ROC_AUC_test\"] = metrics.roc_auc_score(y_test, result[\"probs\"])\n",
|
||
"result[\"F1_train\"] = metrics.f1_score(y_train, result[\"train_preds\"])\n",
|
||
"result[\"F1_test\"] = metrics.f1_score(y_test, result[\"preds\"])\n",
|
||
"result[\"MCC_test\"] = metrics.matthews_corrcoef(y_test, result[\"preds\"])\n",
|
||
"result[\"Cohen_kappa_test\"] = metrics.cohen_kappa_score(y_test, result[\"preds\"])\n",
|
||
"result[\"Confusion_matrix\"] = metrics.confusion_matrix(y_test, result[\"preds\"])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Формирование данных для оценки старой и новой версии модели и сама оценка данных"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 124,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Precision_train</th>\n",
|
||
" <th>Precision_test</th>\n",
|
||
" <th>Recall_train</th>\n",
|
||
" <th>Recall_test</th>\n",
|
||
" <th>Accuracy_train</th>\n",
|
||
" <th>Accuracy_test</th>\n",
|
||
" <th>F1_train</th>\n",
|
||
" <th>F1_test</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>Name</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>Old</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>New</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Precision_train Precision_test Recall_train Recall_test Accuracy_train \\\n",
|
||
"Name \n",
|
||
"Old 1.0 1.0 1.0 1.0 1.0 \n",
|
||
"New 1.0 1.0 1.0 1.0 1.0 \n",
|
||
"\n",
|
||
" Accuracy_test F1_train F1_test \n",
|
||
"Name \n",
|
||
"Old 1.0 [1.0, 1.0] [1.0, 1.0] \n",
|
||
"New 1.0 1.0 1.0 "
|
||
]
|
||
},
|
||
"execution_count": 124,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"optimized_metrics = pd.DataFrame(columns=list(result.keys()))\n",
|
||
"optimized_metrics.loc[len(optimized_metrics)] = pd.Series(\n",
|
||
" data=class_models[optimized_model_type]\n",
|
||
")\n",
|
||
"optimized_metrics.loc[len(optimized_metrics)] = pd.Series(\n",
|
||
" data=result\n",
|
||
")\n",
|
||
"optimized_metrics.insert(loc=0, column=\"Name\", value=[\"Old\", \"New\"])\n",
|
||
"optimized_metrics = optimized_metrics.set_index(\"Name\")\n",
|
||
"\n",
|
||
"optimized_metrics[\n",
|
||
" [\n",
|
||
" \"Precision_train\",\n",
|
||
" \"Precision_test\",\n",
|
||
" \"Recall_train\",\n",
|
||
" \"Recall_test\",\n",
|
||
" \"Accuracy_train\",\n",
|
||
" \"Accuracy_test\",\n",
|
||
" \"F1_train\",\n",
|
||
" \"F1_test\",\n",
|
||
" ]\n",
|
||
"]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 125,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Accuracy_test</th>\n",
|
||
" <th>F1_test</th>\n",
|
||
" <th>ROC_AUC_test</th>\n",
|
||
" <th>Cohen_kappa_test</th>\n",
|
||
" <th>MCC_test</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>Name</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>Old</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>[1.0, 1.0]</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>New</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Accuracy_test F1_test ROC_AUC_test Cohen_kappa_test MCC_test\n",
|
||
"Name \n",
|
||
"Old 1.0 [1.0, 1.0] 1.0 1.0 1.0\n",
|
||
"New 1.0 1.0 1.0 1.0 1.0"
|
||
]
|
||
},
|
||
"execution_count": 125,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"optimized_metrics[\n",
|
||
" [\n",
|
||
" \"Accuracy_test\",\n",
|
||
" \"F1_test\",\n",
|
||
" \"ROC_AUC_test\",\n",
|
||
" \"Cohen_kappa_test\",\n",
|
||
" \"MCC_test\",\n",
|
||
" ]\n",
|
||
"]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 127,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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",
|
||
"text/plain": [
|
||
"<Figure size 1000x400 with 4 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"_, ax = plt.subplots(1, 2, figsize=(10, 4), sharex=False, sharey=False\n",
|
||
")\n",
|
||
"\n",
|
||
"for index in range(0, len(optimized_metrics)):\n",
|
||
" c_matrix = optimized_metrics.iloc[index][\"Confusion_matrix\"]\n",
|
||
" disp = ConfusionMatrixDisplay(\n",
|
||
" confusion_matrix=c_matrix, display_labels=[\"Low dif-ty\", \"High dif-ty\"]\n",
|
||
" ).plot(ax=ax.flat[index])\n",
|
||
"\n",
|
||
"plt.subplots_adjust(top=1, bottom=0, hspace=0.4, wspace=0.3)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Модель идеально классифицировала объекты, которые относятся к \"High difficulty\" и \"Low difficulty\"."
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": ".venv",
|
||
"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.13.0"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|