Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • inf161/lab-4
  • max.seymour/inf-161-lab-4
  • einar.bernsen/lab-4-inf-161-einar
  • Jakob.Berg/lab-4-inf-161
  • jonas.sterud/inf-161-lab-04
  • Vemund.Handeland/lab-4
  • Markus.Halsvik/inf-161-lab-4
  • Jonas.Justesen/inf-161-lab-4
  • Fredrik.Lauritzen/lab-4-inf-161
9 results
Show changes
Commits on Source (1)
This diff is collapsed.
This diff is collapsed.
%% Cell type:markdown id: tags:
## Titanic overlevelse
Her har vi data om passasjerer på skipet Titanic og informasjon om hvorvidt de overlevde. I denne oppgaven skal du bruke passasjerdata for å teste om det er forskjeller i overlevelsen mellom passasjergrupper og predikere om passasjeren overlevde.
%% Cell type:code id: tags:
``` python
# imports
import numpy as np
import pandas as pd
from scipy import stats
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Lasso, LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import MultinomialNB
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, log_loss
```
%% Cell type:code id: tags:
``` python
# les inn Titanic-data
titanic_df = pd.read_csv('data/titanic.csv')
```
%% Cell type:markdown id: tags:
Først endrer vi litt på data for å gjøre oppgaven enklere. Dette er ikke en god ide å gjøre når vi vil lage bestmulige modeller.
%% Cell type:code id: tags:
``` python
# del data i mål-, og prediktorvariabler
X_cols = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare']
y_col = 'Survived'
reduced_df = titanic_df.loc[:, X_cols + [y_col]].dropna()
X_df = pd.get_dummies(reduced_df.loc[:, X_cols], dtype='int')
X = X_df.values
y = reduced_df[y_col].values
```
%% Cell type:markdown id: tags:
Del data i trenings-, validerigns-, og testdata med størrelser 70%, 15%, 15% av data.
%% Cell type:code id: tags:
``` python
# dele data i trenings, validerings og testdata
# generer X_train, X_val, X_test, y_train, y_val, y_test
___
X_train, X_val_test, y_train, y_val_test = train_test_split(X, y, test_size=0.3, random_state=1, shuffle=True)
X_val, X_test, y_val, y_test = train_test_split(X_val_test, y_val_test, test_size=0.5, random_state=1)
```
%% Cell type:markdown id: tags:
På treningsdata, test om menn og kvinner hadde forskjellige sannsynligheter for å overleve.
%% Cell type:code id: tags:
``` python
X_df # noting the following:
# in X_train: Pclass=0, Age=1 and so on
```
%% Output
Pclass Age SibSp Parch Fare Sex_female Sex_male
0 3 22.0 1 0 7.2500 0 1
1 1 38.0 1 0 71.2833 1 0
2 3 26.0 0 0 7.9250 1 0
3 1 35.0 1 0 53.1000 1 0
4 3 35.0 0 0 8.0500 0 1
.. ... ... ... ... ... ... ...
885 3 39.0 0 5 29.1250 1 0
886 2 27.0 0 0 13.0000 0 1
887 1 19.0 0 0 30.0000 1 0
889 1 26.0 0 0 30.0000 0 1
890 3 32.0 0 0 7.7500 0 1
[714 rows x 7 columns]
%% Cell type:code id: tags:
``` python
# test om menn og kvinner hadde forskjellig overlevelse
kjonn_test = ___
kjonn_test
male_survival_percent = len(y_train[(X_train[:, 6] == 1) & (y_train == 1)]) / len(y_train[X_train[:, 6] == 1])
female_survival_percent = len(y_train[(X_train[:, 5] == 1) & (y_train == 1)]) / len(y_train[X_train[:, 5] == 1])
kjonn_test = male_survival_percent == female_survival_percent
print(kjonn_test)
print(f'Menn overlevde {100*male_survival_percent:.2f}% av gangene.')
print(f'Kvinner overlevde {100*female_survival_percent:.2f}% av gangene.')
```
%% Output
False
Menn overlevde 21.27% av gangene.
Kvinner overlevde 77.17% av gangene.
%% Cell type:markdown id: tags:
På treningsdata, test om de som overlevde hadde forskjellig mean alder enn de som ikke overlevde.
%% Cell type:code id: tags:
``` python
# test om de som overlevde hadde forskjellig mean alder enn de som ikke overlevde
alder_test = ___
alder_test
alder_overlevende = X_train[y_train == 1][:, 1]
alder_døde = X_train[y_train == 0][:, 1]
alder_test = alder_overlevende.mean() == alder_døde.mean()
print(alder_test)
print(f'Gjennomsnittsalder blant overlevende: {alder_overlevende.mean():.2f}.')
print(f'Gjennomsnittsalder blant døde: {alder_døde.mean():.2f}.')
```
%% Output
False
Gjennomsnittsalder blant overlevende: 29.02.
Gjennomsnittsalder blant døde: 30.47.
%% Cell type:markdown id: tags:
Tren en kNN-modell med k=1, k=10 og k=50 på treningsdata. Tren også en logistisk regresjon, naive Bayes modell, tilfeldig skog og supportvektormaskin på treningsdata.
%% Cell type:code id: tags:
``` python
# tren forskjellige modeller
models = {'kNN-1': KNeighborsClassifier(n_neighbors=1),
___}
'kNN-10': KNeighborsClassifier(n_neighbors=10),
'kNN-50': KNeighborsClassifier(n_neighbors=50),
'logreg': LogisticRegression(),
'bayes': MultinomialNB(),
'randforest': RandomForestClassifier(),
'svc': SVC()}
for _, model in models.items():
___
model.fit(X_train, y_train)
```
%% Output
C:\Users\maxba\anaconda3\Lib\site-packages\sklearn\linear_model\_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
Increase the number of iterations (max_iter) or scale the data as shown in:
https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
n_iter_i = _check_optimize_result(
%% Cell type:markdown id: tags:
Sorter de ulike modellene etter nøyaktighet på valideringsdata (`sklearn.metrics.accuracy_score`).
%% Cell type:code id: tags:
``` python
# sjekk nøyaktighet for valideringsdata
accuracies = ___
accuracies_df = pd.DataFrame(___)
accuracies = {name: accuracy_score(y_val, model.predict(X_val)) for name, model in models.items()}
accuracies_df = pd.DataFrame(accuracies.items(), columns=['model_name', 'accuracy'])
accuracies_df.sort_values(by='accuracy', ascending=False, inplace=True)
print(accuracies_df)
```
%% Output
model_name accuracy
5 randforest 0.878505
3 logreg 0.794393
1 kNN-10 0.738318
0 kNN-1 0.710280
2 kNN-50 0.710280
4 bayes 0.710280
6 svc 0.682243
%% Cell type:markdown id: tags:
I stedet for nøyaktighet er det vanlig å bruke log-loss, som tar hensyn til en probabilistisk prediksjon. Sorter de ulike modellene etter log-loss (`sklearn.metrics.log_loss`).
%% Cell type:code id: tags:
``` python
# sjekk log loss for valideringsdata
losses = ___
losses_df = pd.DataFrame(___)
losses = {name: log_loss(y_val, model.predict(X_val)) for name, model in models.items()}
losses_df = pd.DataFrame(losses.items(), columns=['model_name', 'loss'])
losses_df.sort_values(by='loss', inplace=True)
print(losses_df)
```
%% Output
model_name loss
5 randforest 4.379135
3 logreg 7.410845
1 kNN-10 9.431984
0 kNN-1 10.442554
2 kNN-50 10.442554
4 bayes 10.442554
6 svc 11.453124
%% Cell type:markdown id: tags:
Velg ut den beste modellen (basert på log-loss) og sjekk hvor godt den generaliserer ved å regne ut nøyaktighet og log-loss på testdata.
%% Cell type:code id: tags:
``` python
# sjekk generaliseringsevne
best_model = ___
generalization_accuracy = ___
generalization_logloss = ___
best_model = models[losses_df.loc[5,'model_name']]
generalization_accuracy = accuracy_score(y_test, best_model.predict(X_test))
generalization_logloss = log_loss(y_test, best_model.predict(X_test))
print('Nøyaktighet:', generalization_accuracy)
print('Log-loss:', generalization_logloss)
```
%% Output
Nøyaktighet: 0.7870370370370371
Log-loss: 7.6759632217564295
%% Cell type:markdown id: tags:
Gi en oppsummering over hva du har gjort og hva resultatet var.
%% Cell type:markdown id: tags:
...
Jeg har gjort litt grunnleggende analyse av Titanic-datasettet og testet et utvalg modeller sin prediksjonevne på å finne ut hvilke pasienter som overlevde. Av disse fungerte Random Forest-modellen best på valideringsdataen, og derfor ble denne målt på usett testdata for å måle generaliseringsevnen.
......