In [0]:
# Import potrebných balíčkov
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler, OrdinalEncoder
from sklearn.impute import SimpleImputer
from sklearn.compose import make_column_transformer
from sklearn.pipeline import make_pipeline
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score
from sklearn.model_selection import train_test_split
In [14]:
# Uistíme sa, že máme všetky potrebné dáta
!mkdir -p data/titanic
!wget -nc -O data/titanic.zip https://www.dropbox.com/s/u8u7vcwy3sosbar/titanic.zip?dl=1
!unzip -oq -d data/titanic data/titanic.zip
File ‘data/titanic.zip’ already there; not retrieving.

Pipelines: príklad na dátovej množine Titanic

Ako príklad na predspracovanie dát a tréning modelu pomocou pipelines z balíčka scikit-learn si uvedieme klasifikáciu na dátovej množine Titanic, kde úlohou je predikovať, ktorí posažieri Titanicu haváriu prežili a ktorí nie.

Dátová množina

Zobrazme si najprv opis dát zo súboru description.txt:

In [9]:
with open("data/titanic/description", "r") as file:
    print("".join(file.readlines()))
VARIABLE DESCRIPTIONS:
survival        Survival
                (0 = No; 1 = Yes)
pclass          Passenger Class
                (1 = 1st; 2 = 2nd; 3 = 3rd)
name            Name
sex             Sex
age             Age
sibsp           Number of Siblings/Spouses Aboard
parch           Number of Parents/Children Aboard
ticket          Ticket Number
fare            Passenger Fare
cabin           Cabin
embarked        Port of Embarkation
                (C = Cherbourg; Q = Queenstown; S = Southampton)

SPECIAL NOTES:
Pclass is a proxy for socio-economic status (SES)
 1st ~ Upper; 2nd ~ Middle; 3rd ~ Lower

Age is in Years; Fractional if Age less than One (1)
 If the Age is Estimated, it is in the form xx.5

With respect to the family relation variables (i.e. sibsp and parch)
some relations were ignored.  The following are the definitions used
for sibsp and parch.

Sibling:  Brother, Sister, Stepbrother, or Stepsister of Passenger Aboard Titanic
Spouse:   Husband or Wife of Passenger Aboard Titanic (Mistresses and Fiances Ignored)
Parent:   Mother or Father of Passenger Aboard Titanic
Child:    Son, Daughter, Stepson, or Stepdaughter of Passenger Aboard Titanic

Other family relatives excluded from this study include cousins,
nephews/nieces, aunts/uncles, and in-laws.  Some children travelled
only with a nanny, therefore parch=0 for them.  As well, some
travelled with very close friends or neighbors in a village, however,
the definitions do not support such relations.

Z CSV súboru načítame dáta:

In [10]:
df = pd.read_csv("data/titanic/train.csv")
df.head()
Out[10]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
In [0]:
df_train, df_test = train_test_split(df, test_size=0.25,
                     stratify=df["Survived"], random_state=4)
In [12]:
df_train.columns
Out[12]:
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
      dtype='object')

Úloha 1: Predspracovanie pomocou pipelines

Napíšte pomocou pipelines kód, ktorý rozdelí dátovú množinu na vstupné a výstupné dáta a vhodne predspracuje relevantné stĺpce.


Pomôcky

  • Dátový typ jednotlivých stĺpcov sa dá zobraziť pomocou:
    df_train.dtypes
    Nemusí to však stačiť na odlíšenie kategorických premenných od numerických.
  • Všetky unikátne hodnoty, ktoré stĺpec nadobúda sa dajú zobraziť pomocou:
    np.unique(df_train["NAZOV_STLPCA"])
  • Stĺpec PassengerId obsahuje numerický identifikátor záznamu. Pravdepodobne nie je dobrý nápad použiť ho ako vstup modelu, pretože neobsahuje zovšeobecniteľnú informáciu.
  • Podobná vec platí o stĺpcoch Name, Cabin a pod. – ak ich nevieme nejako vhodne predspracovať (súčasťou mien sú napríklad aj tituly, ktoré môžu niesť zovšeobecniteľnú informáciu; z čísla kajuty by sa zase mohlo dať zistiť, v ktorej časti lode sa nachádzala).
  • Informácie o tom, aké hodnoty nadobúdajú jednotlivé premenné a aký je ich význam sa dajú nájsť aj v textovom opise dátovej množiny, ktorý sme si na začiatku zobrazili.
  • Ako výstup chceme predikovať hodnotu stĺpca Survived. Hodnoty v ňom sú 0 a 1: už ich nie je potrebné prekódovať.
In [0]:
# sem môžete doplniť, ktoré stĺpce sú kategorické,
# ktoré numerické a v ktorom stĺpci je požadovaný výstup

categorical_inputs = [               ]

numeric_inputs = [                   ]

output = [           ]
In [0]:
# sem sa dá doplniť pipeline na predspracovanie
# dát z predchádzajúceho príkladu

Rozdelenie dát na vstupy a výstupy:

In [0]:
X_train = df_train[categorical_inputs + numeric_inputs]
Y_train = df_train[output]

X_test = df_test[categorical_inputs + numeric_inputs]
Y_test = df_test[output]

Úloha 2: Tréning

Napíšte kód, na predspracovaných dátach natrénuje model – buď typu DecisionTreeClassifier alebo iného typu:


In [0]:
# sem sa dá doplniť kód na vytvorenie pipeline-u s modelom
# (DecisionTreeClassifier) a tréning pomocou metódy ``fit``

Úloha 3: Testovanie

Natrénovaný model otestujte na testovacích dátach. Zobrazte maticu zámen (confusion matrix) a vypočítajte správnosť (accuracy):


In [0]:


Úloha 4: Testovanie

Ako už vieme (alebo sa ešte dozvieme), v niektorých prípadoch (keď je nerovnomerné zastúpenie tried) nestačí vyhodnotiť správnosť – neposkytuje to informáciu o skutočnej úspešnosti predikcie. V našom prípade (dve triedy) sa síce všetky potrebné informácie dajú ľahko vyčítať aj z matice zámen, ale predsa len vyrátajme aj presnosť a úplnosť.


In [0]:
print("Precision = {}".format(precision_score(Y_test, y_test)))
print("Recall = {}".format(recall_score(Y_test, y_test)))
Precision = 0.7228915662650602
Recall = 0.6976744186046512