Двумя наиболее распространенными задачами обучения с учителем являются линейная регрессия и линейный классификатор. Линейная регрессия предсказывает значение, а линейный классификатор предсказывает класс. Это руководство посвящено линейному классификатору.
Что такое линейный классификатор?
Линейный классификатор в Machine Learning является методом нахождения класса объекта на основе его характеристик для статистической классификации. Решение о классификации принимает на основании значения линейной комбинации характеристик объекта. Линейный классификатор используется в практических задачах, таких как классификация документов и в задачах со многими переменными.
Проблемы классификации составляют примерно 80% задачи машинного обучения. Классификация направлена на прогнозирование вероятности каждого класса с учетом набора входных данных. Метка (т.е. зависимая переменная) - это дискретное значение, называемое классом.
- Если метка имеет только два класса, алгоритм обучения - двоичный классификатор.
- Мультиклассовый классификатор обрабатывает метки с более чем двумя классами.
Например, типичная проблема бинарной классификации состоит в том, чтобы предсказать вероятность того, что покупатель совершит вторую покупку. Предсказать тип животного, отображаемого на картинке, является проблемой многоклассовой классификации, поскольку существует более двух разновидностей животных.
В теоретической части этого руководства основное внимание уделяется двоичному классу. Вы узнаете больше о функции вывода мультикласса в будущем руководстве.
В этом руководстве вы узнаете
- Что такое линейный классификатор?
- Как работает двоичный классификатор?
- Как измерить производительность линейного классификатора?
- Точность
- Матрица путаницы
- Точность и чувствительность
- Линейный классификатор с TensorFlow
- Шаг 1) Импортируйте данные
- Шаг 2) Преобразование данных
- Шаг 3) Обучите классификатор
- Шаг 4) Улучшаем модель
- Шаг 5) Гиперпараметр: лассо и гребень
Как работает двоичный классификатор?
В предыдущем руководстве вы узнали, что функция состоит из двух типов переменных: зависимой переменной и набора функций (независимых переменных). В линейной регрессии зависимая переменная - это действительное число без диапазона. Основная цель - предсказать его значение, минимизируя среднеквадратичную ошибку.
Для двоичного классификатора TensorFlow метка может иметь два возможных целочисленных значения. В большинстве случаев это либо [0,1], либо [1,2]. Например, цель состоит в том, чтобы предсказать, купит ли клиент товар или нет. Метка определяется следующим образом:
- Y = 1 (клиент купил товар)
- Y = 0 (покупатель не покупает товар)
Модель использует признаки X для классификации каждого покупателя по наиболее вероятному классу, к которому он принадлежит, а именно, потенциальный покупатель или нет.
Вероятность успеха вычисляется с помощью логистической регрессии . Алгоритм вычисляет вероятность на основе признака X и предсказывает успех, если эта вероятность превышает 50 процентов. Более формально вероятность рассчитывается, как показано в приведенном ниже примере двоичной классификации TensorFlow:
где 0 - набор весов, характеристик, а b - смещение.
Функцию можно разделить на две части:
- Линейная модель
- Логистическая функция
Линейная модель
Вы уже знакомы с тем, как вычисляются веса. Веса вычисляются с использованием скалярного произведения: Y является линейной функцией всех характеристик x i . Если модель не имеет функций, прогноз равен смещению, b.
Веса указывают направление корреляции между характеристиками 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: False Negative: положительные значения считаются отрицательными.
- TN: True Negative: предсказанные значения правильно предсказаны как фактические отрицательные.
Из матрицы неточностей легко сравнить фактический класс и прогнозируемый класс.
Точность и чувствительность
Матрица неточностей дает хорошее представление об истинных положительных и ложных положительных результатах. В некоторых случаях предпочтительнее иметь более сжатую метрику.
Точность
Метрика точности показывает точность положительного класса. Он измеряет, насколько вероятно предсказание положительного класса верным.
Максимальный балл равен 1, когда классификатор идеально классифицирует все положительные значения. Сама по себе точность не очень помогает, потому что игнорирует отрицательный класс. Эта метрика обычно используется в паре с метрикой отзыва. Напоминание также называется чувствительностью или истинно положительным показателем.
Чувствительность
Чувствительность вычисляет соотношение правильно обнаруженных положительных классов. Этот показатель показывает, насколько хороша модель для распознавания положительного класса.
Линейный классификатор с TensorFlow
В этом руководстве мы будем использовать набор данных переписи. Цель состоит в том, чтобы использовать переменные в наборе данных переписи для прогнозирования уровня дохода. Обратите внимание, что доход - это двоичная переменная.
- со значением 1, если доход> 50к
- 0 если доход <50к.
Эта переменная - ваша метка
Этот набор данных включает восемь категориальных переменных:
- рабочее место
- образование
- супружеский
- Занятие
- отношение
- раса
- секс
- родная страна
кроме того, шесть непрерывных переменных:
- возраст
- fnlwgt
- education_num
- прирост капитала
- capital_loss
- hours_week
С помощью этого примера классификации TensorFlow вы поймете, как обучать линейные классификаторы TensorFlow с помощью оценщика TensorFlow и как улучшить метрику точности.
Мы будем действовать следующим образом:
- Шаг 1) Импортируйте данные
- Шаг 2) Преобразование данных
- Шаг 3) Обучите классификатор
- Шаг 4) Улучшаем модель
- Шаг 5) Гиперпараметр: лассо и гребень
Шаг 1) Импортируйте данные
Сначала вы импортируете библиотеки, которые использовались во время обучения.
import tensorflow as tfimport pandas as pd
Далее вы импортируете данные из архива UCI и определяете имена столбцов. Вы будете использовать КОЛОНКИ для именования столбцов во фрейме данных pandas.
Обратите внимание, что вы будете обучать классификатор, используя фреймворк Pandas.
## Define path dataCOLUMNS = ['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 int64workclass objectfnlwgt int64education objecteducation_num int64marital objectoccupation objectrelationship objectrace objectsex objectcapital_gain int64capital_loss int64hours_week int64native_country objectlabel objectdtype: 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 выше. Соотношение практически такое же для тестового набора. Пожалуйста, обратитесь к этому руководству по фасетам, чтобы узнать больше.
print(df_train["label"].value_counts())### The model will be correct in atleast 70% of the caseprint(df_test["label"].value_counts())## Unbalanced labelprint(df_train.dtypes)0 247201 7841Name: label, dtype: int640 124351 3846Name: label, dtype: int64age int64workclass objectfnlwgt int64education objecteducation_num int64marital objectoccupation objectrelationship objectrace objectsex objectcapital_gain int64capital_loss int64hours_week int64native_country objectlabel int64dtype: object
Шаг 2) Преобразование данных
Перед обучением линейного классификатора с помощью Tensorflow необходимо выполнить несколько шагов. Вам необходимо подготовить элементы для включения в модель. В регрессии теста вы будете использовать исходные данные без применения каких-либо преобразований.
У оценщика должен быть список функций для обучения модели. Следовательно, данные столбца необходимо преобразовать в тензор.
Хорошая практика - определить два списка функций на основе их типа, а затем передать их в feature_columns оценщика.
Вы начнете с преобразования непрерывных объектов, а затем определите сегмент с категориальными данными.
Возможности набора данных имеют два формата:
- Целое число
- Объект
Каждая функция указана в следующих двух переменных в соответствии с их типами.
## Add features to the bucket:### Define continuous listCONTI_FEATURES = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week']### Define the categorical listCATE_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 namefeature_names = [feature]## Create dict with the datad = dict(zip(feature_names, [df_train[feature]]))## Convert ageif 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 valueinput_layer = tf.feature_column.input_layer(features=d,feature_columns=feature_columns)## Create lookup tablezero = tf.constant(0, dtype=tf.float32)where = tf.not_equal(input_layer, zero)## Return lookup tbleindices = tf.where(where)values = tf.gather_nd(input_layer, indices)## Initiate graphsess = tf.Session()## Print valueprint(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, существуют разные способы преобразования категориальных данных. Если список словаря функции известен и не имеет большого количества значений, можно создать категориальный столбец с категориальным_столбцом_with_vocabulary_list. Он назначит идентификатор всему уникальному словарному списку.
Например, если статус переменной имеет три различных значения:
- Муж
- Жена
- Одинокий
Тогда будут присвоены три ID. Например, у мужа будет ID 1, у жены - ID 2 и так далее.
В целях иллюстрации вы можете использовать этот код для преобразования объектной переменной в категориальный столбец в TensorFlow.
Пол признака может иметь только два значения: мужской или женский. Когда мы преобразуем признак пола, Tensorflow создаст 2 новых столбца, один для мужчин и один для женщин. Если пол равен мужской, то новый столбец мужской будет равен 1, а женский - 0. Этот пример показан в таблице ниже:
ряды |
секс |
после трансформации |
мужчина |
женский |
1 |
мужчина |
=> |
1 |
0 |
2 |
мужчина |
=> |
1 |
0 |
3 |
женский |
=> |
0 |
1 |
В тензорном потоке:
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 для печати кодировки. Опять же, вам не нужно разбираться в коде, цель - увидеть преобразование
Однако более быстрый способ преобразования данных - использование метода category_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 иategorical_features.
model = tf.estimator.LinearClassifier(n_classes = 2,model_dir="ongoing/train",feature_columns=categorical_features+ continuous_features)
ВЫХОД:
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':, '_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, а количество эпох - на Нет. Модель будет обучена более тысячи шагов.
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 = 1INFO:tensorflow:global_step/sec: 65.8282INFO:tensorflow:loss = 52583.64, step = 101 (1.528 sec)INFO:tensorflow:global_step/sec: 118.386INFO:tensorflow:loss = 25203.816, step = 201 (0.837 sec)INFO:tensorflow:global_step/sec: 110.542INFO:tensorflow:loss = 54924.312, step = 301 (0.905 sec)INFO:tensorflow:global_step/sec: 199.03INFO:tensorflow:loss = 68509.31, step = 401 (0.502 sec)INFO:tensorflow:global_step/sec: 167.488INFO:tensorflow:loss = 9151.754, step = 501 (0.599 sec)INFO:tensorflow:global_step/sec: 220.155INFO:tensorflow:loss = 34576.06, step = 601 (0.453 sec)INFO:tensorflow:global_step/sec: 199.016INFO:tensorflow:loss = 36047.117, step = 701 (0.503 sec)INFO:tensorflow:global_step/sec: 197.531INFO:tensorflow:loss = 22608.148, step = 801 (0.505 sec)INFO:tensorflow:global_step/sec: 208.479INFO: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.
Обратите внимание, что впоследствии потери уменьшились на последних 100 шагах, то есть с 901 до 1000.
Окончательная потеря после тысячи итераций составляет 5444. Вы можете оценить свою модель на тестовом наборе и увидеть производительность. Чтобы оценить производительность вашей модели, вам нужно использовать объект Assessment. Вы загружаете модель тестовым набором и устанавливаете количество эпох равным 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:22INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from ongoing/train/model.ckpt-1000INFO: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:23INFO: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. Очевидно, что связь не является линейной. Если мы добавим линейную регрессию, мы увидим, что модель не может уловить закономерность (левый рисунок).
Теперь посмотрите на левое изображение с рисунка ниже, мы добавили пятичленный к регрессии (то есть y = x + x 2 + x 3 + x 4 + x 5. Теперь модель лучше отражает образец. Это мощность полиномиальной регрессии.
Вернемся к нашему примеру. Возраст не находится в линейной зависимости от дохода. В раннем возрасте доход может быть близок к нулю, потому что дети или молодые люди не работают. Затем он увеличивается в трудоспособном возрасте и уменьшается при выходе на пенсию. Обычно это форма перевернутой буквы U. Один из способов уловить эту закономерность - добавить к регрессии степень два.
Посмотрим, повысит ли это точность.
Вам необходимо добавить эту новую функцию в набор данных и в список непрерывных объектов.
Вы добавляете новую переменную в набор данных для обучения и тестирования, чтобы было удобнее написать функцию.
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
Функция имеет 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':, '_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 = 1INFO:tensorflow:global_step/sec: 81.487INFO:tensorflow:loss = 70077.66, step = 101 (1.228 sec)INFO:tensorflow:global_step/sec: 111.169INFO:tensorflow:loss = 49522.082, step = 201 (0.899 sec)INFO:tensorflow:global_step/sec: 128.91INFO:tensorflow:loss = 107120.57, step = 301 (0.776 sec)INFO:tensorflow:global_step/sec: 132.546INFO:tensorflow:loss = 12814.152, step = 401 (0.755 sec)INFO:tensorflow:global_step/sec: 162.194INFO:tensorflow:loss = 19573.898, step = 501 (0.617 sec)INFO:tensorflow:global_step/sec: 204.852INFO:tensorflow:loss = 26381.986, step = 601 (0.488 sec)INFO:tensorflow:global_step/sec: 188.923INFO:tensorflow:loss = 23417.719, step = 701 (0.529 sec)INFO:tensorflow:global_step/sec: 192.041INFO:tensorflow:loss = 23946.049, step = 801 (0.521 sec)INFO:tensorflow:global_step/sec: 197.025INFO: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.
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:37INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from ongoing/train1/model.ckpt-1000INFO: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:39INFO: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)]
Чтобы создать столбец с перекрестными объектами, вы используете cross_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)
ВЫХОД
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':, '_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 = 1INFO:tensorflow:global_step/sec: 94.969INFO:tensorflow:loss = 50.334488, step = 101 (1.054 sec)INFO:tensorflow:global_step/sec: 242.342INFO:tensorflow:loss = 56.153225, step = 201 (0.414 sec)INFO:tensorflow:global_step/sec: 213.686INFO:tensorflow:loss = 45.792007, step = 301 (0.470 sec)INFO:tensorflow:global_step/sec: 174.084INFO:tensorflow:loss = 37.485672, step = 401 (0.572 sec)INFO:tensorflow:global_step/sec: 191.78INFO:tensorflow:loss = 56.48449, step = 501 (0.524 sec)INFO:tensorflow:global_step/sec: 163.436INFO:tensorflow:loss = 32.528934, step = 601 (0.612 sec)INFO:tensorflow:global_step/sec: 164.347INFO:tensorflow:loss = 37.438057, step = 701 (0.607 sec)INFO:tensorflow:global_step/sec: 154.274INFO:tensorflow:loss = 61.1075, step = 801 (0.647 sec)INFO:tensorflow:global_step/sec: 189.14INFO: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.
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:52INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from ongoing/train3/model.ckpt-1000INFO: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:54INFO: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))
ВЫХОД
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':, '_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)
ВЫХОД
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 = 1INFO:tensorflow:global_step/sec: 77.4165INFO:tensorflow:loss = 50.38778, step = 101 (1.294 sec)INFO:tensorflow:global_step/sec: 187.889INFO:tensorflow:loss = 55.38014, step = 201 (0.535 sec)INFO:tensorflow:global_step/sec: 201.895INFO:tensorflow:loss = 46.806694, step = 301 (0.491 sec)INFO:tensorflow:global_step/sec: 217.992INFO:tensorflow:loss = 38.68271, step = 401 (0.460 sec)INFO:tensorflow:global_step/sec: 193.676INFO:tensorflow:loss = 56.99398, step = 501 (0.516 sec)INFO:tensorflow:global_step/sec: 202.195INFO:tensorflow:loss = 33.263622, step = 601 (0.497 sec)INFO:tensorflow:global_step/sec: 216.756INFO:tensorflow:loss = 37.7902, step = 701 (0.459 sec)INFO:tensorflow:global_step/sec: 240.215INFO:tensorflow:loss = 61.732605, step = 801 (0.416 sec)INFO:tensorflow:global_step/sec: 220.336INFO: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.
model_regu.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:29:07INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from ongoing/train4/model.ckpt-1000INFO: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:09INFO: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 () и Forecast ().
Чтобы улучшить характеристики модели, вы можете:
- Используйте полиномиальную регрессию
- Срок взаимодействия: tf.feature_column.crossed_column
- Добавить параметр регуляризации