Линейный классификатор в Tensorflow
В этой статье мы будем использовать 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
x_train = pd.read_csv( x_val = pd.read_csv( x_train.head() |
Выход:
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}
Здесь мы можем заметить, что модель была оценена на нескольких матрицах с использованием набора данных проверки, и полученная точность также очень удовлетворительна.