Tahminciler ile doğrusal bir model oluşturun

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin Not defterini indir

genel bakış

Bu uçtan uca izlenecek yol, tf.estimator API'sini kullanarak bir lojistik regresyon modelini eğitir. Model genellikle diğer, daha karmaşık algoritmalar için bir temel olarak kullanılır.

Kurmak

pip install sklearn
tutucu1 l10n-yer
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

Titanik veri kümesini yükleyin

Titanik veri setini, cinsiyet, yaş, sınıf vb. gibi özellikler verilen yolcuların hayatta kalmasını tahmin etme (oldukça marazi) hedefiyle kullanacaksınız.

import tensorflow.compat.v2.feature_column as fc

import tensorflow as tf
tutucu3 l10n-yer
# Load dataset.
dftrain = pd.read_csv('https://storage.googleapis.com/tf-datasets/titanic/train.csv')
dfeval = pd.read_csv('https://storage.googleapis.com/tf-datasets/titanic/eval.csv')
y_train = dftrain.pop('survived')
y_eval = dfeval.pop('survived')

Verileri keşfedin

Veri kümesi aşağıdaki özellikleri içerir

dftrain.head()
dftrain.describe()

Eğitim ve değerlendirme setlerinde sırasıyla 627 ve 264 örnek bulunmaktadır.

dftrain.shape[0], dfeval.shape[0]
tutucu7 l10n-yer
(627, 264)

Yolcuların çoğu 20'li ve 30'lu yaşlarda.

dftrain.age.hist(bins=20)
tutucu9 l10n-yer
<AxesSubplot:>

png

Uçakta kadın yolcuların yaklaşık iki katı erkek yolcu var.

dftrain.sex.value_counts().plot(kind='barh')
tutucu11 l10n-yer
<AxesSubplot:>

png

Yolcuların çoğu "üçüncü" sınıftaydı.

dftrain['class'].value_counts().plot(kind='barh')
tutucu13 l10n-yer
<AxesSubplot:>

png

Dişilerin hayatta kalma şansı erkeklere göre çok daha yüksektir. Bu açıkça model için öngörücü bir özelliktir.

pd.concat([dftrain, y_train], axis=1).groupby('sex').survived.mean().plot(kind='barh').set_xlabel('% survive')
tutucu15 l10n-yer
Text(0.5, 0, '% survive')

png

Model için Özellik Mühendisliği

Tahminciler, modelin ham girdi özelliklerinin her birini nasıl yorumlaması gerektiğini açıklamak için özellik sütunları adı verilen bir sistem kullanır. Bir Tahminci, sayısal girdilerden oluşan bir vektör bekler ve özellik sütunları , modelin her bir özelliği nasıl dönüştürmesi gerektiğini tanımlar.

Doğru özellik sütunları setini seçmek ve oluşturmak, etkili bir model öğrenmenin anahtarıdır. Bir özellik sütunu, orijinal özellikler dict (bir temel özellik sütunu ) içindeki ham girdilerden biri veya bir veya birden çok temel sütun üzerinde tanımlanan dönüşümler kullanılarak oluşturulan herhangi bir yeni sütun ( türetilmiş bir özellik sütunları ) olabilir.

Doğrusal tahmin edici hem sayısal hem de kategorik özellikleri kullanır. Özellik sütunları, tüm TensorFlow tahmin edicileriyle çalışır ve amaçları, modelleme için kullanılan özellikleri tanımlamaktır. Ek olarak, tek-sıcak kodlama, normalleştirme ve kovalama gibi bazı özellik mühendisliği yetenekleri sağlarlar.

Temel Özellik Sütunları

CATEGORICAL_COLUMNS = ['sex', 'n_siblings_spouses', 'parch', 'class', 'deck',
                       'embark_town', 'alone']
NUMERIC_COLUMNS = ['age', 'fare']

feature_columns = []
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))

for feature_name in NUMERIC_COLUMNS:
  feature_columns.append(tf.feature_column.numeric_column(feature_name, dtype=tf.float32))

input_function , verilerin bir akış biçiminde girdi ardışık düzenini besleyen bir tf.data.Dataset nasıl dönüştürüleceğini belirtir. tf.data.Dataset , veri çerçevesi, csv biçimli dosya ve daha fazlası gibi birden çok kaynağı alabilir.

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

train_input_fn = make_input_fn(dftrain, y_train)
eval_input_fn = make_input_fn(dfeval, y_eval, num_epochs=1, shuffle=False)

Veri kümesini inceleyebilirsiniz:

ds = make_input_fn(dftrain, y_train, batch_size=10)()
for feature_batch, label_batch in ds.take(1):
  print('Some feature keys:', list(feature_batch.keys()))
  print()
  print('A batch of class:', feature_batch['class'].numpy())
  print()
  print('A batch of Labels:', label_batch.numpy())
tutucu19 l10n-yer
Some feature keys: ['sex', 'age', 'n_siblings_spouses', 'parch', 'fare', 'class', 'deck', 'embark_town', 'alone']

A batch of class: [b'Third' b'Third' b'Third' b'Third' b'Third' b'First' b'Second' b'First'
 b'First' b'Third']

A batch of Labels: [0 1 1 0 0 1 0 1 1 0]

Ayrıca tf.keras.layers.DenseFeatures katmanını kullanarak belirli bir özellik sütununun sonucunu inceleyebilirsiniz:

age_column = feature_columns[7]
tf.keras.layers.DenseFeatures([age_column])(feature_batch).numpy()
tutucu21 l10n-yer
array([[35.],
       [14.],
       [28.],
       [19.],
       [28.],
       [35.],
       [60.],
       [63.],
       [45.],
       [21.]], dtype=float32)

DenseFeatures yalnızca yoğun tensörleri kabul eder, kategorik bir sütunu incelemek için önce bunu bir gösterge sütununa dönüştürmeniz gerekir:

gender_column = feature_columns[0]
tf.keras.layers.DenseFeatures([tf.feature_column.indicator_column(gender_column)])(feature_batch).numpy()
tutucu23 l10n-yer
array([[1., 0.],
       [0., 1.],
       [0., 1.],
       [1., 0.],
       [1., 0.],
       [1., 0.],
       [1., 0.],
       [0., 1.],
       [0., 1.],
       [0., 1.]], dtype=float32)

Modele tüm temel özellikleri ekledikten sonra modeli eğitelim. Bir modeli eğitmek, tf.estimator API'sini kullanan tek bir komuttur:

linear_est = tf.estimator.LinearClassifier(feature_columns=feature_columns)
linear_est.train(train_input_fn)
result = linear_est.evaluate(eval_input_fn)

clear_output()
print(result)
tutucu25 l10n-yer
{'accuracy': 0.7537879, 'accuracy_baseline': 0.625, 'auc': 0.8060607, 'auc_precision_recall': 0.7480768, 'average_loss': 0.5639972, 'label/mean': 0.375, 'loss': 0.5542658, 'precision': 0.7741935, 'prediction/mean': 0.25232768, 'recall': 0.4848485, 'global_step': 200}

Türetilmiş Özellik Sütunları

Artık %75 doğruluk oranına ulaştınız. Her bir temel özellik sütununu ayrı ayrı kullanmak, verileri açıklamak için yeterli olmayabilir. Örneğin, yaş ve etiket arasındaki ilişki, farklı cinsiyetler için farklı olabilir. Bu nedenle, gender="Male" ve gender="Female" için yalnızca tek bir model ağırlığı öğrenirseniz, her yaş-cinsiyet kombinasyonunu yakalamazsınız (örneğin, gender="Male" VE age="30" VE gender="Male" ayırt etme) gender="Male" VE age="40" ).

Farklı unsur kombinasyonları arasındaki farkları öğrenmek için modele çapraz unsur sütunları ekleyebilirsiniz (aynı zamanda yaş sütununu çapraz sütundan önce gruplandırabilirsiniz):

age_x_gender = tf.feature_column.crossed_column(['age', 'sex'], hash_bucket_size=100)

Kombinasyon özelliğini modele ekledikten sonra modeli tekrar eğitelim:

derived_feature_columns = [age_x_gender]
linear_est = tf.estimator.LinearClassifier(feature_columns=feature_columns+derived_feature_columns)
linear_est.train(train_input_fn)
result = linear_est.evaluate(eval_input_fn)

clear_output()
print(result)
tutucu28 l10n-yer
{'accuracy': 0.7462121, 'accuracy_baseline': 0.625, 'auc': 0.845577, 'auc_precision_recall': 0.7873878, 'average_loss': 0.47313985, 'label/mean': 0.375, 'loss': 0.46722567, 'precision': 0.6509434, 'prediction/mean': 0.41550797, 'recall': 0.6969697, 'global_step': 200}

Artık yalnızca temel özelliklerde eğitilmiş olandan biraz daha iyi olan %77,6'lık bir doğruluk elde ediyor. Daha iyisini yapıp yapamayacağınızı görmek için daha fazla özellik ve dönüşüm kullanmayı deneyebilirsiniz!

Artık değerlendirme setinden bir yolcu hakkında tahminlerde bulunmak için tren modelini kullanabilirsiniz. TensorFlow modelleri, aynı anda bir grup veya örnek koleksiyonu üzerinde tahminler yapmak için optimize edilmiştir. Daha önce, eval_input_fn , tüm değerlendirme seti kullanılarak tanımlanmıştı.

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')
tutucu30 l10n-yer
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmpe5vngw46/model.ckpt-200
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
<AxesSubplot:title={'center':'predicted probabilities'}, ylabel='Frequency'>

png

Son olarak, gerçek pozitif oran ile yanlış pozitif oran arasındaki ödünleşim hakkında bize daha iyi bir fikir verecek olan sonuçların alıcı işletim özelliğine (ROC) bakın.

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,)
tutucu32 l10n-yer
(0.0, 1.05)

png