Дві найпоширеніші контрольовані навчальні завдання - це лінійна регресія та лінійний класифікатор. Лінійна регресія передбачає значення, тоді як лінійний класифікатор передбачає клас. Цей підручник орієнтований на Лінійний класифікатор.
Що таке лінійний класифікатор?
Лінійний класифікатор в Machine Learning є методом знаходження класу об'єкта на основі його характеристик для статистичної класифікації. Він приймає рішення щодо класифікації на основі значення лінійної комбінації характеристик об'єкта. Лінійний класифікатор використовується в практичних задачах, таких як класифікація документів та задачах, що мають багато змінних.
Проблеми класифікації становлять приблизно 80 відсотків завдання машинного навчання. Класифікація спрямована на прогнозування ймовірності кожного класу з урахуванням набору вхідних даних. Мітка (тобто залежна змінна) є дискретним значенням, яке називається класом.
- Якщо мітка має лише два класи, алгоритм навчання - це двійковий класифікатор.
- Багатокласовий класифікатор займається ярликами з більш ніж двома класами.
Наприклад, типовою проблемою двійкової класифікації є передбачення ймовірності здійснення клієнтом другої покупки. Передбачити тип тварини, що відображається на малюнку, є багатокласовою проблемою класифікації, оскільки існує більше двох різновидів тварин.
У теоретичній частині цього посібника основна увага приділяється двійковому класу. Ви дізнаєтесь більше про функцію виведення багатокласника у наступному підручнику.
У цьому підручнику ви дізнаєтесь
- Що таке лінійний класифікатор?
- Як працює двійковий класифікатор?
- Як виміряти продуктивність лінійного класифікатора?
- Точність
- Матриця плутанини
- Точність та чутливість
- Лінійний класифікатор з TensorFlow
- Крок 1) Імпортуйте дані
- Крок 2) Перетворення даних
- Крок 3) Навчіть класифікатор
- Крок 4) Удосконалення моделі
- Крок 5) Гіперпараметр: Lasso & Ridge
Як працює двійковий класифікатор?
У попередньому навчальному посібнику ви дізналися, що функція складається із двох типів змінних - залежної змінної та набору ознак (незалежних змінних). У лінійній регресії залежною змінною є дійсне число без діапазону. Основна мета - передбачити його значення, мінімізуючи середньоквадратичну помилку.
Для двійкового класифікатора 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: Справжнє Позитивне: передбачувані значення правильно прогнозуються як фактичні позитивні
- FP: Прогнозовані значення неправильно передбачали фактичний позитив. тобто негативні значення прогнозуються як позитивні
- FN: помилково негативний: позитивні значення прогнозуються як негативні
- TN: Справжній негатив: прогнозовані значення правильно передбачені як фактичні негативні
За допомогою матриці плутанини легко порівняти фактичний клас та передбачуваний клас.
Точність та чутливість
Матриця плутанини дає хороший уявлення про справжні позитивні та хибнопозитивні дані. У деяких випадках переважно мати більш лаконічну метрику.
Точність
Показник точності показує точність позитивного класу. Він вимірює, наскільки вірогідним є прогнозування позитивного класу.
Максимальний бал - 1, коли класифікатор ідеально класифікує всі позитивні значення. Точність сама по собі не дуже корисна, оскільки вона ігнорує негативний клас. Метрика зазвичай поєднується з метрикою Recall. Відкликання також називають чутливістю або справжнім позитивним показником.
Чутливість
Чутливість обчислює співвідношення позитивних класів, правильно виявлених. Ця метрика показує, наскільки добре модель розпізнає позитивний клас.
Лінійний класифікатор з TensorFlow
Для цього підручника ми використаємо набір даних перепису. Мета полягає у використанні змінних у наборі даних перепису для прогнозування рівня доходу. Зверніть увагу, що дохід є двійковою змінною
- зі значенням 1, якщо дохід> 50к
- 0 якщо дохід <50к.
Ця змінна - ваша мітка
Цей набір даних включає вісім категоріальних змінних:
- робоче місце
- освіта
- подружній
- окупація
- відносини
- гонки
- секс
- Батьківщина
більше того, шість безперервних змінних:
- вік
- fnlwgt
- освітня_число
- capital_gain
- втрата капіталу
- години_тижня
За допомогою цього прикладу класифікації TensorFlow ви зрозумієте, як тренувати лінійні класифікатори TensorFlow за допомогою оцінювача TensorFlow та як поліпшити метрику точності.
Ми будемо діяти наступним чином:
- Крок 1) Імпортуйте дані
- Крок 2) Перетворення даних
- Крок 3) Навчіть класифікатор
- Крок 4) Удосконалення моделі
- Крок 5) Гіперпараметр: Lasso & Ridge
Крок 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. Вам потрібно підготувати функції, які будуть включені в модель. У базовій регресії ви будете використовувати вихідні дані, не застосовуючи жодних перетворень.
Оцінювач повинен мати перелік функцій для навчання моделі. Отже, дані стовпця потребують перетворення в тензор.
Хорошою практикою є визначення двох списків об’єктів на основі їх типу, а потім передача їх у стовпці_функцій оцінювача.
Ви почнете з перетворення безперервних функцій, а потім визначите сегмент із категоріальними даними.
Функції набору даних мають два формати:
- Ціле число
- Об'єкт
Кожна функція перелічена у наступних двох змінних відповідно до їх типів.
## 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']
Стовпець_функції обладнаний числовим_столбцем об'єкта, що допомагає у перетворенні неперервних змінних у тензор. У наведеному нижче коді ви перетворюєте всі змінні з 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, існують різні способи перетворення категоріальних даних. Якщо список словникового запасу об’єкта відомий і не має великої кількості значень, можна створити категоріальний стовпець з categorical_column_with_vocabulary_list. Він присвоїть усім унікальним словниковим спискам ідентифікатор.
Наприклад, якщо статус змінної має три різні значення:
- Чоловік
- Дружина
- Неодружений
Тоді буде присвоєно три ідентифікатори. Наприклад, у чоловіка буде ідентифікатор 1, у дружини - ідентифікатор 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 для друку кодування. Знову ж таки, вам не потрібно розуміти код, мета - побачити трансформацію
Однак швидшим способом перетворення даних є використання методу 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. Вам потрібно визначити стовпець ознак, каталог моделі та порівняти з лінійним регресором; у вас є визначити номер класу. Для регресії logit це число класів дорівнює 2.
Модель буде обчислювати ваги стовпців, що містяться в непреривних_функціях і категоріальних_функціях.
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. Зверніть увагу, що ви циклічно переглядаєте всі дані, що зберігаються в ОСОБЛИВОСТІ.
Давайте навчимо модель за допомогою об’єктної моделі. Ви використовуєте раніше визначену функцію, щоб подавати модель з відповідними значеннями. Зверніть увагу, що ви встановили розмір партії 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 = 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. Ви можете оцінити свою модель на тестовому наборі та побачити ефективність. Щоб оцінити ефективність вашої моделі, вам потрібно використовувати об'єкт оцінки. Ви подаєте модель тестовим набором і встановлюєте кількість епох на 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) для квадратування змінної віку. Зверніть увагу, що нову змінну називають "новою"
Тепер, коли написана функція 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]
Зверніть увагу, що ви змінили каталог Графіка. Ви не можете тренувати різні моделі в одному каталозі. Це означає, що вам потрібно змінити шлях аргументу 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)]
Щоб створити перехресний стовпець об’єктів, ви використовуєте перекреслений стовпець зі змінними для перекреслення в дужці. 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) Гіперпараметр: Lasso & Ridge
Ваша модель може постраждати від надмірного або недостатнього оснащення .
- Переобладнання: модель не може узагальнити прогноз на нові дані
- Недолік: модель не може зафіксувати шаблон даних. тобто лінійна регресія, коли дані нелінійні
Коли модель має безліч параметрів і відносно невеликий обсяг даних, це призводить до поганих прогнозів. Уявіть, одна група має лише три спостереження; модель буде обчислювати вагу для цієї групи. Вага використовується для прогнозування; якщо спостереження за тестовим набором для цієї конкретної групи повністю відрізняються від навчального, то модель зробить неправильний прогноз. Під час оцінювання з тренувальним набором точність хороша, але погана з тестовим набором, оскільки обчислені ваги не є дійсними для узагальнення моделі. У цьому випадку він не робить обґрунтованого прогнозу щодо невидимих даних.
Щоб запобігти переобладнанню, регуляризація дає вам можливість контролювати таку складність та робити її більш узагальненою. Існує дві методики регуляризації:
- L1: Лассо
- L2: хребет
У TensorFlow ви можете додати ці два гіперпараметри в оптимізаторі. Наприклад, чим вище гіперпараметр L2, тим більше вага, як правило, є дуже низьким і близьким до нуля. Встановлена лінія буде дуже плоскою, тоді як L2, близький до нуля, означає, що ваги близькі до регулярної лінійної регресії.
Ви можете спробувати самі різні значення гіперпараметрів і подивитися, чи зможете ви підвищити рівень точності.
Зверніть увагу, що якщо ви зміните гіперпараметр, вам потрібно видалити папку current / 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 (стовпці_функцій, модель_директора, n_classes = 2)
- Функція імпорту даних, розміру партії та епохи: input_fn ()
Після цього ви готові тренуватися, оцінювати та робити прогнози за допомогою train (), оцінка () та передбачення ()
Для підвищення продуктивності моделі ви можете:
- Використовуйте поліноміальну регресію
- Термін взаємодії: tf.feature_column.crossed_column
- Додайте параметр регуляризації