{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Trenujemy klasyfikator dla Irysów"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from pycaret.classification import setup as cls_setup, compare_models as cls_compare_models, finalize_model as cls_finalize_model, predict_model as cls_predict_model, plot_model as cls_plot_model, save_model as cls_save_model\n",
"from pycaret.regression import setup as reg_setup, compare_models as reg_compare_models, finalize_model as reg_finalize_model, predict_model as reg_predict_model, plot_model as reg_plot_model, save_model as reg_save_model\n",
"from pycaret.datasets import get_data\n",
"import pandas as pd\n",
"from IPython.display import Markdown, display"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Wyświetlenie wszystkich dostępnych zbiorów danych"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Dataset | \n",
" Data Types | \n",
" Default Task | \n",
" Target Variable 1 | \n",
" Target Variable 2 | \n",
" # Instances | \n",
" # Attributes | \n",
" Missing Values | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" anomaly | \n",
" Multivariate | \n",
" Anomaly Detection | \n",
" NaN | \n",
" NaN | \n",
" 1000 | \n",
" 10 | \n",
" N | \n",
"
\n",
" \n",
" 1 | \n",
" france | \n",
" Multivariate | \n",
" Association Rule Mining | \n",
" InvoiceNo | \n",
" Description | \n",
" 8557 | \n",
" 8 | \n",
" N | \n",
"
\n",
" \n",
" 2 | \n",
" germany | \n",
" Multivariate | \n",
" Association Rule Mining | \n",
" InvoiceNo | \n",
" Description | \n",
" 9495 | \n",
" 8 | \n",
" N | \n",
"
\n",
" \n",
" 3 | \n",
" bank | \n",
" Multivariate | \n",
" Classification (Binary) | \n",
" deposit | \n",
" NaN | \n",
" 45211 | \n",
" 17 | \n",
" N | \n",
"
\n",
" \n",
" 4 | \n",
" blood | \n",
" Multivariate | \n",
" Classification (Binary) | \n",
" Class | \n",
" NaN | \n",
" 748 | \n",
" 5 | \n",
" N | \n",
"
\n",
" \n",
" 5 | \n",
" cancer | \n",
" Multivariate | \n",
" Classification (Binary) | \n",
" Class | \n",
" NaN | \n",
" 683 | \n",
" 10 | \n",
" N | \n",
"
\n",
" \n",
" 6 | \n",
" credit | \n",
" Multivariate | \n",
" Classification (Binary) | \n",
" default | \n",
" NaN | \n",
" 24000 | \n",
" 24 | \n",
" N | \n",
"
\n",
" \n",
" 7 | \n",
" diabetes | \n",
" Multivariate | \n",
" Classification (Binary) | \n",
" Class variable | \n",
" NaN | \n",
" 768 | \n",
" 9 | \n",
" N | \n",
"
\n",
" \n",
" 8 | \n",
" electrical_grid | \n",
" Multivariate | \n",
" Classification (Binary) | \n",
" stabf | \n",
" NaN | \n",
" 10000 | \n",
" 14 | \n",
" N | \n",
"
\n",
" \n",
" 9 | \n",
" employee | \n",
" Multivariate | \n",
" Classification (Binary) | \n",
" left | \n",
" NaN | \n",
" 14999 | \n",
" 10 | \n",
" N | \n",
"
\n",
" \n",
" 10 | \n",
" heart | \n",
" Multivariate | \n",
" Classification (Binary) | \n",
" DEATH | \n",
" NaN | \n",
" 200 | \n",
" 16 | \n",
" N | \n",
"
\n",
" \n",
" 11 | \n",
" heart_disease | \n",
" Multivariate | \n",
" Classification (Binary) | \n",
" Disease | \n",
" NaN | \n",
" 270 | \n",
" 14 | \n",
" N | \n",
"
\n",
" \n",
" 12 | \n",
" hepatitis | \n",
" Multivariate | \n",
" Classification (Binary) | \n",
" Class | \n",
" NaN | \n",
" 154 | \n",
" 32 | \n",
" Y | \n",
"
\n",
" \n",
" 13 | \n",
" income | \n",
" Multivariate | \n",
" Classification (Binary) | \n",
" income >50K | \n",
" NaN | \n",
" 32561 | \n",
" 14 | \n",
" Y | \n",
"
\n",
" \n",
" 14 | \n",
" juice | \n",
" Multivariate | \n",
" Classification (Binary) | \n",
" Purchase | \n",
" NaN | \n",
" 1070 | \n",
" 15 | \n",
" N | \n",
"
\n",
" \n",
" 15 | \n",
" nba | \n",
" Multivariate | \n",
" Classification (Binary) | \n",
" TARGET_5Yrs | \n",
" NaN | \n",
" 1340 | \n",
" 21 | \n",
" N | \n",
"
\n",
" \n",
" 16 | \n",
" wine | \n",
" Multivariate | \n",
" Classification (Binary) | \n",
" type | \n",
" NaN | \n",
" 6498 | \n",
" 13 | \n",
" N | \n",
"
\n",
" \n",
" 17 | \n",
" telescope | \n",
" Multivariate | \n",
" Classification (Binary) | \n",
" Class | \n",
" NaN | \n",
" 19020 | \n",
" 11 | \n",
" N | \n",
"
\n",
" \n",
" 18 | \n",
" titanic | \n",
" Multivariate | \n",
" Classification (Binary) | \n",
" Survived | \n",
" NaN | \n",
" 891 | \n",
" 11 | \n",
" Y | \n",
"
\n",
" \n",
" 19 | \n",
" us_presidential_election_results | \n",
" Multivariate | \n",
" Classification (Binary) | \n",
" party_winner | \n",
" NaN | \n",
" 497 | \n",
" 7 | \n",
" N | \n",
"
\n",
" \n",
" 20 | \n",
" glass | \n",
" Multivariate | \n",
" Classification (Multiclass) | \n",
" Type | \n",
" NaN | \n",
" 214 | \n",
" 10 | \n",
" N | \n",
"
\n",
" \n",
" 21 | \n",
" iris | \n",
" Multivariate | \n",
" Classification (Multiclass) | \n",
" species | \n",
" NaN | \n",
" 150 | \n",
" 5 | \n",
" N | \n",
"
\n",
" \n",
" 22 | \n",
" poker | \n",
" Multivariate | \n",
" Classification (Multiclass) | \n",
" CLASS | \n",
" NaN | \n",
" 100000 | \n",
" 11 | \n",
" N | \n",
"
\n",
" \n",
" 23 | \n",
" questions | \n",
" Multivariate | \n",
" Classification (Multiclass) | \n",
" Next_Question | \n",
" NaN | \n",
" 499 | \n",
" 4 | \n",
" N | \n",
"
\n",
" \n",
" 24 | \n",
" satellite | \n",
" Multivariate | \n",
" Classification (Multiclass) | \n",
" Class | \n",
" NaN | \n",
" 6435 | \n",
" 37 | \n",
" N | \n",
"
\n",
" \n",
" 25 | \n",
" CTG | \n",
" Multivariate | \n",
" Classification (Multiclass) | \n",
" NSP | \n",
" NaN | \n",
" 2129 | \n",
" 40 | \n",
" Y | \n",
"
\n",
" \n",
" 26 | \n",
" asia_gdp | \n",
" Multivariate | \n",
" Clustering | \n",
" NaN | \n",
" NaN | \n",
" 40 | \n",
" 11 | \n",
" N | \n",
"
\n",
" \n",
" 27 | \n",
" elections | \n",
" Multivariate | \n",
" Clustering | \n",
" NaN | \n",
" NaN | \n",
" 3195 | \n",
" 54 | \n",
" Y | \n",
"
\n",
" \n",
" 28 | \n",
" facebook | \n",
" Multivariate | \n",
" Clustering | \n",
" NaN | \n",
" NaN | \n",
" 7050 | \n",
" 12 | \n",
" N | \n",
"
\n",
" \n",
" 29 | \n",
" ipl | \n",
" Multivariate | \n",
" Clustering | \n",
" NaN | \n",
" NaN | \n",
" 153 | \n",
" 25 | \n",
" N | \n",
"
\n",
" \n",
" 30 | \n",
" jewellery | \n",
" Multivariate | \n",
" Clustering | \n",
" NaN | \n",
" NaN | \n",
" 505 | \n",
" 4 | \n",
" N | \n",
"
\n",
" \n",
" 31 | \n",
" mice | \n",
" Multivariate | \n",
" Clustering | \n",
" NaN | \n",
" NaN | \n",
" 1080 | \n",
" 82 | \n",
" Y | \n",
"
\n",
" \n",
" 32 | \n",
" migration | \n",
" Multivariate | \n",
" Clustering | \n",
" NaN | \n",
" NaN | \n",
" 233 | \n",
" 12 | \n",
" N | \n",
"
\n",
" \n",
" 33 | \n",
" perfume | \n",
" Multivariate | \n",
" Clustering | \n",
" NaN | \n",
" NaN | \n",
" 20 | \n",
" 29 | \n",
" N | \n",
"
\n",
" \n",
" 34 | \n",
" pokemon | \n",
" Multivariate | \n",
" Clustering | \n",
" NaN | \n",
" NaN | \n",
" 800 | \n",
" 13 | \n",
" Y | \n",
"
\n",
" \n",
" 35 | \n",
" population | \n",
" Multivariate | \n",
" Clustering | \n",
" NaN | \n",
" NaN | \n",
" 255 | \n",
" 56 | \n",
" Y | \n",
"
\n",
" \n",
" 36 | \n",
" public_health | \n",
" Multivariate | \n",
" Clustering | \n",
" NaN | \n",
" NaN | \n",
" 224 | \n",
" 21 | \n",
" N | \n",
"
\n",
" \n",
" 37 | \n",
" seeds | \n",
" Multivariate | \n",
" Clustering | \n",
" NaN | \n",
" NaN | \n",
" 210 | \n",
" 7 | \n",
" N | \n",
"
\n",
" \n",
" 38 | \n",
" wholesale | \n",
" Multivariate | \n",
" Clustering | \n",
" NaN | \n",
" NaN | \n",
" 440 | \n",
" 8 | \n",
" N | \n",
"
\n",
" \n",
" 39 | \n",
" tweets | \n",
" Text | \n",
" NLP | \n",
" tweet | \n",
" NaN | \n",
" 8594 | \n",
" 2 | \n",
" N | \n",
"
\n",
" \n",
" 40 | \n",
" amazon | \n",
" Text | \n",
" NLP / Classification | \n",
" reviewText | \n",
" NaN | \n",
" 20000 | \n",
" 2 | \n",
" N | \n",
"
\n",
" \n",
" 41 | \n",
" kiva | \n",
" Text | \n",
" NLP / Classification | \n",
" en | \n",
" NaN | \n",
" 6818 | \n",
" 7 | \n",
" N | \n",
"
\n",
" \n",
" 42 | \n",
" spx | \n",
" Text | \n",
" NLP / Regression | \n",
" text | \n",
" NaN | \n",
" 874 | \n",
" 4 | \n",
" N | \n",
"
\n",
" \n",
" 43 | \n",
" wikipedia | \n",
" Text | \n",
" NLP / Classification | \n",
" Text | \n",
" NaN | \n",
" 500 | \n",
" 3 | \n",
" N | \n",
"
\n",
" \n",
" 44 | \n",
" automobile | \n",
" Multivariate | \n",
" Regression | \n",
" price | \n",
" NaN | \n",
" 202 | \n",
" 26 | \n",
" Y | \n",
"
\n",
" \n",
" 45 | \n",
" bike | \n",
" Multivariate | \n",
" Regression | \n",
" cnt | \n",
" NaN | \n",
" 17379 | \n",
" 15 | \n",
" N | \n",
"
\n",
" \n",
" 46 | \n",
" boston | \n",
" Multivariate | \n",
" Regression | \n",
" medv | \n",
" NaN | \n",
" 506 | \n",
" 14 | \n",
" N | \n",
"
\n",
" \n",
" 47 | \n",
" concrete | \n",
" Multivariate | \n",
" Regression | \n",
" strength | \n",
" NaN | \n",
" 1030 | \n",
" 9 | \n",
" N | \n",
"
\n",
" \n",
" 48 | \n",
" diamond | \n",
" Multivariate | \n",
" Regression | \n",
" Price | \n",
" NaN | \n",
" 6000 | \n",
" 8 | \n",
" N | \n",
"
\n",
" \n",
" 49 | \n",
" energy | \n",
" Multivariate | \n",
" Regression | \n",
" Heating Load | \n",
" Cooling Load | \n",
" 768 | \n",
" 10 | \n",
" N | \n",
"
\n",
" \n",
" 50 | \n",
" forest | \n",
" Multivariate | \n",
" Regression | \n",
" area | \n",
" NaN | \n",
" 517 | \n",
" 13 | \n",
" N | \n",
"
\n",
" \n",
" 51 | \n",
" gold | \n",
" Multivariate | \n",
" Regression | \n",
" Gold_T+22 | \n",
" NaN | \n",
" 2558 | \n",
" 121 | \n",
" N | \n",
"
\n",
" \n",
" 52 | \n",
" house | \n",
" Multivariate | \n",
" Regression | \n",
" SalePrice | \n",
" NaN | \n",
" 1461 | \n",
" 81 | \n",
" Y | \n",
"
\n",
" \n",
" 53 | \n",
" insurance | \n",
" Multivariate | \n",
" Regression | \n",
" charges | \n",
" NaN | \n",
" 1338 | \n",
" 7 | \n",
" N | \n",
"
\n",
" \n",
" 54 | \n",
" parkinsons | \n",
" Multivariate | \n",
" Regression | \n",
" PPE | \n",
" NaN | \n",
" 5875 | \n",
" 22 | \n",
" N | \n",
"
\n",
" \n",
" 55 | \n",
" traffic | \n",
" Multivariate | \n",
" Regression | \n",
" traffic_volume | \n",
" NaN | \n",
" 48204 | \n",
" 8 | \n",
" N | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Dataset Data Types \\\n",
"0 anomaly Multivariate \n",
"1 france Multivariate \n",
"2 germany Multivariate \n",
"3 bank Multivariate \n",
"4 blood Multivariate \n",
"5 cancer Multivariate \n",
"6 credit Multivariate \n",
"7 diabetes Multivariate \n",
"8 electrical_grid Multivariate \n",
"9 employee Multivariate \n",
"10 heart Multivariate \n",
"11 heart_disease Multivariate \n",
"12 hepatitis Multivariate \n",
"13 income Multivariate \n",
"14 juice Multivariate \n",
"15 nba Multivariate \n",
"16 wine Multivariate \n",
"17 telescope Multivariate \n",
"18 titanic Multivariate \n",
"19 us_presidential_election_results Multivariate \n",
"20 glass Multivariate \n",
"21 iris Multivariate \n",
"22 poker Multivariate \n",
"23 questions Multivariate \n",
"24 satellite Multivariate \n",
"25 CTG Multivariate \n",
"26 asia_gdp Multivariate \n",
"27 elections Multivariate \n",
"28 facebook Multivariate \n",
"29 ipl Multivariate \n",
"30 jewellery Multivariate \n",
"31 mice Multivariate \n",
"32 migration Multivariate \n",
"33 perfume Multivariate \n",
"34 pokemon Multivariate \n",
"35 population Multivariate \n",
"36 public_health Multivariate \n",
"37 seeds Multivariate \n",
"38 wholesale Multivariate \n",
"39 tweets Text \n",
"40 amazon Text \n",
"41 kiva Text \n",
"42 spx Text \n",
"43 wikipedia Text \n",
"44 automobile Multivariate \n",
"45 bike Multivariate \n",
"46 boston Multivariate \n",
"47 concrete Multivariate \n",
"48 diamond Multivariate \n",
"49 energy Multivariate \n",
"50 forest Multivariate \n",
"51 gold Multivariate \n",
"52 house Multivariate \n",
"53 insurance Multivariate \n",
"54 parkinsons Multivariate \n",
"55 traffic Multivariate \n",
"\n",
" Default Task Target Variable 1 Target Variable 2 \\\n",
"0 Anomaly Detection NaN NaN \n",
"1 Association Rule Mining InvoiceNo Description \n",
"2 Association Rule Mining InvoiceNo Description \n",
"3 Classification (Binary) deposit NaN \n",
"4 Classification (Binary) Class NaN \n",
"5 Classification (Binary) Class NaN \n",
"6 Classification (Binary) default NaN \n",
"7 Classification (Binary) Class variable NaN \n",
"8 Classification (Binary) stabf NaN \n",
"9 Classification (Binary) left NaN \n",
"10 Classification (Binary) DEATH NaN \n",
"11 Classification (Binary) Disease NaN \n",
"12 Classification (Binary) Class NaN \n",
"13 Classification (Binary) income >50K NaN \n",
"14 Classification (Binary) Purchase NaN \n",
"15 Classification (Binary) TARGET_5Yrs NaN \n",
"16 Classification (Binary) type NaN \n",
"17 Classification (Binary) Class NaN \n",
"18 Classification (Binary) Survived NaN \n",
"19 Classification (Binary) party_winner NaN \n",
"20 Classification (Multiclass) Type NaN \n",
"21 Classification (Multiclass) species NaN \n",
"22 Classification (Multiclass) CLASS NaN \n",
"23 Classification (Multiclass) Next_Question NaN \n",
"24 Classification (Multiclass) Class NaN \n",
"25 Classification (Multiclass) NSP NaN \n",
"26 Clustering NaN NaN \n",
"27 Clustering NaN NaN \n",
"28 Clustering NaN NaN \n",
"29 Clustering NaN NaN \n",
"30 Clustering NaN NaN \n",
"31 Clustering NaN NaN \n",
"32 Clustering NaN NaN \n",
"33 Clustering NaN NaN \n",
"34 Clustering NaN NaN \n",
"35 Clustering NaN NaN \n",
"36 Clustering NaN NaN \n",
"37 Clustering NaN NaN \n",
"38 Clustering NaN NaN \n",
"39 NLP tweet NaN \n",
"40 NLP / Classification reviewText NaN \n",
"41 NLP / Classification en NaN \n",
"42 NLP / Regression text NaN \n",
"43 NLP / Classification Text NaN \n",
"44 Regression price NaN \n",
"45 Regression cnt NaN \n",
"46 Regression medv NaN \n",
"47 Regression strength NaN \n",
"48 Regression Price NaN \n",
"49 Regression Heating Load Cooling Load \n",
"50 Regression area NaN \n",
"51 Regression Gold_T+22 NaN \n",
"52 Regression SalePrice NaN \n",
"53 Regression charges NaN \n",
"54 Regression PPE NaN \n",
"55 Regression traffic_volume NaN \n",
"\n",
" # Instances # Attributes Missing Values \n",
"0 1000 10 N \n",
"1 8557 8 N \n",
"2 9495 8 N \n",
"3 45211 17 N \n",
"4 748 5 N \n",
"5 683 10 N \n",
"6 24000 24 N \n",
"7 768 9 N \n",
"8 10000 14 N \n",
"9 14999 10 N \n",
"10 200 16 N \n",
"11 270 14 N \n",
"12 154 32 Y \n",
"13 32561 14 Y \n",
"14 1070 15 N \n",
"15 1340 21 N \n",
"16 6498 13 N \n",
"17 19020 11 N \n",
"18 891 11 Y \n",
"19 497 7 N \n",
"20 214 10 N \n",
"21 150 5 N \n",
"22 100000 11 N \n",
"23 499 4 N \n",
"24 6435 37 N \n",
"25 2129 40 Y \n",
"26 40 11 N \n",
"27 3195 54 Y \n",
"28 7050 12 N \n",
"29 153 25 N \n",
"30 505 4 N \n",
"31 1080 82 Y \n",
"32 233 12 N \n",
"33 20 29 N \n",
"34 800 13 Y \n",
"35 255 56 Y \n",
"36 224 21 N \n",
"37 210 7 N \n",
"38 440 8 N \n",
"39 8594 2 N \n",
"40 20000 2 N \n",
"41 6818 7 N \n",
"42 874 4 N \n",
"43 500 3 N \n",
"44 202 26 Y \n",
"45 17379 15 N \n",
"46 506 14 N \n",
"47 1030 9 N \n",
"48 6000 8 N \n",
"49 768 10 N \n",
"50 517 13 N \n",
"51 2558 121 N \n",
"52 1461 81 Y \n",
"53 1338 7 N \n",
"54 5875 22 N \n",
"55 48204 8 N "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dataset_df = get_data('index', verbose=False)\n",
"dataset_df"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" PassengerId | \n",
" Survived | \n",
" Pclass | \n",
" Name | \n",
" Sex | \n",
" Age | \n",
" SibSp | \n",
" Parch | \n",
" Ticket | \n",
" Fare | \n",
" Cabin | \n",
" Embarked | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 3 | \n",
" Braund, Mr. Owen Harris | \n",
" male | \n",
" 22.0 | \n",
" 1 | \n",
" 0 | \n",
" A/5 21171 | \n",
" 7.2500 | \n",
" NaN | \n",
" S | \n",
"
\n",
" \n",
" 1 | \n",
" 2 | \n",
" 1 | \n",
" 1 | \n",
" Cumings, Mrs. John Bradley (Florence Briggs Th... | \n",
" female | \n",
" 38.0 | \n",
" 1 | \n",
" 0 | \n",
" PC 17599 | \n",
" 71.2833 | \n",
" C85 | \n",
" C | \n",
"
\n",
" \n",
" 2 | \n",
" 3 | \n",
" 1 | \n",
" 3 | \n",
" Heikkinen, Miss. Laina | \n",
" female | \n",
" 26.0 | \n",
" 0 | \n",
" 0 | \n",
" STON/O2. 3101282 | \n",
" 7.9250 | \n",
" NaN | \n",
" S | \n",
"
\n",
" \n",
" 3 | \n",
" 4 | \n",
" 1 | \n",
" 1 | \n",
" Futrelle, Mrs. Jacques Heath (Lily May Peel) | \n",
" female | \n",
" 35.0 | \n",
" 1 | \n",
" 0 | \n",
" 113803 | \n",
" 53.1000 | \n",
" C123 | \n",
" S | \n",
"
\n",
" \n",
" 4 | \n",
" 5 | \n",
" 0 | \n",
" 3 | \n",
" Allen, Mr. William Henry | \n",
" male | \n",
" 35.0 | \n",
" 0 | \n",
" 0 | \n",
" 373450 | \n",
" 8.0500 | \n",
" NaN | \n",
" S | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" PassengerId Survived Pclass \\\n",
"0 1 0 3 \n",
"1 2 1 1 \n",
"2 3 1 3 \n",
"3 4 1 1 \n",
"4 5 0 3 \n",
"\n",
" Name Sex Age SibSp \\\n",
"0 Braund, Mr. Owen Harris male 22.0 1 \n",
"1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n",
"2 Heikkinen, Miss. Laina female 26.0 0 \n",
"3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n",
"4 Allen, Mr. William Henry male 35.0 0 \n",
"\n",
" Parch Ticket Fare Cabin Embarked \n",
"0 0 A/5 21171 7.2500 NaN S \n",
"1 0 PC 17599 71.2833 C85 C \n",
"2 0 STON/O2. 3101282 7.9250 NaN S \n",
"3 0 113803 53.1000 C123 S \n",
"4 0 373450 8.0500 NaN S "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df = get_data('titanic')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Ilość rekordów"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"891"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(df)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Brakujące wartości"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.22446689113355783"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['Embarked'].isnull().sum() / len(df['Embarked']) *100"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Setup"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/markdown": [
"## Mamy do czynienia z problemem: **Klasyfikacji**"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"target_column = 'Survived'\n",
"cls_setup(data=df, target=target_column, session_id=123, verbose=False)\n",
"#reg_setup(data=df, target='petal_width', session_id=123, verbose=False)\n",
"\n",
"# Sprawdzenie czy to model: REGRESJI czy KLASYFIKACJI\n",
"if target_column:\n",
" if (pd.api.types.is_numeric_dtype(df[target_column])) and (df[target_column].nunique() > 10):\n",
" display(Markdown('## Mamy do czynienia z problemem: **Regresji**'))\n",
" else:\n",
" display(Markdown('## Mamy do czynienia z problemem: **Klasyfikacji**'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Compare Models"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
"\n",
" \n",
" \n",
" | \n",
" Model | \n",
" Accuracy | \n",
" AUC | \n",
" Recall | \n",
" Prec. | \n",
" F1 | \n",
" Kappa | \n",
" MCC | \n",
" TT (Sec) | \n",
"
\n",
" \n",
" \n",
" \n",
" lr | \n",
" Logistic Regression | \n",
" 0.8056 | \n",
" 0.8692 | \n",
" 0.6739 | \n",
" 0.7883 | \n",
" 0.7228 | \n",
" 0.5758 | \n",
" 0.5825 | \n",
" 1.7720 | \n",
"
\n",
" \n",
" ridge | \n",
" Ridge Classifier | \n",
" 0.7528 | \n",
" 0.8647 | \n",
" 0.4522 | \n",
" 0.8257 | \n",
" 0.5793 | \n",
" 0.4273 | \n",
" 0.4679 | \n",
" 0.0700 | \n",
"
\n",
" \n",
" et | \n",
" Extra Trees Classifier | \n",
" 0.7400 | \n",
" 0.0000 | \n",
" 0.4774 | \n",
" 0.7654 | \n",
" 0.5815 | \n",
" 0.4088 | \n",
" 0.4356 | \n",
" 0.1520 | \n",
"
\n",
" \n",
" lda | \n",
" Linear Discriminant Analysis | \n",
" 0.6260 | \n",
" 0.5382 | \n",
" 0.0348 | \n",
" 0.0800 | \n",
" 0.0485 | \n",
" 0.0335 | \n",
" 0.0389 | \n",
" 0.0650 | \n",
"
\n",
" \n",
" dt | \n",
" Decision Tree Classifier | \n",
" 0.6164 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0890 | \n",
"
\n",
" \n",
" rf | \n",
" Random Forest Classifier | \n",
" 0.6164 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.1780 | \n",
"
\n",
" \n",
" qda | \n",
" Quadratic Discriminant Analysis | \n",
" 0.6164 | \n",
" 0.5166 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0700 | \n",
"
\n",
" \n",
" ada | \n",
" Ada Boost Classifier | \n",
" 0.6164 | \n",
" 0.5000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0690 | \n",
"
\n",
" \n",
" gbc | \n",
" Gradient Boosting Classifier | \n",
" 0.6164 | \n",
" 0.5000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.1240 | \n",
"
\n",
" \n",
" lightgbm | \n",
" Light Gradient Boosting Machine | \n",
" 0.6164 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0930 | \n",
"
\n",
" \n",
" dummy | \n",
" Dummy Classifier | \n",
" 0.6164 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0000 | \n",
" 0.0750 | \n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d7df699944cc45f7a7031b2299d31331",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Processing: 0%| | 0/45 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"best_model = cls_compare_models(exclude=['knn', 'svm', 'gpc', 'nb'])\n",
"#best_model = reg_compare_models(exclude=['knn', 'svm', 'gpr', 'et', 'en'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Evaluate Models"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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8A4AAABYBOEdAAAAsAjCOwAAAGARhHcAAADAIgjvAAAAgEUQ3gEAAACLILwDAAAAFkF4BwAAACyC8A4AAABYBOEdAAAAsAjCOwAAAGARhHcAAADAIgjvAAAAgEUQ3gEAAACLILwDAAAAFkF4BwAAACyC8A4AAABYBOEdAAAAsAjT4X3Pnj2Kj4+XJK1atUrdunXT3LlzZRhGphUHAAAA4P+YCu9LlixR+/btdfjwYR05ckRvvfWWkpOT9eGHH+r999/P7BoBAAAAyGR4X7hwoYYNG6Z//etfWr9+vR599FFFRUVp/PjxWrFiRWbXCLiUYRjafPS8luw9rs1Hz/PTJQAA4DI5zLzp9OnTioiIkCRt27ZNdevWlSSFhITo4sWLmVddNhAREaELFy4oR45brTIMQ7lz51aTJk00YMAAubnd/fufiIgI9erVSy1btsyqcpHJVh44qUFr9+hoXIJjWyk/X41rUlktwoq5sDIAAPBPZOrKu5+fn2JjY3Xx4kX98ssvqlWrliTp0KFD8vf3z9QCs4ORI0dq79692rt3r/bt26cFCxZo1apVmjlzpqtLwwO08sBJtV24OU1wl6SjcQlqu3CzVh446aLKAADAP5WpK++NGzdW//795e3trcDAQFWvXl1fffWVRo0apdatW2d2jdlOmTJlVK1aNf32229KTEzUxIkTtX79eiUnJys8PFzvvPOOChcunOY958+f19ixY/Xzzz8rLi5O/v7+6tGjh6Nfn376qaKiovTnn38qKChInTp1Ups2bSRJM2bM0PLly2W321W0aFH17NlTDRs2zPLzdtZleeqcPUVeRrKrSzHNMAz1W7NbqXdZIpNqGBq8bo+ahxaVzWbL4uoAAMA/lanw3q9fPwUGBurUqVNq37693N3dFRcXp7Zt26p3796ZXWO2kpycrD179uinn37S66+/rnfffVdHjx7VihUr5OfnpxEjRqhv375aunRpmvcNGzZM+fLl05dffilPT099/PHHGjVqlJ555hnFx8dr7NixWr16tUqWLKktW7botddeU7169XTs2DEtXbpUK1asUEBAgJYuXaqhQ4eqbt268vDwcKpmwzCUmJj4INqRjt1u1063IO08eUPSjSw55oNw/Hy8TsRfveeY6IsJ+vbgKdUKzpyfNtnt9jR/w3n0zjx6Zx69M4e+mUfvzMvuvTMMw+mL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P6eObRiGEhMTH9i53bY15kK6K+7/K/pigr49eEq1gv0feD1WY7fb0/wN59E78+idefTOHPpmHr0zL7v3zjAMp+8NtBlcBn3gzpw5o6efflrffPONAgMD9eeff6pevXqaN2+eihcvrrp162r9+vUqWbKkJCk6OlqNGzfWpk2b9PPPP2vMmDHasmWL45O6detW9e7dW3v27LnvsQ8cOJBlV+k3xlzWsP+cue+40bUK68niebOgIgAAAGvw9PRUWFjYfcdx5T0LfPrpp7p586aaNWvm2Hbz5k1FRUWpe/fukqQiRYo49hUtWtTx8ZkzZxQfH69q1ao5thmGoeTkZMXFxcnPz+++x/fw8FBISEhmnMo9xXlfkJwI71UeC1FZrrynY7fbFRMTo+DgYHl7e7u6HEuhd+bRO/PonTn0zTx6Z1527110dLTTYwnvD9iNGze0fPlyjR49Wo8//rhj+5EjR/Tqq6+qW7dukm6F9BIlSjg+vi0wMFDFihXThg0bHNuuXr2quLg4FShQwKkabDabfHx8MuN07unJssVUskCuey6dCfH31RNli/LYyHvw9vbOks/Xw4jemUfvzKN35tA38+idedm1dxnJRdyw+oCtXbtWNptNTZo0UWBgoONP3bp1Vbp0aa1YsUINGjTQhAkTdPnyZV2+fFnjx493vL9Bgwa6du2a5s+fr6SkJF25ckWDBg1Snz59sl0AttlsGtUoTG53KcvNZlPkc5WzXd0AAABWQXh/wD799FM1adJEHh4e6fY9//zzWr16tUaPHi2bzab69eurRYsWKleunKRby11y586tjz76SDt27FDdunX1xBNPyM3NTbNnz87qU3FK03KFNbZ2EZUqkCvN9hB/X33eua5ahBVzUWUAAADWx7KZB2zFihV33de+fXu1b99e27Zt06RJk+Tl5SVJOnz4sGbPnq18+fJJkkqVKqV58+ZlRbmZokHRPOrxZHXtPndVf1yx65G83qpdgt+wCgAA8HcR3rOBcePGqUGDBnr99dd1/fp1zZ49W48//rhy5szp6tJMs9lsqluqkKvLAAAAeKiwbCYbmDRpkvbt26eaNWsqIiJC7u7uada9AwAAABJX3rOFRx99VAsXLnR1GQAAAMjmuPIOAAAAWAThHQAAALAIwjsAAABgEYR3AAAAwCII7wAAAIBFEN4BAAAAiyC8AwAAABZBeAcAAAAswmYYhuHqIvDg7NmzR4ZhyNPTM0uOZxiGkpOT5eHhIZvNliXHfFjQO/PonXn0zjx6Zw59M4/emZfde5eUlCSbzabKlSvfdyy/YfUhl9VfoDabLcu+UXjY0Dvz6J159M48emcOfTOP3pmX3Xtns9mczmxceQcAAAAsgjXvAAAAgEUQ3gEAAACLILwDAAAAFkF4BwAAACyC8A4AAABYBOEdAAAAsAjCOwAAAGARhHcAAADAIgjvyDRxcXHq2bOnqlatqho1amj06NG6efOmq8uylPj4eD355JPasWOHq0uxjEOHDumll15S9erVVatWLQ0cOFDx8fGuLssStm/frjZt2qhy5cqqVauWRo0apevXr7u6LMtISUlRx44dNXjwYFeXYhlfffWVypUrp/DwcMefAQMGuLosS/jzzz81cOBA1ahRQ9WqVVPPnj0VGxvr6rKyvTVr1qT5egsPD1doaKhCQ0NdXZpphHdkmjfffFM+Pj7asmWLli9fru3bt+ujjz5ydVmWsXv3bj3//PM6efKkq0uxjOvXr6tr164KDw/X1q1btW7dOv35558aMmSIq0vL9uLj49WtWzf9+9//1q5du7Ry5Urt3LlTH3zwgatLs4yZM2dq165dri7DUg4cOKBmzZpp7969jj8TJkxwdVmW8PrrrysxMVHffPONvv/+e7m7u+vtt992dVnZXtOmTdN8vW3YsEH58uXT6NGjXV2aaYR3ZIoTJ05o586dGjBggLy9vVW0aFH17NlTixcvdnVplrBy5Ur1799fffr0cXUplnL27Fk99thjeu211+Tp6an8+fPr+eef13//+19Xl5btFShQQP/5z3/UsmVL2Ww2/fnnn7px44YKFCjg6tIsYfv27dq4caOeeuopV5diKQcOHLD0FU9X+eWXX7R//35FRkYqT548yp07t0aNGqX+/fu7ujRLMQxDAwYMUP369dWsWTNXl2Ma4R2Z4vfff1e+fPlUqFAhx7ZSpUrp7NmzunLligsrs4batWvrm2++0bPPPuvqUiylZMmSmj9/vtzd3R3bvv76a5UvX96FVVlH7ty5JUn16tVTkyZNFBAQoJYtW7q4quwvLi5OQ4cO1aRJk+Tt7e3qciwjNTVVv/76q3744Qc1aNBAdevW1dtvv63Lly+7urRs7+eff1ZISIg+//xzPfnkk6pdu7bGjRungIAAV5dmKatXr1Z0dLTll7oR3pEprl27lu4fsduvExMTXVGSpQQEBChHjhyuLsPSDMPQlClT9P3332vo0KGuLsdSNm7cqM2bN8vNzU29e/d2dTnZWmpqqgYMGKCXXnpJjz32mKvLsZT4+HiVK1dOjRo10ldffaUlS5YoJiaGNe9OuHz5sg4fPqyYmBitXLlSq1at0vnz5zVo0CBXl2YZqampmj17trp37+64cGFVpAVkCh8fH9nt9jTbbr/OlSuXK0rCP8jVq1f11ltv6ddff9Unn3yiMmXKuLokS/Hy8pKXl5cGDBigNm3a6PLly8qbN6+ry8qW5s6dK09PT3Xs2NHVpViOv79/mqWU3t7eGjBggNq2baurV69aPlA9SJ6enpKkoUOHKmfOnMqdO7fefPNNtW3bVteuXePfWSfs2LFDsbGxat26tatL+du48o5M8eijj+rPP//UxYsXHduOHj2qwMBA+fr6urAyPOxOnjypVq1a6erVq1q+fDnB3Ul79uzR008/raSkJMe2pKQkeXh4sBTkHlavXq2dO3eqatWqqlq1qtatW6d169apatWqri4t2zt06JAmTpwowzAc25KSkuTm5uYIp7izkJAQpaamKjk52bEtNTVVktL0E3f39ddf68knn5SPj4+rS/nbCO/IFMHBwapSpYrGjBmjq1ev6tSpU5o1a9ZD8R0usq/Lly+rc+fOqly5shYsWMDNlhlQpkwZXb9+XZMmTVJSUpLOnDmjcePGqXXr1gSpe9iwYYP27NmjXbt2adeuXXruuef03HPP8dQZJ+TLl0+LFy/W/PnzdfPmTZ09e1YTJkxQixYt+Jq7j8cff1xFixbVkCFDdO3aNcXHx2vKlCl64okn+ImFk3bv3q1q1aq5uoxMQXhHppk+fbpu3ryphg0bqm3btqpTp4569uzp6rLwEFuxYoXOnj2r9evXq0qVKmme44t7y5Url+bPn6/ff/9dtWrVUseOHfX444/zmE08MIGBgZo7d642bdqk6tWrq1WrVgoLC9Pw4cNdXVq25+HhoUWLFsnd3V2NGjVSo0aNFBgYqDFjxri6NMs4ffq0ChYs6OoyMoXN4OctAAAAgCVw5R0AAACwCMI7AAAAYBGEdwAAAMAiCO8AAACARRDeAQAAAIsgvAMAAAAWQXgHAAAALILwDgAAAFgE4R0ALKBjx45q1qzZXfcPHz5cERERMvN793bs2KEyZcro9OnTTo1fsWKFypQpc88xERERmjFjRoZrMVtTVkpOTtZHH33k6jIA/EMR3gHAAlq3bq1Dhw7p999/T7cvKSlJGzZsUMuWLWWz2TI8d3h4uLZu3aqgoKDMKPWht27dOo0dO9bVZQD4hyK8A4AFNGrUSL6+vlq7dm26fZs2bVJCQoJatWplam5PT08FBATI3d3975b5j2DmpxsAkFkI7wBgAV5eXnruuee0bt26dOFx9erVqlWrloKCgnTu3Dn1799fjz/+uMqXL6969eppypQpSk1NlXRryUtERIRGjx6tqlWrqnv37umWqNxvjtuWLVumunXrqlKlSurdu7fi4+PvWv+ePXvUvn17VahQQfXr19fIkSN19epVp89/xowZevHFF/Xxxx+rdu3aqlSpkvr27asLFy5o4MCBCg8PV7169bRy5UrHezp27KgxY8Zo4MCBqlSpkurWrasPPvggTf+OHj2q7t27q0aNGqpSpYp69+6ts2fPppljyJAhatOmjapWrar3339fb731liSpTJky2rFjhwzD0Pz58/XMM88oNDRUVapUUbdu3XTq1CnHPGXKlNHnn3+ul156SRUqVFCdOnU0d+7cNOe4bds2tWvXThUrVlTdunU1adIkpaSkSLr105UJEyaoTp06Cg8PV9u2bbV161an+wfg4UF4BwCLaN26tc6cOaPdu3c7tsXFxWnLli1q06aNJKlbt26Kj4/XggULtGHDBnXt2lVz5szRd99953jPmTNndP78ea1cuVL9+vVLdxxn5pCkjz/+WFOnTtUnn3yi8+fP6+WXX77jVelDhw7pxRdfVK1atbRmzRpNnDhRv/76613H382uXbu0a9cuLVy4UFOnTtXXX3+t5557TmXLltUXX3yhunXravjw4bp06ZLjPZ9++qm8vb31xRdfqE+fPnr//fc1b948Rx+ef/55eXp6auHChfrwww8VFxenDh06pPnGYsWKFerUqZM+++wztW7dWkOGDJEkbd26VeHh4Vq4cKHmzp2rAQMG6Ouvv9asWbN0/PhxRUZGpql//Pjxat68uVavXq1WrVpp8uTJ2rVrlyRp//796tq1qypVqqQVK1ZozJgxWrZsmaZPny5Jeuutt7RlyxZNmDBBK1eu1DPPPKPu3bvrhx9+cLp/AB4SBgDAMpo2bWoM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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"cls_plot_model(best_model, plot='feature')\n",
"#reg_plot_model(best_model, plot='feature')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Finalize Model and Save"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Transformation Pipeline and Model Successfully Saved\n"
]
},
{
"data": {
"text/plain": [
"(Pipeline(memory=Memory(location=None),\n",
" steps=[('label_encoding',\n",
" TransformerWrapperWithInverse(exclude=None, include=None,\n",
" transformer=LabelEncoder())),\n",
" ('numerical_imputer',\n",
" TransformerWrapper(exclude=None,\n",
" include=['sepal_length', 'sepal_width',\n",
" 'petal_length', 'petal_width'],\n",
" transformer=SimpleImputer(add_indicator=False,\n",
" copy=True,\n",
" fill_value=None,\n",
" keep_empt...\n",
" fill_value=None,\n",
" keep_empty_features=False,\n",
" missing_values=nan,\n",
" strategy='most_frequent'))),\n",
" ('actual_estimator',\n",
" LogisticRegression(C=1.0, class_weight=None, dual=False,\n",
" fit_intercept=True, intercept_scaling=1,\n",
" l1_ratio=None, max_iter=1000,\n",
" multi_class='auto', n_jobs=None,\n",
" penalty='l2', random_state=123,\n",
" solver='lbfgs', tol=0.0001, verbose=0,\n",
" warm_start=False))],\n",
" verbose=False),\n",
" 'iris_classification_pipeline.pkl')"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"final_model = cls_finalize_model(best_model)\n",
"#final_model = reg_finalize_model(best_model)\n",
"cls_save_model(final_model, 'iris_classification_pipeline')\n",
"#reg_save_model(final_model, 'iris_regression_pipeline')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.11.9"
}
},
"nbformat": 4,
"nbformat_minor": 4
}