Двоичная классификация TensorFlow: пример линейного классификатора

by moiseevrus

Что такое линейный классификатор?
Линейный классификатор в машинном обучении — это метод поиска класса объекта на основе его характеристик для статистической классификации. Он принимает классификационное решение на основе значения линейной комбинации характеристик объекта. Линейный классификатор используется в практических задачах, таких как классификация документов и задачи с множеством переменных.

Проблемы классификации составляют примерно 80 процентов задач машинного обучения. Классификация направлена ​​на прогнозирование вероятности каждого класса с учетом набора входных данных. Метка (т. е. зависимая переменная) представляет собой дискретное значение, называемое классом.

Если метка имеет только два класса, алгоритм обучения является двоичным классификатором.
Мультиклассовый классификатор обрабатывает метки с более чем двумя классами.
Например, типичная проблема бинарной классификации состоит в том, чтобы предсказать вероятность того, что покупатель сделает вторую покупку. Предсказать тип животного, отображаемого на картинке, является проблемой многоклассовой классификации, поскольку существует более двух разновидностей животных.

Теоретическая часть этого руководства уделяет основное внимание двоичному классу. Вы узнаете больше о функции вывода мультикласса в будущем руководстве.

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

Для бинарного классификатора TensorFlow метка может иметь два возможных целочисленных значения. В большинстве случаев это либо [0,1], либо [1,2]. Например, цель состоит в том, чтобы предсказать, купит ли клиент продукт или нет. Метка определяется следующим образом:

Y = 1 (покупатель купил товар)
Y = 0 (покупатель не покупает товар)
Модель использует признаки X для классификации каждого покупателя в наиболее вероятном классе, к которому он принадлежит, а именно, потенциальный покупатель или нет.

Вероятность успеха вычисляется с помощью логистической регрессии . Алгоритм будет вычислять вероятность на основе функции X и предсказывает успех, когда эта вероятность превышает 50 процентов. Более формально вероятность рассчитывается, как показано в приведенном ниже примере бинарной классификации TensorFlow:

Пример бинарной классификации
где 0 — набор весов, признаков и b — смещение.

Функцию можно разбить на две части:

Линейная модель
Логистическая функция
Линейная модель
Вы уже знакомы с тем, как рассчитываются веса. Веса вычисляются с помощью скалярного произведения:Скалярное произведениеY является линейной функцией всех признаков x i . Если в модели нет признаков, прогноз равен смещению, б.

Веса указывают направление корреляции между признаками x i и меткой y. Положительная корреляция увеличивает вероятность положительного класса, в то время как отрицательная корреляция приближает вероятность к 0 (т. е. к отрицательному классу).

Линейная модель возвращает только действительное число, что несовместимо с вероятностной мерой диапазона [0,1]. Логистическая функция необходима для преобразования выходных данных линейной модели в вероятность,

Логистическая функция
Логистическая функция, или сигмовидная функция, имеет S-образную форму, и выход этой функции всегда находится между 0 и 1.

Пример логистической функции
Пример логистической функции
Пример логистической функции

Выход линейной регрессии легко заменить сигмовидной функцией. В результате получается новое число с вероятностью от 0 до 1.

Классификатор может преобразовать вероятность в класс

Значения от 0 до 0,49 становятся классом 0
Значения от 0,5 до 1 становятся классом 1
Как измерить производительность линейного классификатора?
Точность
Общая производительность классификатора измеряется метрикой точности. Точность собирает все правильные значения, разделенные на общее количество наблюдений. Например, значение точности 80 процентов означает, что модель верна в 80 процентах случаев.

Измерьте производительность линейного классификатора с помощью метрики точности
Измерьте производительность линейного классификатора с помощью метрики точности

Вы можете отметить недостаток этой метрики, особенно для класса дисбаланса. Набор данных о дисбалансе возникает, когда количество наблюдений в группе не равно. скажем; вы пытаетесь классифицировать редкое событие с помощью логистической функции. Представьте, что классификатор пытается оценить смерть пациента после болезни. По данным, 5 процентов пациентов умирают. Вы можете научить классификатор предсказывать количество смертей и использовать метрику точности для оценки производительности. Если классификатор предсказывает 0 смертей для всего набора данных, он будет правильным в 95% случаев.

Матрица путаницы
Лучший способ оценить эффективность классификатора — посмотреть на матрицу путаницы.

Измерьте производительность линейного классификатора, используя матрицу путаницы
Измерьте производительность линейного классификатора, используя матрицу путаницы

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

TP: True Positive: предсказанные значения правильно предсказаны как фактические положительные
FP: предсказанные значения неверно предсказали фактическое положительное значение. т. е. отрицательные значения прогнозируются как положительные
FN: ложноотрицательный: положительные значения прогнозируются как отрицательные
TN: True Negative: предсказанные значения правильно предсказаны как фактические отрицательные значения.
Из матрицы путаницы легко сравнить фактический класс и прогнозируемый класс.

Точность и чувствительность
Матрица путаницы дает хорошее представление о истинно положительном и ложноположительном результате. В некоторых случаях предпочтительнее иметь более краткую метрику.

Точность

Метрика точности показывает точность положительного класса. Он измеряет, насколько вероятно предсказание положительного класса верно.

Точность
Максимальный балл равен 1, когда классификатор идеально классифицирует все положительные значения. Одна только точность не очень полезна, потому что она игнорирует отрицательный класс. Метрика обычно сочетается с метрикой отзыва. Отзыв также называют чувствительностью или истинной положительной скоростью.

Чувствительность

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

Линейный классификатор с TensorFlow
В этом руководстве мы будем использовать набор данных переписи. Цель состоит в том, чтобы использовать переменные в наборе данных переписи для прогнозирования уровня дохода. Обратите внимание, что доход является бинарной переменной

со значением 1, если доход > 50k
0, если доход < 50 тыс.
Эта переменная является вашей меткой

На этом примере классификации TensorFlow вы поймете, как обучать линейные классификаторы TensorFlow с помощью оценщика TensorFlow и как улучшить показатель точности.

Мы будем действовать следующим образом:

Шаг 1) Импорт данных
Шаг 2) Преобразование данных
Шаг 3) Обучите классификатор
Шаг 4) Улучшить модель
Шаг 5) Гиперпараметр: Лассо и Ридж
Шаг 1) Импорт данных
Сначала вы импортируете библиотеки, используемые во время обучения.

import tensorflow as tf
import pandas as pd

Далее вы импортируете данные из архива UCI и определяете имена столбцов. Вы будете использовать COLUMNS для именования столбцов в фрейме данных pandas.

Обратите внимание, что вы будете обучать классификатор с использованием фрейма данных Pandas.

## Define path data
COLUMNS = [‘age’,’workclass’, ‘fnlwgt’, ‘education’, ‘education_num’, ‘marital’,
‘occupation’, ‘relationship’, ‘race’, ‘sex’, ‘capital_gain’, ‘capital_loss’,
‘hours_week’, ‘native_country’, ‘label’]
PATH = “https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data”
PATH_test = “https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test”

Данные, хранящиеся в сети, уже разделены между набором поездов и набором тестов.

df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False)
df_test = pd.read_csv(PATH_test,skiprows = 1, skipinitialspace=True, names = COLUMNS, index_col=False)

Набор поездов содержит 32 561 наблюдение, а тестовый набор — 16 281.

print(df_train.shape, df_test.shape)
print(df_train.dtypes)
(32561, 15) (16281, 15)
age int64
workclass object
fnlwgt int64
education object
education_num int64
marital object
occupation object
relationship object
race object
sex object
capital_gain int64
capital_loss int64
hours_week int64
native_country object
label object
dtype: object

Tensorflow требует логическое значение для обучения классификатора. Вам нужно преобразовать значения из строки в целое число.
Метка хранится как объект, однако вам необходимо преобразовать ее в числовое значение.
В приведенном ниже коде создается словарь со значениями для преобразования и цикла по элементу столбца.
Обратите внимание, что вы выполняете эту операцию дважды, один раз для теста поезда, другой для набора тестов.

label = {‘<=50K’: 0,’>50K’: 1}
df_train.label = [label[item] for item in df_train.label]
label_t = {‘<=50K.’: 0,’>50K.’: 1}
df_test.label = [label_t[item] for item in df_test.label]

В данных поезда есть 24 720 доходов ниже 50 тысяч и 7841 выше. Соотношение почти такое же для тестового набора.
Пожалуйста, обратитесь к этому руководству по Facets для получения дополнительной информации.

print(df_train[“label”].value_counts())
### The model will be correct in atleast 70% of the case
print(df_test[“label”].value_counts())
## Unbalanced label
print(df_train.dtypes)
0 24720
1 7841
Name: label, dtype: int64
0 12435
1 3846
Name: label, dtype: int64
age int64
workclass object
fnlwgt int64
education object
education_num int64
marital object
occupation object
relationship object
race object
sex object
capital_gain int64
capital_loss int64
hours_week int64
native_country object
label int64
dtype: object

Шаг 2) Преобразование данных
Перед обучением линейного классификатора с помощью Tensorflow необходимо выполнить несколько шагов.
Вам необходимо подготовить функции для включения в модель.
В эталонной регрессии вы будете использовать исходные данные без применения каких-либо преобразований.

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

Хорошей практикой является определение двух списков функций на основе их типа, а затем передача их в feature_columns оценщика.

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

Характеристики набора данных имеют два формата:

Целое число
Объект
Каждая функция указана в следующих двух переменных в соответствии с их типами.

## Add features to the bucket:
### Define continuous list
CONTI_FEATURES = [‘age’, ‘fnlwgt’,’capital_gain’, ‘education_num’, ‘capital_loss’, ‘hours_week’]
### Define the categorical list
CATE_FEATURES = [‘workclass’, ‘education’, ‘marital’, ‘occupation’, ‘relationship’, ‘race’, ‘sex’, ‘native_country’]

Feature_column оснащен объектом numeric_column, чтобы помочь в преобразовании непрерывных переменных в тензор. В приведенном ниже коде вы конвертируете все переменные из CONTI_FEATURES в тензор с числовым значением. Это обязательно для построения модели. Все независимые переменные должны быть преобразованы в правильный тип тензора.

Ниже мы напишем код, чтобы вы могли увидеть, что происходит за feature_column.numeric_column. Мы напечатаем преобразованное значение для возраста. Это для пояснительных целей, поэтому нет необходимости понимать код Python. Вы можете обратиться к официальной документации, чтобы понять коды.

def print_transformation(feature = “age”, continuous = True, size = 2):
#X = fc.numeric_column(feature)
## Create feature name
feature_names = [
feature]

## Create dict with the data
d = dict(zip(feature_names, [df_train[feature]]))

## Convert age
if continuous == True:
c = tf.feature_column.numeric_column(feature)
feature_columns = [c]
else:
c = tf.feature_column.categorical_column_with_hash_bucket(feature, hash_bucket_size=size)
c_indicator = tf.feature_column.indicator_column(c)
feature_columns = [c_indicator]

## Use input_layer to print the value
input_layer = tf.feature_column.input_layer(
features=d,
feature_columns=feature_columns
)
## Create lookup table
zero = tf.constant(0, dtype=tf.float32)
where = tf.not_equal(input_layer, zero)
## Return lookup tble
indices = tf.where(where)
values = tf.gather_nd(input_layer, indices)
## Initiate graph
sess = tf.Session()
## Print value
print(sess.run(input_layer))
print_transformation(feature = “age”, continuous = True)
[[39.]
[50.]
[38.]

[58.]
[22.]
[52.]]

Значения точно такие же, как в df_train

continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES]

Согласно документации TensorFlow, существуют разные способы преобразования категориальных данных. Если список словаря функции известен и не имеет большого количества значений, можно создать категориальный столбец с categorical_column_with_vocabulary_list. Он присвоит всему уникальному списку словарей идентификатор.

Например, если статус переменной имеет три различных значения:

Муж
Жена
Одинокий
Затем будут присвоены три идентификатора. Например, у мужа будет ID 1, у жены ID 2 и так далее.

Для иллюстрации вы можете использовать этот код для преобразования объектной переменной в категориальный столбец в TensorFlow.

Признак пола может иметь только два значения: мужской или женский. Когда мы преобразуем признак пола, Tensorflow создаст 2 новых столбца, один для мужчин и один для женщин. Если пол равен мужскому, то новый столбец мужского пола будет равен 1, а женский — 0. Этот пример показан в таблице ниже:

rows sex after transformation male female
1 male => 1 0
2 male => 1 0
3 female =>

In tensorflow:

print_transformation(feature = “sex”, continuous = False, size = 2)
[[1. 0.]
[1. 0.]
[1. 0.]

[0. 1.]
[1. 0.]
[0. 1.]]

relationship = tf.feature_column.categorical_column_with_vocabulary_list(
‘relationship’, [
‘Husband’, ‘Not-in-family’, ‘Wife’, ‘Own-child’, ‘Unmarried’,
‘Other-relative’])

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

Однако более быстрый способ преобразования данных — использовать метод categorical_column_with_hash_bucket.
Изменение строковых переменных в разреженной матрице будет полезно.
Разреженная матрица — это матрица, состоящая в основном из нулей.
Метод заботится обо всем. Вам нужно только указать количество сегментов и ключевой столбец.
Количество сегментов — это максимальное количество групп, которые может создать Tensorflow.
Ключевой столбец — это просто имя столбца для преобразования.

В приведенном ниже коде вы создаете цикл по всем категориальным функциям

categorical_features = [tf.feature_column.categorical_column_with_hash_bucket(k, hash_bucket_size=1000) for k in CATE_FEATURES]

Шаг 3) Обучите классификатор
В настоящее время TensorFlow предоставляет оценщик для линейной регрессии и линейной классификации.

Линейная регрессия: LinearRegressor
Линейная классификация: LinearClassifier
Синтаксис линейного классификатора такой же, как и в учебнике по линейной регрессии, за исключением одного аргумента, n_class.
Вам нужно определить столбец функций, каталог модели и сравнить с линейным регрессором; у вас есть определить номер класса.
Для логит-регрессии количество классов равно 2.

Модель будет вычислять веса столбцов, содержащихся в Continuous_features и categorical_features.

model = tf.estimator.LinearClassifier(
n_classes = 2,
model_dir=”ongoing/train”,
feature_columns=categorical_features+ continuous_features)

Output

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {‘_model_dir’: ‘ongoing/train’, ‘_tf_random_seed’: None,
‘_save_summary_steps’: 100, ‘_save_checkpoints_steps’: None, ‘_save_checkpoints_secs’:
600, ‘_session_config’: None, ‘_keep_checkpoint_max’: 5,
‘_keep_checkpoint_every_n_hours’: 10000, ‘_log_step_count_steps’: 100, ‘_train_distribute’: None, ‘_service’: None, ‘_cluster_spec’:
<tensorflow.python.training.server_lib.ClusterSpec object at 0x181f24c898>, ‘_task_type’: ‘worker’,
‘_task_id’: 0, ‘_global_id_in_cluster’: 0, ‘_master’: ”, ‘_evaluation_master’: ”, ‘_is_chief’: True, ‘_num_ps_replicas’: 0, ‘_num_worker_replicas’: 1}

Теперь, когда классификатор определен, вы можете создать входную функцию.
Метод такой же, как и в учебнике по линейному регрессору. Здесь вы используете размер пакета 128 и перемешиваете данные.

FEATURES = [‘age’,’workclass’, ‘fnlwgt’, ‘education’, ‘education_num’, ‘marital’, ‘occupation’, ‘relationship’, ‘race’, ‘sex’, ‘capital_gain’, ‘capital_loss’, ‘hours_week’, ‘native_country’]
LABEL= ‘label’
def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
return tf.estimator.inputs.pandas_input_fn(
x=pd.DataFrame({k: data_set[k].values for k in FEATURES}),
y = pd.Series(data_set[LABEL].values),
batch_size=n_batch,
num_epochs=num_epochs,
shuffle=shuffle)

Вы создаете функцию с аргументами, требуемыми для линейной оценки, т. е. количеством эпох, количеством пакетов, и перемешиваете набор данных или заметку.
Поскольку вы используете метод Pandas для передачи данных в модель, вам необходимо определить переменные X как фрейм данных pandas.
Обратите внимание, что вы перебираете все данные, хранящиеся в FEATURES.

Давайте обучим модель с помощью объекта model.train. Вы используете ранее определенную функцию, чтобы передать модели соответствующие значения.
Обратите внимание, что для размера пакета установлено значение 128, а для количества эпох — значение None. Модель будет обучена более тысячи шагов.

model.train(input_fn=get_input_fn(df_train,
num_epochs=None,
n_batch = 128,
shuffle=False),
steps=1000)

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow: Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 1 into ongoing/train/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 65.8282
INFO:tensorflow:loss = 52583.64, step = 101 (1.528 sec)
INFO:tensorflow:global_step/sec: 118.386
INFO:tensorflow:loss = 25203.816, step = 201 (0.837 sec)
INFO:tensorflow:global_step/sec: 110.542
INFO:tensorflow:loss = 54924.312, step = 301 (0.905 sec)
INFO:tensorflow:global_step/sec: 199.03
INFO:tensorflow:loss = 68509.31, step = 401 (0.502 sec)
INFO:tensorflow:global_step/sec: 167.488
INFO:tensorflow:loss = 9151.754, step = 501 (0.599 sec)
INFO:tensorflow:global_step/sec: 220.155
INFO:tensorflow:loss = 34576.06, step = 601 (0.453 sec)
INFO:tensorflow:global_step/sec: 199.016
INFO:tensorflow:loss = 36047.117, step = 701 (0.503 sec)
INFO:tensorflow:global_step/sec: 197.531
INFO:tensorflow:loss = 22608.148, step = 801 (0.505 sec)
INFO:tensorflow:global_step/sec: 208.479
INFO:tensorflow:loss = 22201.918, step = 901 (0.479 sec)
INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train/model.ckpt.
INFO:tensorflow:Loss for final step: 5444.363.

<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x181f223630>

Обратите внимание, что потери последовательно уменьшались в течение последних 100 шагов, т. е. с 901 до 1000.

Окончательный убыток после тысячи итераций — 5444. Вы можете оценить свою модель на тестовом наборе и посмотреть производительность.
Чтобы оценить производительность вашей модели, вам нужно использовать оценку объекта.
Вы загружаете модель тестовым набором и устанавливаете количество эпох равным 1, т. е. данные будут поступать в модель только один раз.

model.evaluate(input_fn=get_input_fn(df_test,
num_epochs=1,
n_batch = 128,
shuffle=False),
steps=1000)

INFO:tensorflow:Calling model_fn.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to “careful_interpolation” instead.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to “careful_interpolation” instead.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-06-02-08:28:22
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [100/1000]
INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:23
INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.7615626, accuracy_baseline = 0.76377374, auc = 0.63300294, auc_precision_recall = 0.50891197, average_loss = 47.12155, global_step = 1000, label/mean = 0.23622628, loss = 5993.6406, precision = 0.49401596, prediction/mean = 0.18454961, recall = 0.38637546

{‘accuracy’: 0.7615626,
‘accuracy_baseline’: 0.76377374,
‘auc’: 0.63300294,
‘auc_precision_recall’: 0.50891197,
‘average_loss’: 47.12155,
‘global_step’: 1000,
‘label/mean’: 0.23622628,
‘loss’: 5993.6406,
‘precision’: 0.49401596,
‘prediction/mean’: 0.18454961,
‘recall’: 0.38637546}

TensorFlow возвращает все метрики, которые вы узнали в теоретической части. Неудивительно, что точность велика из-за несбалансированной метки.
На самом деле модель работает немного лучше, чем случайное предположение. Представьте, что модель предсказывает все домохозяйства с доходом ниже 50 тысяч,
тогда точность модели составляет 70 процентов. При более внимательном анализе вы можете увидеть, что предсказание и отзыв довольно низки.

Шаг 4) Улучшить модель
Теперь, когда у вас есть эталонная модель, вы можете попробовать ее улучшить, то есть повысить точность.
В предыдущем уроке вы узнали, как улучшить силу предсказания с помощью термина взаимодействия. В этом руководстве вы вернетесь к этой идее, добавив полиномиальный член к регрессии.

Полиномиальная регрессия полезна, когда в данных присутствует нелинейность. Есть два способа зафиксировать нелинейность в данных.

Добавить полиномиальный член
Превратите непрерывную переменную в категориальную переменную
Полиномиальный термин
На картинке ниже вы можете увидеть, что такое полиномиальная регрессия. Это уравнение с переменными X с разной степенью.
Полиномиальная регрессия второй степени имеет две переменные, X и X в квадрате. Третья степень имеет три переменные, X, X 2 и X 3

Что такое полиномиальная регрессия
Что такое полиномиальная регрессия

Ниже мы построили график с двумя переменными, X и Y. Очевидно, что зависимость не является линейной.
Если мы добавим линейную регрессию, мы увидим, что модель не может уловить закономерность (левое изображение).

def square_var(df_t, df_te, var_name = ‘age’):
df_t[‘new’] = df_t[var_name].pow(2)
df_te[‘new’] = df_te[var_name].pow(2)
return df_t, df_te

мы добавили пятичлен к регрессии (то есть y=x+x 2 +x 3 +x 4 +x 5 . Теперь модель намного лучше отражает закономерность. Это мощность полиномиальной регрессии.

Пример полиномиальной регрессии
Вернемся к нашему примеру. Возраст не находится в линейной зависимости от дохода. В раннем возрасте может быть фиксированный доход, близкий к нулю, потому что дети или молодые люди не работают. Затем она увеличивается в трудоспособном возрасте и уменьшается при выходе на пенсию. Обычно это перевернутая U-образная форма. Один из способов уловить эту закономерность — добавить к регрессии степень два.

Посмотрим, повысится ли точность.

Вам нужно добавить эту новую функцию в набор данных и в список непрерывных функций.

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

Функция имеет 3 аргумента:

df_t: определить тренировочный набор
df_te: определить набор тестов
var_name = ‘age’: Определите переменную для преобразования
Вы можете использовать объект pow(2) для возведения в квадрат переменной age. Обратите внимание, что новая переменная называется «новая».

Теперь, когда функция square_var написана, вы можете создать новые наборы данных.

df_train_new, df_test_new = square_var(df_train, df_test, var_name = ‘age’)

Квадратная переменная называется новой в наборе данных. Вам нужно добавить его в список непрерывных функций.

print(df_train_new.shape, df_test_new.shape)
(32561, 16) (16281, 16)

Квадратная переменная называется новой в наборе данных. Вам нужно добавить его в список непрерывных функций.

CONTI_FEATURES_NEW = [‘age’, ‘fnlwgt’,’capital_gain’, ‘education_num’, ‘capital_loss’, ‘hours_week’, ‘new’]
continuous_features_new = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES_NEW]

Обратите внимание , что вы изменили каталог Graph. Вы не можете обучать разные модели в одном и том же каталоге. Это означает, что вам нужно изменить путь аргумента model_dir. Если вы этого не сделаете, TensorFlow выдаст ошибку.

model_1 = tf.estimator.LinearClassifier(
model_dir=”ongoing/train1″,
feature_columns=categorical_features+ continuous_features_new)
INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {‘_model_dir’: ‘ongoing/train1’, ‘_tf_random_seed’: None, ‘_save_summary_steps’: 100, ‘_save_checkpoints_steps’: None, ‘_save_checkpoints_secs’: 600, ‘_session_config’: None, ‘_keep_checkpoint_max’: 5, ‘_keep_checkpoint_every_n_hours’: 10000, ‘_log_step_count_steps’: 100, ‘_train_distribute’: None, ‘_service’: None, ‘_cluster_spec’:
<tensorflow.python.training.server_lib.ClusterSpec object at 0x1820f04b70>, ‘_task_type’: ‘worker’, ‘_task_id’: 0, ‘_global_id_in_cluster’: 0, ‘_master’: ”, ‘_evaluation_master’: ”, ‘_is_chief’: True, ‘_num_ps_replicas’: 0, ‘_num_worker_replicas’: 1}
FEATURES_NEW = [‘age’,’workclass’, ‘fnlwgt’, ‘education’, ‘education_num’, ‘marital’, ‘occupation’, ‘relationship’, ‘race’, ‘sex’, ‘capital_gain’, ‘capital_loss’, ‘hours_week’, ‘native_country’, ‘new’]
def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
return tf.estimator.inputs.pandas_input_fn(
x=pd.DataFrame({k: data_set[k].values for k in FEATURES_NEW}),
y = pd.Series(data_set[LABEL].values),
batch_size=n_batch,
num_epochs=num_epochs,
shuffle=shuffle)

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

model_1.train(input_fn=get_input_fn(df_train,
num_epochs=None,
n_batch = 128,
shuffle=False),
steps=1000)
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 1 into ongoing/train1/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 81.487
INFO:tensorflow:loss = 70077.66, step = 101 (1.228 sec)
INFO:tensorflow:global_step/sec: 111.169
INFO:tensorflow:loss = 49522.082, step = 201 (0.899 sec)
INFO:tensorflow:global_step/sec: 128.91
INFO:tensorflow:loss = 107120.57, step = 301 (0.776 sec)
INFO:tensorflow:global_step/sec: 132.546
INFO:tensorflow:loss = 12814.152, step = 401 (0.755 sec)
INFO:tensorflow:global_step/sec: 162.194
INFO:tensorflow:loss = 19573.898, step = 501 (0.617 sec)
INFO:tensorflow:global_step/sec: 204.852
INFO:tensorflow:loss = 26381.986, step = 601 (0.488 sec)
INFO:tensorflow:global_step/sec: 188.923
INFO:tensorflow:loss = 23417.719, step = 701 (0.529 sec)
INFO:tensorflow:global_step/sec: 192.041
INFO:tensorflow:loss = 23946.049, step = 801 (0.521 sec)
INFO:tensorflow:global_step/sec: 197.025
INFO:tensorflow:loss = 3309.5786, step = 901 (0.507 sec)
INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train1/model.ckpt.
INFO:tensorflow:Loss for final step: 28861.898.

<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x1820f04c88>
model_1.evaluate(input_fn=get_input_fn(df_test_new,
num_epochs=1,
n_batch = 128,
shuffle=False),
steps=1000)
INFO:tensorflow:Calling model_fn.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to “careful_interpolation” instead.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to “careful_interpolation” instead.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-06-02-08:28:37
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [100/1000]
INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:39
INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.7944229, accuracy_baseline = 0.76377374, auc = 0.6093755, auc_precision_recall = 0.54885805, average_loss = 111.0046, global_step = 1000, label/mean = 0.23622628, loss = 14119.265, precision = 0.6682401, prediction/mean = 0.09116262, recall = 0.2576703

{‘accuracy’: 0.7944229,
‘accuracy_baseline’: 0.76377374,
‘auc’: 0.6093755,
‘auc_precision_recall’: 0.54885805,
‘average_loss’: 111.0046,
‘global_step’: 1000,
‘label/mean’: 0.23622628,
‘loss’: 14119.265,
‘precision’: 0.6682401,
‘prediction/mean’: 0.09116262,
‘recall’: 0.2576703}

Квадрат переменной повысил точность с 0,76 до 0,79. Давайте посмотрим, сможете ли вы добиться большего успеха, объединив сегментацию и термин взаимодействия.

Бакетизация и взаимодействие
Как вы видели ранее, линейный классификатор не может правильно отразить модель возраст-доход. Это потому, что он изучает один вес для каждой функции. Чтобы упростить работу классификатора, вы можете разделить функцию на сегменты. Разделение преобразует числовую характеристику в несколько определенных характеристик в зависимости от диапазона, в который она попадает, и каждая из этих новых функций указывает, попадает ли возраст человека в этот диапазон.

Благодаря этим новым функциям линейная модель может фиксировать взаимосвязь, изучая разные веса для каждого сегмента.

В TensorFlow это делается с помощью Bucketized_column. Вам нужно добавить диапазон значений в границы.

age = tf.feature_column.numeric_column(‘age’)
age_buckets = tf.feature_column.bucketized_column(
age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65])

Вы уже знаете, что возраст не зависит от дохода. Еще один способ улучшить модель — взаимодействие. Говоря языком TensorFlow, это пересечение признаков. Пересечение признаков — это способ создания новых признаков, представляющих собой комбинации существующих, что может быть полезно для линейного классификатора, который не может моделировать взаимодействие между признаками.

Вы можете разбить возраст на другую характеристику, такую ​​как образование. То есть одни группы, вероятно, будут иметь высокий доход, а другие — низкий (вспомните аспиранта).

education_x_occupation = [tf.feature_column.crossed_column(
[‘education’, ‘occupation’], hash_bucket_size=1000)]
age_buckets_x_education_x_occupation = [tf.feature_column.crossed_column(
[age_buckets, ‘education’, ‘occupation’], hash_bucket_size=1000)]

Чтобы создать столбец кросс-функций, вы используете crossed_column с переменными для пересечения в скобках. hash_bucket_size указывает максимальные возможности пересечения. Чтобы создать взаимодействие между переменными (по крайней мере, одна переменная должна быть категориальной), вы можете использовать tf.feature_column.crossed_column. Чтобы использовать этот объект, вам нужно добавить в квадратные скобки переменную для взаимодействия и второй аргумент, размер корзины. Размер корзины — это максимально возможное количество групп в переменной. Здесь вы устанавливаете его на 1000, так как вы не знаете точное количество групп

age_buckets необходимо возвести в квадрат, прежде чем добавлять его в столбцы функций. Вы также добавляете новые функции в столбцы функций и готовите оценщик.

base_columns = [
age_buckets,
]

model_imp = tf.estimator.LinearClassifier(
model_dir=”ongoing/train3″,
feature_columns=categorical_features+base_columns+education_x_occupation+age_buckets_x_education_x_occupation)

Output

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {‘_model_dir’: ‘ongoing/train3’, ‘_tf_random_seed’: None, ‘_save_summary_steps’: 100, ‘_save_checkpoints_steps’: None, ‘_save_checkpoints_secs’: 600, ‘_session_config’: None, ‘_keep_checkpoint_max’: 5, ‘_keep_checkpoint_every_n_hours’: 10000, ‘_log_step_count_steps’: 100, ‘_train_distribute’: None, ‘_service’: None, ‘_cluster_spec’: <tensorflow.python.training.server_lib.ClusterSpec object at 0x1823021be0>, ‘_task_type’: ‘worker’, ‘_task_id’: 0, ‘_global_id_in_cluster’: 0, ‘_master’: ”, ‘_evaluation_master’: ”, ‘_is_chief’: True, ‘_num_ps_replicas’: 0, ‘_num_worker_replicas’: 1}
FEATURES_imp = [‘age’,’workclass’, ‘education’, ‘education_num’, ‘marital’,
‘occupation’, ‘relationship’, ‘race’, ‘sex’, ‘native_country’, ‘new’]

def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
return tf.estimator.inputs.pandas_input_fn(
x=pd.DataFrame({k: data_set[k].values for k in FEATURES_imp}),
y = pd.Series(data_set[LABEL].values),
batch_size=n_batch,
num_epochs=num_epochs,
shuffle=shuffle)

Вы готовы оценить новую модель и посмотреть, улучшит ли она точность.

model_imp.train(input_fn=get_input_fn(df_train_new,
num_epochs=None,
n_batch = 128,
shuffle=False),
steps=1000)

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 1 into ongoing/train3/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 94.969
INFO:tensorflow:loss = 50.334488, step = 101 (1.054 sec)
INFO:tensorflow:global_step/sec: 242.342
INFO:tensorflow:loss = 56.153225, step = 201 (0.414 sec)
INFO:tensorflow:global_step/sec: 213.686
INFO:tensorflow:loss = 45.792007, step = 301 (0.470 sec)
INFO:tensorflow:global_step/sec: 174.084
INFO:tensorflow:loss = 37.485672, step = 401 (0.572 sec)
INFO:tensorflow:global_step/sec: 191.78
INFO:tensorflow:loss = 56.48449, step = 501 (0.524 sec)
INFO:tensorflow:global_step/sec: 163.436
INFO:tensorflow:loss = 32.528934, step = 601 (0.612 sec)
INFO:tensorflow:global_step/sec: 164.347
INFO:tensorflow:loss = 37.438057, step = 701 (0.607 sec)
INFO:tensorflow:global_step/sec: 154.274
INFO:tensorflow:loss = 61.1075, step = 801 (0.647 sec)
INFO:tensorflow:global_step/sec: 189.14
INFO:tensorflow:loss = 44.69645, step = 901 (0.531 sec)
INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train3/model.ckpt.
INFO:tensorflow:Loss for final step: 44.18133.

<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x1823021cf8>
model_imp.evaluate(input_fn=get_input_fn(df_test_new,
num_epochs=1,
n_batch = 128,
shuffle=False),
steps=1000)

INFO:tensorflow:Calling model_fn.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to “careful_interpolation” instead.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to “careful_interpolation” instead.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-06-02-08:28:52
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train3/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [100/1000]
INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:54
INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.8358209, accuracy_baseline = 0.76377374, auc = 0.88401634, auc_precision_recall = 0.69599575, average_loss = 0.35122654, global_step = 1000, label/mean = 0.23622628, loss = 44.67437, precision = 0.68986726, prediction/mean = 0.23320661, recall = 0.55408216

{‘accuracy’: 0.8358209,
‘accuracy_baseline’: 0.76377374,
‘auc’: 0.88401634,
‘auc_precision_recall’: 0.69599575,
‘average_loss’: 0.35122654,
‘global_step’: 1000,
‘label/mean’: 0.23622628,
‘loss’: 44.67437,
‘precision’: 0.68986726,
‘prediction/mean’: 0.23320661,
‘recall’: 0.55408216}

Новый уровень точности составляет 83,58 процента. Это на четыре процента выше, чем у предыдущей модели.

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

Шаг 5) Гиперпараметр: Лассо и Ридж
Ваша модель может страдать от переобучения или недообучения .

Переобучение: модель не может обобщить прогноз на новые данные.
Недообучение: модель не может уловить структуру данных. т.е. линейная регрессия, когда данные нелинейны
Когда модель имеет множество параметров и относительно небольшое количество данных, это приводит к плохим прогнозам. Представьте, у одной группы всего три наблюдения; модель вычислит вес для этой группы. Вес используется для предсказания; если наблюдения тестового набора для этой конкретной группы полностью отличаются от обучающего набора, то модель сделает неверный прогноз. Во время оценки с обучающим набором точность хорошая, но не очень хорошая с тестовым набором, потому что вычисленные веса не являются истинными для обобщения шаблона. В этом случае он не делает разумного прогноза по невидимым данным.

Чтобы предотвратить переоснащение, регуляризация дает вам возможность контролировать такую ​​сложность и делать ее более универсальной. Существует два метода регуляризации:

L1: лассо
L2: хребет
В TensorFlow вы можете добавить эти два гиперпараметра в оптимизатор. Например, чем выше гиперпараметр L2, вес имеет тенденцию быть очень низким и близким к нулю. Подогнанная линия будет очень плоской, а значение L2, близкое к нулю, означает, что веса близки к обычной линейной регрессии.

Вы можете сами попробовать разные значения гиперпараметров и посмотреть, сможете ли вы повысить уровень точности.

Обратите внимание , что если вы измените гиперпараметр, вам необходимо удалить папку continue/train4, иначе модель запустится с ранее обученной моделью.

Посмотрим, как точность с шумихой

model_regu = tf.estimator.LinearClassifier(
model_dir=”ongoing/train4″, feature_columns=categorical_features+base_columns+education_x_occupation+age_buckets_x_education_x_occupation,
optimizer=tf.train.FtrlOptimizer(
learning_rate=0.1,
l1_regularization_strength=0.9,
l2_regularization_strength=5))

OUPUT

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {‘_model_dir’: ‘ongoing/train4’, ‘_tf_random_seed’: None, ‘_save_summary_steps’: 100, ‘_save_checkpoints_steps’: None, ‘_save_checkpoints_secs’: 600, ‘_session_config’: None, ‘_keep_checkpoint_max’: 5, ‘_keep_checkpoint_every_n_hours’: 10000, ‘_log_step_count_steps’: 100, ‘_train_distribute’: None, ‘_service’: None, ‘_cluster_spec’: <tensorflow.python.training.server_lib.ClusterSpec object at 0x1820d9c128>, ‘_task_type’: ‘worker’, ‘_task_id’: 0, ‘_global_id_in_cluster’: 0, ‘_master’: ”, ‘_evaluation_master’: ”, ‘_is_chief’: True, ‘_num_ps_replicas’: 0, ‘_num_worker_replicas’: 1}
model_regu.train(input_fn=get_input_fn(df_train_new,
num_epochs=None,
n_batch = 128,
shuffle=False),
steps=1000)

OUPUT

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 1 into ongoing/train4/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 77.4165
INFO:tensorflow:loss = 50.38778, step = 101 (1.294 sec)
INFO:tensorflow:global_step/sec: 187.889
INFO:tensorflow:loss = 55.38014, step = 201 (0.535 sec)
INFO:tensorflow:global_step/sec: 201.895
INFO:tensorflow:loss = 46.806694, step = 301 (0.491 sec)
INFO:tensorflow:global_step/sec: 217.992
INFO:tensorflow:loss = 38.68271, step = 401 (0.460 sec)
INFO:tensorflow:global_step/sec: 193.676
INFO:tensorflow:loss = 56.99398, step = 501 (0.516 sec)
INFO:tensorflow:global_step/sec: 202.195
INFO:tensorflow:loss = 33.263622, step = 601 (0.497 sec)
INFO:tensorflow:global_step/sec: 216.756
INFO:tensorflow:loss = 37.7902, step = 701 (0.459 sec)
INFO:tensorflow:global_step/sec: 240.215
INFO:tensorflow:loss = 61.732605, step = 801 (0.416 sec)
INFO:tensorflow:global_step/sec: 220.336
INFO:tensorflow:loss = 46.938225, step = 901 (0.456 sec)
INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train4/model.ckpt.
INFO:tensorflow:Loss for final step: 43.4942.

<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x181ff39e48>
model_regu.evaluate(input_fn=get_input_fn(df_test_new,
num_epochs=1,
n_batch = 128,
shuffle=False),
steps=1000)

Output

INFO:tensorflow:Calling model_fn.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to “careful_interpolation” instead.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to “careful_interpolation” instead.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-06-02-08:29:07
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train4/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [100/1000]
INFO:tensorflow:Finished evaluation at 2018-06-02-08:29:09
INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.83833915, accuracy_baseline = 0.76377374, auc = 0.8869794, auc_precision_recall = 0.7014905, average_loss = 0.34691378, global_step = 1000, label/mean = 0.23622628, loss = 44.12581, precision = 0.69720596, prediction/mean = 0.23662092, recall = 0.5579823

 

 

{‘accuracy’: 0.83833915,
‘accuracy_baseline’: 0.76377374,
‘auc’: 0.8869794,
‘auc_precision_recall’: 0.7014905,
‘average_loss’: 0.34691378,
‘global_step’: 1000,
‘label/mean’: 0.23622628,
‘loss’: 44.12581,
‘precision’: 0.69720596,
‘prediction/mean’: 0.23662092,
‘recall’: 0.5579823}

С помощью этого гиперпараметра вы немного увеличиваете показатели точности. В следующем уроке вы узнаете, как улучшить линейный классификатор с помощью метода ядра.

Резюме
Для обучения модели необходимо:

Определите функции: Независимые переменные: X
Определите метку: Зависимая переменная: y
Построить поезд/тестовый набор
Определить начальный вес
Определите функцию потерь: MSE
Оптимизация модели: градиентный спуск
Определять:
Скорость обучения
Номер эпохи
Размер партии
Номер класса
В этом руководстве вы узнали, как использовать высокоуровневый API для классификатора линейной регрессии. Вам необходимо определить:

Колонки функций. Если непрерывно: tf.feature_column.numeric_column(). Вы можете заполнить список пониманием списка python
Оценщик: tf.estimator.LinearClassifier(feature_columns, model_dir, n_classes = 2)
Функция для импорта данных, размера пакета и эпохи: input_fn()
После этого вы готовы тренироваться, оценивать и делать прогнозы с помощью train(), Assessment() и Predict().

Статья является переводом www.guru99.com

You may also like

Leave a Comment