Линейный классификатор в Tensorflow

Опубликовано: 21 Февраля, 2023

В этой статье мы будем использовать tf.estimator.LinearClassifier для построения модели и ее обучения на знаменитом титаническом наборе данных. Все это будет сделано с помощью TensorFlow API.

Импорт библиотек

Библиотеки Python упрощают нам обработку данных и выполнение типичных и сложных задач с помощью одной строки кода.

  • Pandas — эта библиотека помогает загружать фрейм данных в формате 2D-массива и имеет несколько функций для выполнения задач анализа за один раз.
  • Numpy — массивы Numpy работают очень быстро и могут выполнять большие вычисления за очень короткое время.
  • Matplotlib/Seaborn — эта библиотека используется для рисования визуализаций.

Python3




import tensorflow as tf
import tensorflow.feature_column as fc
  
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
  
import warnings
warnings.filterwarnings("ignore")

Импорт набора данных

Мы импортируем набор данных с помощью API Tensorflow для наборов данных, а затем загрузим его во фрейм данных panda.

Python3

Выход:

Python3




y_train = x_train.pop("survived")
y_val = x_val.pop("survived")

Нам понадобятся данные для категориальных столбцов и числового (непрерывного) столбца, представленного в наборе данных отдельно, чтобы инициализировать нашу модель линейного классификатора.

Python3




objects = []
numerics = []
  
for col in x_train.columns:
    if x_train[col].dtype == "object":
        objects.append(col)
          
    elif x_train[col].dtype == "int":
        objects.append(col)
          
    else:
        numerics.append(col)
  
print(objects)
print(numerics)

Выход:

["sex", "n_siblings_spouses", "parch", "class", "deck", "embark_town", "alone"]
["age", "fare"]

Python3




feat_cols = []
for feat_name in objects:
    vocabulary = x_train[feat_name].unique()
    feat_cols.append(fc.categorical_column_with_vocabulary_list(feat_name,
                                                                vocabulary))
  
for feat_name in numerics:
    feat_cols.append(fc.numeric_column(feat_name,
                                       dtype=tf.float32))

Нам нужно сделать вызываемую функцию, которую можно будет передать в функцию LinearClassifier.

Python3




def make_input_fn(data, label,
                  num_epochs=10,
                  shuffle=True,
                  batch_size=32):
    def input_function():
        ds = tf.data.Dataset
            .from_tensor_slices((dict(data),
                                 label))
        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(x_train, y_train)
val_input_fn = make_input_fn(x_val, y_val, num_epochs=1, shuffle=False)

Теперь мы можем приступить к обучению модели tf.estimator.LinearClassifier, используя титанический набор данных. Линейный классификатор, как следует из названия, представляет собой линейную модель, которая используется для изучения границ решений между несколькими классами объекта, но она должна быть линейной, а не нелинейной, как мы делаем это в алгоритме SVM.

Модель LinearClassifier

Python3




linear_est = tf.estimator.LinearClassifier(feature_columns=feat_cols)
linear_est.train(train_input_fn)
result = linear_est.evaluate(val_input_fn)
  
print(result)

Выход:

{"accuracy": 0.75,
 "accuracy_baseline": 0.625,
 "auc": 0.8377411,
 "auc_precision_recall": 0.7833674,
 "average_loss": 0.47364476,
 "label/mean": 0.375, "loss": 0.4666896,
 "precision": 0.6666667,
 "prediction/mean": 0.37083066,
 "recall": 0.6666667,
 "global_step": 200}

Здесь мы можем заметить, что модель была оценена на нескольких матрицах с использованием набора данных проверки, и полученная точность также очень удовлетворительна.