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-yerimport 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:>
Uçakta kadın yolcuların yaklaşık iki katı erkek yolcu var.
dftrain.sex.value_counts().plot(kind='barh')
tutucu11 l10n-yer<AxesSubplot:>
Yolcuların çoğu "üçüncü" sınıftaydı.
dftrain['class'].value_counts().plot(kind='barh')
tutucu13 l10n-yer<AxesSubplot:>
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-yerText(0.5, 0, '% survive')
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-yerSome 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-yerarray([[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-yerarray([[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-yerINFO: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'>
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)