{ "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DatasetData TypesDefault TaskTarget Variable 1Target Variable 2# Instances# AttributesMissing Values
0anomalyMultivariateAnomaly DetectionNaNNaN100010N
1franceMultivariateAssociation Rule MiningInvoiceNoDescription85578N
2germanyMultivariateAssociation Rule MiningInvoiceNoDescription94958N
3bankMultivariateClassification (Binary)depositNaN4521117N
4bloodMultivariateClassification (Binary)ClassNaN7485N
5cancerMultivariateClassification (Binary)ClassNaN68310N
6creditMultivariateClassification (Binary)defaultNaN2400024N
7diabetesMultivariateClassification (Binary)Class variableNaN7689N
8electrical_gridMultivariateClassification (Binary)stabfNaN1000014N
9employeeMultivariateClassification (Binary)leftNaN1499910N
10heartMultivariateClassification (Binary)DEATHNaN20016N
11heart_diseaseMultivariateClassification (Binary)DiseaseNaN27014N
12hepatitisMultivariateClassification (Binary)ClassNaN15432Y
13incomeMultivariateClassification (Binary)income >50KNaN3256114Y
14juiceMultivariateClassification (Binary)PurchaseNaN107015N
15nbaMultivariateClassification (Binary)TARGET_5YrsNaN134021N
16wineMultivariateClassification (Binary)typeNaN649813N
17telescopeMultivariateClassification (Binary)ClassNaN1902011N
18titanicMultivariateClassification (Binary)SurvivedNaN89111Y
19us_presidential_election_resultsMultivariateClassification (Binary)party_winnerNaN4977N
20glassMultivariateClassification (Multiclass)TypeNaN21410N
21irisMultivariateClassification (Multiclass)speciesNaN1505N
22pokerMultivariateClassification (Multiclass)CLASSNaN10000011N
23questionsMultivariateClassification (Multiclass)Next_QuestionNaN4994N
24satelliteMultivariateClassification (Multiclass)ClassNaN643537N
25CTGMultivariateClassification (Multiclass)NSPNaN212940Y
26asia_gdpMultivariateClusteringNaNNaN4011N
27electionsMultivariateClusteringNaNNaN319554Y
28facebookMultivariateClusteringNaNNaN705012N
29iplMultivariateClusteringNaNNaN15325N
30jewelleryMultivariateClusteringNaNNaN5054N
31miceMultivariateClusteringNaNNaN108082Y
32migrationMultivariateClusteringNaNNaN23312N
33perfumeMultivariateClusteringNaNNaN2029N
34pokemonMultivariateClusteringNaNNaN80013Y
35populationMultivariateClusteringNaNNaN25556Y
36public_healthMultivariateClusteringNaNNaN22421N
37seedsMultivariateClusteringNaNNaN2107N
38wholesaleMultivariateClusteringNaNNaN4408N
39tweetsTextNLPtweetNaN85942N
40amazonTextNLP / ClassificationreviewTextNaN200002N
41kivaTextNLP / ClassificationenNaN68187N
42spxTextNLP / RegressiontextNaN8744N
43wikipediaTextNLP / ClassificationTextNaN5003N
44automobileMultivariateRegressionpriceNaN20226Y
45bikeMultivariateRegressioncntNaN1737915N
46bostonMultivariateRegressionmedvNaN50614N
47concreteMultivariateRegressionstrengthNaN10309N
48diamondMultivariateRegressionPriceNaN60008N
49energyMultivariateRegressionHeating LoadCooling Load76810N
50forestMultivariateRegressionareaNaN51713N
51goldMultivariateRegressionGold_T+22NaN2558121N
52houseMultivariateRegressionSalePriceNaN146181Y
53insuranceMultivariateRegressionchargesNaN13387N
54parkinsonsMultivariateRegressionPPENaN587522N
55trafficMultivariateRegressiontraffic_volumeNaN482048N
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 ModelAccuracyAUCRecallPrec.F1KappaMCCTT (Sec)
lrLogistic Regression0.80560.86920.67390.78830.72280.57580.58251.7720
ridgeRidge Classifier0.75280.86470.45220.82570.57930.42730.46790.0700
etExtra Trees Classifier0.74000.00000.47740.76540.58150.40880.43560.1520
ldaLinear Discriminant Analysis0.62600.53820.03480.08000.04850.03350.03890.0650
dtDecision Tree Classifier0.61640.00000.00000.00000.00000.00000.00000.0890
rfRandom Forest Classifier0.61640.00000.00000.00000.00000.00000.00000.1780
qdaQuadratic Discriminant Analysis0.61640.51660.00000.00000.00000.00000.00000.0700
adaAda Boost Classifier0.61640.50000.00000.00000.00000.00000.00000.0690
gbcGradient Boosting Classifier0.61640.50000.00000.00000.00000.00000.00000.1240
lightgbmLight Gradient Boosting Machine0.61640.00000.00000.00000.00000.00000.00000.0930
dummyDummy Classifier0.61640.00000.00000.00000.00000.00000.00000.0750
\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" ] }, "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 }