Benützer:


Lineares Modell mit Schätzer erstellen (Titanic-Dataset)

Storyboard

Eine Anwendung ist die Untersuchung der Daten der Passagiere der Titanic und der Überlebenswahrscheinlichkeit nach ihren Eigenschaften. In diesem Fall wird für den Ranking-Schätzer ein lineares Modell verwendet.

Code und Daten

LinearTitanic.ipynb

titanic_lin_train.csv

titanic_lin_eval.csv

>Modell

ID:(1790, 0)



Setup für lineares Modell

Beschreibung

>Top


Setup für lineares Modell:

import os
import sys

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from IPython.display import clear_output
from six.moves import urllib

ID:(13828, 0)



Datensatz laden

Beschreibung

>Top


Passagierdaten für die Jungfernfahrt der Titanic laden:

import tensorflow.compat.v2.feature_column as fc
import tensorflow as tf

# Load dataset.
dftrain = pd.read_csv('titanic_lin_train.csv')
dfeval = pd.read_csv('titanic_lin_eval.csv')
dftest = pd.read_csv('titanic_lin_test.csv')
y_train = dftrain.pop('survived')
y_eval = dfeval.pop('survived')

ID:(13829, 0)



Strukturen und Daten

Beschreibung

>Top


Strukturen und Daten aus dem Titanic-Passagierdatensatz anzeigen:

# show structure and data
dftrain.head()


ID:(13830, 0)



Datenstatistik anzeigen

Beschreibung

>Top


Titanic-Passagierdatenstatistik anzeigen

# show statistics of data
dftrain.describe()


ID:(13831, 0)



Anzahl zu trainierender und auszuwertender Datensätze

Beschreibung

>Top


Anzahl zu trainierender und auszuwertender Datensätze:

# number of train and evaluation records
dftrain.shape[0], dfeval.shape[0]

(627, 264)

ID:(13832, 0)



Histogramm (vertikal) des Alters anzuzeigen

Beschreibung

>Top


Um das Histogramm (vertikal) anzuzeigen, wird hist des Alters dftrain.age mit einem Intervall von 20 Jahren (bins = 20) erhalten aus

# age histogram
dftrain.age.hist(bins=20)


ID:(13833, 0)



Histogramm (horizontal) des Geschlechts anzuzeigen

Beschreibung

>Top


Anzeige des Histogramms (horizontal) Plot (kind = 'barh') des Genres dftrain.sex Zählung der Passagiere nach Genre value_counts () < / b > du bekommst

# gender histogram
dftrain.sex.value_counts().plot(kind='barh')


ID:(13834, 0)



Histogramm (horizontal) der Klassen anzuzeigen

Beschreibung

>Top


Anzeige des Histogramms (horizontal) plot (kind='barh') der Klassen dftrain['class'] Zählung der Passagiere nach Klassen value_counts() du bekommst

# class histogram
dftrain['class'].value_counts().plot(kind='barh')


ID:(13835, 0)



Histogramm (horizontal) der Klassen anzuzeigen

Beschreibung

>Top


Zur Anzeige des Histogramms (horizontal) plot(kind='barh')der Überlebendensurvived gemittelt mean() gruppiert nach Geschlecht groupby('sex') mit dem set_xlabel('% survive')x-Achsen-Label des Strings, der durch Verkettung vonpd.concat([dftrain,y_train],axis=1) aller Daten dftrain und der Abszisse y_train;

# survived histogram
pd.concat([dftrain, y_train], axis=1).groupby('sex').survived.mean().plot(kind='barh').set_xlabel('% survive')



ID:(13836, 0)



Datenspalten bilden

Beschreibung

>Top


Um den Tensor zu bilden, müssen die feature_columns Daten hinzugefügt werden, je nachdem, ob es sich um Kategorien oder Zahlen handelt.
Erstere werden über das Array vokabular gerettet und mit dem Befehl append hinzugefügt, wodurch die Spalte mit dem Befehl tf.feature_column.categorical_column_with_vocabulary_list gebildet wird.
Letztere werden mit dem Befehl append direkt mit der Spalte über ihre Bezeichnung tf.feature_column.numeric_column belegt.

# define tensor
feature_columns = []

# define categorical columns names
CATEGORICAL_COLUMNS = ['sex', 'class', 'deck', 'embark_town', 'alone']
# build columns of categorical variables
for feature_name in CATEGORICAL_COLUMNS:
  vocabulary = dftrain[feature_name].unique()
  feature_columns.append(tf.feature_column.categorical_column_with_vocabulary_list(feature_name, vocabulary))

# define numeric columns names
FLOAT_COLUMNS = ['age', 'fare']
# build columns of numeric variables
for feature_name in FLOAT_COLUMNS:
  feature_columns.append(tf.feature_column.numeric_column(feature_name, dtype=tf.float32))

# define numeric columns names
NUMERIC_COLUMNS = ['n_siblings_spouses', 'parch']
# build columns of numeric variables
for feature_name in NUMERIC_COLUMNS:
  feature_columns.append(tf.feature_column.numeric_column(feature_name, dtype=tf.int32))

ID:(13837, 0)



Formular zum Trainieren und Auswerten eingestellt

Beschreibung

>Top


Es wird eine Funktion definiert, um Regelungen für die Trainings- und Bewertungsprozesse zu generieren:

# define function for making set
def make_input_fn(data_df, label_df, num_epochs=10, shuffle=True, batch_size=32):
  def input_function():
    ds = tf.data.Dataset.from_tensor_slices((dict(data_df), label_df))
    if shuffle:
      ds = ds.shuffle(1000)
    ds = ds.batch(batch_size).repeat(num_epochs)
    return ds
  return input_function


Generierung von Sets für Training und Auswertung:

# generate training input
train_input_fn = make_input_fn(dftrain, y_train)
# generate evaluating input
eval_input_fn = make_input_fn(dfeval, y_eval, num_epochs=1, shuffle=False)

ID:(13838, 0)



Training und Auswertung

Beschreibung

>Top


Um die Klassifizierung durchzuführen, wird das Modell mithilfe der Funktion estimator.LinearClassifier definiert, die auf die Spalten der feature_columns-Daten angewendet wird.

# define model
linear_model = tf.estimator.LinearClassifier(feature_columns=feature_columns)


Dann trainieren wir das Modell, indem wir trainieren auf das Modell anwenden linear_model mit den Daten, um train_input_fn zu trainieren

# define train model
linear_model.train(train_input_fn)


Schließlich wird es mit evaluieren auf das Modell angewendet linear_model und den zu evaluierenden Daten eval_input_fn . ausgewertet

# evaluate model
result = linear_model.evaluate(eval_input_fn)


El resultado final se imprime en mediante el comando print:

# print result
clear_output()
print(result)

Wird erhalten:

{'accuracy': 0.75757575, 'accuracy_baseline': 0.625, 'auc': 0.83067036, 'auc_precision_recall': 0.78773487, 'average_loss': 0.49594572, 'label/mean': 0.375, 'loss': 0.49112648, 'precision': 0.65217394, 'prediction/mean': 0.44832677, 'recall': 0.75757575, 'global_step': 200}

ID:(13841, 0)



Histogramm der Überlebenswahrscheinlichkeiten

Beschreibung

>Top


Wenn die vorhergesagte Überlebenswahrscheinlichkeit anhand ihrer Häufigkeit bewertet wird:

# histogram of the probability
pred_dicts = list(linear_est.predict(eval_input_fn))
probs = pd.Series([pred['probabilities'][1] for pred in pred_dicts])

probs.plot(kind='hist', bins=20, title='predicted probabilities')


Sie erhalten eine Verteilung des Formulars:

ID:(13839, 0)



ROC Kurve

Beschreibung

>Top


Um diese Prognose zu verwenden, muss ein Grenzwert der Immobilie definiert werden, um zu definieren, bei welchem ??Wert das Überleben vorhergesagt wird und unter welchem ??das Nicht-Überleben vorhergesagt wird. Dazu muss die Wahrscheinlichkeit, dass das Überleben vorhergesagt und beobachtet wird (richtig positiv) bewertet und mit der Wahrscheinlichkeit verglichen wird, dass das Überleben vorhergesagt wird, wenn es nicht überlebt wird (falsch positiv).\\nDer wahr-positive TPR oder Sensitivitätsfaktor ist definiert als\\n\\n

$TPR=\displaystyle\frac{TP}{TP+FN}$

\\n\\nwobei wahr-positiv TP die korrekt als positiv vorhergesagten Fälle und die falsch-negative FN den als negativ vorhergesagten Fällen entsprechen, die negativ sind.\\nDer falsch-positive FPR ist definiert als\\n\\n

$FPR=\displaystyle\frac{FP}{FP+TN}$



wobei falsch-positiv FP die als positiv vorhergesagten Fälle sind, obwohl es tatsächlich falsch ist, und das falsch-negative FN entspricht den als negativ vorhergesagten Fällen, die negativ sind.

from sklearn.metrics import roc_curve
from matplotlib import pyplot as plt

fpr, tpr, _ = roc_curve(y_eval, probs)
plt.plot(fpr, tpr)
plt.title('ROC curve')
plt.xlabel('false positive rate')
plt.ylabel('true positive rate')
plt.xlim(0,)
plt.ylim(0,)


Die Darstellung beider Wahrscheinlichkeiten wird als ROC-Diagramm (Receiver Operating Characteristic) bezeichnet:

ID:(13840, 0)