Преглед на содржината
- Поставување
- Вчитајте ги податоците
- Пред обработка на податоците
- Логистичка регресија
- Основи на логистичката регресија
- Лог губење функција
- Правило за ажурирање на градиентниот пад
- Тренирајте го моделот
- Евалуација на перформансите
- Зачувајте го моделот
- Заклучок
Овој водич покажува како да ги користите TensorFlow Core API на ниско ниво за да извршите бинарна класификација со логистичка регресија.Wisconsin Рак на дојка Комплет на податоциКласификација на тумори.
Logistic regressionе еден од најпопуларните алгоритми за бинарна класификација. Дадени сет на примери со карактеристики, целта на логистичката регресија е да се изведат вредности помеѓу 0 и 1, кои може да се толкуваат како веројатноста на секој пример кој припаѓа на одредена класа.
Поставување
Овој туториал користиПандаза читање на CSV датотека во aДатотеки, Морскиза да нацртате паровизирана врска во збир на податоци,Скит-учењеза пресметување на матрицата на конфузија, иМачотли for creating visualizations.
pip install -q seaborn
import tensorflow as tf
import pandas as pd
import matplotlib
from matplotlib import pyplot as plt
import seaborn as sns
import sklearn.metrics as sk_metrics
import tempfile
import os
# Preset matplotlib figure sizes.
matplotlib.rcParams['figure.figsize'] = [9, 6]
print(tf.__version__)
# To make the results reproducible, set the random seed value.
tf.random.set_seed(22)
2024-08-15 02:45:41.468739: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:485] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered
2024-08-15 02:45:41.489749: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:8454] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered
2024-08-15 02:45:41.496228: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1452] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered
2.17.0
Вчитајте ги податоците
Следно, наполнете гоWisconsin Breast Cancer DatasetОд наUCI Репозиториум за машинско учењеОвој сет на податоци содржи различни карактеристики, како што се радиусот, текстурата и concavity на туморот.
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data'
features = ['radius', 'texture', 'perimeter', 'area', 'smoothness', 'compactness',
'concavity', 'concave_poinits', 'symmetry', 'fractal_dimension']
column_names = ['id', 'diagnosis']
for attr in ['mean', 'ste', 'largest']:
for feature in features:
column_names.append(feature + "_" + attr)
Прочитајте го комплетот на податоци во пандаДатотекиКористењеpandas.read_csv
:
dataset = pd.read_csv(url, names=column_names)
dataset.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 569 entries, 0 to 568
Data columns (total 32 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 id 569 non-null int64
1 diagnosis 569 non-null object
2 radius_mean 569 non-null float64
3 texture_mean 569 non-null float64
4 perimeter_mean 569 non-null float64
5 area_mean 569 non-null float64
6 smoothness_mean 569 non-null float64
7 compactness_mean 569 non-null float64
8 concavity_mean 569 non-null float64
9 concave_poinits_mean 569 non-null float64
10 symmetry_mean 569 non-null float64
11 fractal_dimension_mean 569 non-null float64
12 radius_ste 569 non-null float64
13 texture_ste 569 non-null float64
14 perimeter_ste 569 non-null float64
15 area_ste 569 non-null float64
16 smoothness_ste 569 non-null float64
17 compactness_ste 569 non-null float64
18 concavity_ste 569 non-null float64
19 concave_poinits_ste 569 non-null float64
20 symmetry_ste 569 non-null float64
21 fractal_dimension_ste 569 non-null float64
22 radius_largest 569 non-null float64
23 texture_largest 569 non-null float64
24 perimeter_largest 569 non-null float64
25 area_largest 569 non-null float64
26 smoothness_largest 569 non-null float64
27 compactness_largest 569 non-null float64
28 concavity_largest 569 non-null float64
29 concave_poinits_largest 569 non-null float64
30 symmetry_largest 569 non-null float64
31 fractal_dimension_largest 569 non-null float64
dtypes: float64(30), int64(1), object(1)
memory usage: 142.4+ KB
Покажете ги првите пет редови:
dataset.head()
id diagnosis radius_mean texture_mean perimeter_mean area_mean smoothness_mean compactness_mean concavity_mean concave_poinits_mean ... radius_largest texture_largest perimeter_largest area_largest smoothness_largest compactness_largest concavity_largest concave_poinits_largest symmetry_largest fractal_dimension_largest
0 842302 М 17.99 10.38 122.80 1001.0 0.11840 0.27760 0.3001 0.14710 ... 25.38 17.33 184.60 2019.0 0.1622 0.6656 0.7119 0.2654 0.4601 0.11890 1 842517 М 20.57 17.77 132.90 1326.0 0.08474 0.07864 0.0869 0.07017 ... 24.99 23.41 158.80 1956.0 0.1238 0.1866 0.24 0.1860 0.274850 0.08902 2 84300903 M 19.25 21.25 130.00 1203.00.10960 0.15990 0.1974 0.12790 ... 23.57 25.53 152.508.07 1707.014 0.444 0.4245 0.4504 0.30 0.13875 3 84348301 M 11.42 20.38 78.58 386.
Поделете го сет на податоци во сетови за обука и тестирање со користење наpandas.DataFrame.sample
, pandas.DataFrame.drop
иpandas.DataFrame.iloc
Бидете сигурни да ги одвоите карактеристиките од етикетите на целта. Тест сет се користи за да се процени генерализабилност на вашиот модел на невидливи податоци.
train_dataset = dataset.sample(frac=0.75, random_state=1)
len(train_dataset)
427
test_dataset = dataset.drop(train_dataset.index)
len(test_dataset)
142
# The `id` column can be dropped since each row is unique
x_train, y_train = train_dataset.iloc[:, 2:], train_dataset.iloc[:, 1]
x_test, y_test = test_dataset.iloc[:, 2:], test_dataset.iloc[:, 1]
Пред обработка на податоците
Овој сет на податоци ги содржи просечните, стандардните грешки и најголемите вредности за секоја од 10-те мерења на туморот собрани по пример."diagnosis"
целната колона е категорична променлива со'M'
укажува на малигни тумори и'B'
Оваа колона треба да се претвори во нумерички бинарни формат за обука на модели.
наpandas.Series.map
Функцијата е корисна за мапирање на бинарни вредности на категориите.
Датотеката исто така треба да се претвори во тензор соtf.convert_to_tensor
функција по прелиминарната обработка е завршена.
y_train, y_test = y_train.map({'B': 0, 'M': 1}), y_test.map({'B': 0, 'M': 1})
x_train, y_train = tf.convert_to_tensor(x_train, dtype=tf.float32), tf.convert_to_tensor(y_train, dtype=tf.float32)
x_test, y_test = tf.convert_to_tensor(x_test, dtype=tf.float32), tf.convert_to_tensor(y_test, dtype=tf.float32)
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
I0000 00:00:1723689945.265757 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689945.269593 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689945.273290 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689945.276976 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689945.288712 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689945.292180 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689945.295550 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689945.299093 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689945.302584 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689945.306098 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689945.309484 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689945.312921 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.538105 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.540233 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.542239 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.544278 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.546323 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.548257 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.550168 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.552143 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.554591 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.556540 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.558447 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.560412 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.599852 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.601910 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.604061 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.606104 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.608094 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.610074 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.611985 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.613947 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.615903 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.618356 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.620668 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
I0000 00:00:1723689946.623031 132290 cuda_executor.cc:1015] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355
Користетеseaborn.pairplot
to review the joint distribution of a few pairs of mean-based features from the training set and observe how they relate to the target:
sns.pairplot(train_dataset.iloc[:, 1:6], hue = 'diagnosis', diag_kind='kde');
Оваа парна плоча покажува дека одредени карактеристики како радиус, периметар и област се високо поврзани. Ова се очекува бидејќи радиусот на туморот е директно вклучен во пресметувањето на и периметар и област.
Бидете сигурни да ги проверите и вкупните статистички податоци.Забележете како секоја карактеристика опфаќа сосема различен опсег на вредности.
train_dataset.describe().transpose()[:10]
|
|
mean |
std |
min |
25% |
50% |
75% |
max |
---|---|---|---|---|---|---|---|---|
id |
427.0 |
2.756014e+07 |
1.162735e+08 |
8670.00000 |
865427.500000 |
905539.00000 |
8.810829e+06 |
9.113205e+08 |
radius_mean |
427.0 |
1.414331e+01 |
3.528717e+00 |
6.98100 |
11.695000 |
13.43000 |
1.594000e+01 |
2.811000e+01 |
texture_mean |
427.0 |
1.924468e+01 |
4.113131e+00 |
10.38000 |
16.330000 |
18.84000 |
2.168000e+01 |
3.381000e+01 |
perimeter_mean |
427.0 |
9.206759e+01 |
2.431431e+01 |
43.79000 |
75.235000 |
86.87000 |
1.060000e+02 |
1.885000e+02 |
area_mean |
427.0 |
6.563190e+02 |
3.489106e+02 |
143.50000 |
420.050000 |
553.50000 |
7.908500e+02 |
2.499000e+03 |
smoothness_mean |
427.0 |
9.633618e-02 |
1.436820e-02 |
0.05263 |
0.085850 |
0.09566 |
1.050000e-01 |
1.634000e-01 |
compactness_mean |
427.0 |
1.036597e-01 |
5.351893e-02 |
0.02344 |
0.063515 |
0.09182 |
1.296500e-01 |
3.454000e-01 |
concavity_mean |
427.0 |
8.833008e-02 |
7.965884e-02 |
0.00000 |
0.029570 |
0.05999 |
1.297500e-01 |
4.268000e-01 |
concave_poinits_mean |
427.0 |
4.872688e-02 |
3.853594e-02 |
0.00000 |
0.019650 |
0.03390 |
7.409500e-02 |
2.012000e-01 |
symmetry_mean |
427.0 |
1.804597e-01 |
2.637837e-02 |
0.12030 |
0.161700 |
0.17840 |
1.947000e-01 |
2.906000e-01 |
id
427.0
2.756014e+07
1.162735e+08
8670.00000
865427.500000
905539.00000
8.810829e+06
9.113205e+08
радијално значење
427.0
1.414331e+01
3.528717e+00
6.98100
11.695000
13.43000
1.594000e+01
2.811000e+01
Текстура значи
427.0
1.924468e+01
4.113131e+00
10.38000
16.330000
18.84000
2.168000e+01
3.381000e+01
Периметар - значи
427.0
9.206759e+01
2.431431e+01
43.79000
75.235000
86.87000
1.060000e+02
1.885000e+02
Местоположба / Mean
427.0
6.563190e+02
3.489106e+02
143.50000
420.050000
553.50000
7.908500e+02
2.499000e+03
smoothness_mean
427.0
9.633618e-02
1.436820e-02
0.05263
0.085850
0.09566
1.050000e-01
1.634000e-01
Комбинирање - Mean
427.0
1.036597e-01
5.351893e-02
0.02344
0.063515
0.09182
1.296500e-01
3.454000e-01
Забелешка_Mean
427.0
8.833008e-02
7.965884e-02
0.00000
0.029570
0.05999
1.297500e-01
4.268000e-01
concave_poinits_mean Познати
427.0
4.872688e-02
3.853594e-02
0.00000
0.019650
0.03390
7.409500e-02
2.012000e-01
Симетрија - значи
427.0
1.804597e-01
2.637837e-02
0.12030
0.161700
0.17840
1.947000e-01
2.906000e-01
Given the inconsistent ranges, it is beneficial to standardize the data such that each feature has a zero mean and unit variance. This process is called нормализација.
class Normalize(tf.Module):
def __init__(self, x):
# Initialize the mean and standard deviation for normalization
self.mean = tf.Variable(tf.math.reduce_mean(x, axis=0))
self.std = tf.Variable(tf.math.reduce_std(x, axis=0))
def norm(self, x):
# Normalize the input
return (x - self.mean)/self.std
def unnorm(self, x):
# Unnormalize the input
return (x * self.std) + self.mean
norm_x = Normalize(x_train)
x_train_norm, x_test_norm = norm_x.norm(x_train), norm_x.norm(x_test)
Логистичка регресија
Before building a logistic regression model, it is crucial to understand the method's differences compared to traditional linear regression.
Основи на логистичката регресија
Линеарната регресија враќа линеарна комбинација на нејзините влезови; овој излез е неограничен.Логистичка регресијаТаа е во(0, 1)
За секој пример, тоа претставува веројатноста дека примерот припаѓа наПозитивноКласа на.
Логистичката регресија ги мапира континуираните резултати на традиционалната линеарна регресија,(-∞, ∞)
во однос на веројатноста,(0, 1)
Оваа трансформација е исто така симетрична, така што свртувањето на знакот на линеарниот излез резултира во обратно од оригиналната веројатност.
Нека Y означи веројатноста да се биде во класа1
Бараното мапирање може да се постигне со толкување на линеарниот излез за регресија какоЛогирање на шанситеСооднос на тоа да се биде во класа1
За разлика од класата0
:
ln(Y1−Y)=wX+b
Со поставување на wX+b=z, оваа равенка потоа може да се реши за Y:
Y=ez1+ez=11+e−z
Изразувањето 11+e−z е познато какоSigmoid функцијаЗатоа, равенката за логистичка регресија може да се напише како Y =σ (wX+b).
The dataset in this tutorial deals with a high-dimensional feature matrix. Therefore, the above equation must be rewritten in a matrix vector form as follows:
Y=σ(Xw+b)
Каде е:
- Ym×1: целен вектор
- Xm×n: Матрица на карактеристики
- Вн×1: вектор на тежина
- б) одбивање на
- σ: сигмоидна функција која се применува на секој елемент на излезниот вектор
Start by visualizing the sigmoid function, which transforms the linear output, (-∞, ∞)
, to fall between 0
и1
Функцијата Sigmoid е достапна воtf.math.sigmoid
.
x = tf.linspace(-10, 10, 500)
x = tf.cast(x, tf.float32)
f = lambda x : (1/20)*x + 0.6
plt.plot(x, tf.math.sigmoid(x))
plt.ylim((-0.1,1.1))
plt.title("Sigmoid function");
Лог губење функција
наЛогирање на губење, or binary cross-entropy loss, is the ideal loss function for a binary classification problem with logistic regression. For each example, the log loss quantifies the similarity between a predicted probability and the example's true value. It is determined by the following equation:
L=−1m∑i=1myi⋅log(y^i)+(1−yi)⋅log(1−y^i)
Каде е:
- y^: вектор на предвидените веројатности
- y: вектор на вистински цели
Можете да го користитеtf.nn.sigmoid_cross_entropy_with_logits
Оваа функција автоматски ја применува сигмоидната активација на излезот за регресија:
def log_loss(y_pred, y):
# Compute the log loss function
ce = tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=y_pred)
return tf.reduce_mean(ce)
Правило за ажурирање на градиентниот пад
The TensorFlow Core APIs support automatic differentiation with tf.GradientTape
Ако сте љубопитни за математиката зад логистичката регресијаАжурирање на градинатаЕве едно кратко објаснување:
Во горната равенка за загубата на log, потсетете се дека секој y^i може да се пренапише во однос на влезовите како σ(Xiw+b).
Целта е да се најде w и b кои го минимизираат губењето на логото:
L=−1m∑i=1myi⋅log(σ(Xiw+b))+(1−yi)⋅log(1−σ(Xiw+b))
Со земање на градиент L во однос на w, ќе го добиете следново:
∂L∂w=1m(σ(Xw+b)−y)X
Со земање на градиент L во однос на b, ќе го добиете следново:
∂L∂b=1m∑i=1mσ(Xiw+b)−yi
Сега, изградете го моделот на логистичка регресија.
class LogisticRegression(tf.Module):
def __init__(self):
self.built = False
def __call__(self, x, train=True):
# Initialize the model parameters on the first call
if not self.built:
# Randomly generate the weights and the bias term
rand_w = tf.random.uniform(shape=[x.shape[-1], 1], seed=22)
rand_b = tf.random.uniform(shape=[], seed=22)
self.w = tf.Variable(rand_w)
self.b = tf.Variable(rand_b)
self.built = True
# Compute the model output
z = tf.add(tf.matmul(x, self.w), self.b)
z = tf.squeeze(z, axis=1)
if train:
return z
return tf.sigmoid(z)
За да го потврдите, бидете сигурни дека нетренираниот модел изведува вредности во опсегот на(0, 1)
за мал дел од податоците за обука.
log_reg = LogisticRegression()
y_pred = log_reg(x_train_norm[:5], train=False)
y_pred.numpy()
array([0.9994985 , 0.9978607 , 0.29620072, 0.01979049, 0.3314926 ],
dtype=float32)
Следно, напишете функција за точност за да го пресметате процентот на точни класификации за време на обуката.За да ги извлечете класификациите од предвидените веројатности, поставете праг за кој сите веројатности повисоки од прагот припаѓаат на класата1
Ова е конфигуриран хиперпараметар кој може да се постави на0.5
Како на дефект.
def predict_class(y_pred, thresh=0.5):
# Return a tensor with `1` if `y_pred` > `0.5`, and `0` otherwise
return tf.cast(y_pred > thresh, tf.float32)
def accuracy(y_pred, y):
# Return the proportion of matches between `y_pred` and `y`
y_pred = tf.math.sigmoid(y_pred)
y_pred_class = predict_class(y_pred)
check_equal = tf.cast(y_pred_class == y,tf.float32)
acc_val = tf.reduce_mean(check_equal)
return acc_val
Train the model
Користењето на мини-парти за обука обезбедува и ефикасност на меморијата и побрза конвергенција.tf.data.Dataset
API има корисни функции за сет и shuffling. API ви овозможува да се изгради комплексни влез цевки од едноставни, повторна употреба парчиња.
batch_size = 64
train_dataset = tf.data.Dataset.from_tensor_slices((x_train_norm, y_train))
train_dataset = train_dataset.shuffle(buffer_size=x_train.shape[0]).batch(batch_size)
test_dataset = tf.data.Dataset.from_tensor_slices((x_test_norm, y_test))
test_dataset = test_dataset.shuffle(buffer_size=x_test.shape[0]).batch(batch_size)
Сега напишете тренинг лак за моделот за логистичка регресија. лакот ја користи функцијата за загуба на дневник и нејзините градиенти во однос на влезот за да ги ажурира параметрите на моделот.
# Set training parameters
epochs = 200
learning_rate = 0.01
train_losses, test_losses = [], []
train_accs, test_accs = [], []
# Set up the training loop and begin training
for epoch in range(epochs):
batch_losses_train, batch_accs_train = [], []
batch_losses_test, batch_accs_test = [], []
# Iterate over the training data
for x_batch, y_batch in train_dataset:
with tf.GradientTape() as tape:
y_pred_batch = log_reg(x_batch)
batch_loss = log_loss(y_pred_batch, y_batch)
batch_acc = accuracy(y_pred_batch, y_batch)
# Update the parameters with respect to the gradient calculations
grads = tape.gradient(batch_loss, log_reg.variables)
for g,v in zip(grads, log_reg.variables):
v.assign_sub(learning_rate * g)
# Keep track of batch-level training performance
batch_losses_train.append(batch_loss)
batch_accs_train.append(batch_acc)
# Iterate over the testing data
for x_batch, y_batch in test_dataset:
y_pred_batch = log_reg(x_batch)
batch_loss = log_loss(y_pred_batch, y_batch)
batch_acc = accuracy(y_pred_batch, y_batch)
# Keep track of batch-level testing performance
batch_losses_test.append(batch_loss)
batch_accs_test.append(batch_acc)
# Keep track of epoch-level model performance
train_loss, train_acc = tf.reduce_mean(batch_losses_train), tf.reduce_mean(batch_accs_train)
test_loss, test_acc = tf.reduce_mean(batch_losses_test), tf.reduce_mean(batch_accs_test)
train_losses.append(train_loss)
train_accs.append(train_acc)
test_losses.append(test_loss)
test_accs.append(test_acc)
if epoch % 20 == 0:
print(f"Epoch: {epoch}, Training log loss: {train_loss:.3f}")
Epoch: 0, Training log loss: 0.661
Epoch: 20, Training log loss: 0.418
Epoch: 40, Training log loss: 0.269
Epoch: 60, Training log loss: 0.178
Epoch: 80, Training log loss: 0.137
Epoch: 100, Training log loss: 0.116
Epoch: 120, Training log loss: 0.106
Epoch: 140, Training log loss: 0.096
Epoch: 160, Training log loss: 0.094
Epoch: 180, Training log loss: 0.089
Евалуација на перформансите
Набљудувајте ги промените во губењето и точноста на вашиот модел со текот на времето.
plt.plot(range(epochs), train_losses, label = "Training loss")
plt.plot(range(epochs), test_losses, label = "Testing loss")
plt.xlabel("Epoch")
plt.ylabel("Log loss")
plt.legend()
plt.title("Log loss vs training iterations");
plt.plot(range(epochs), train_accs, label = "Training accuracy")
plt.plot(range(epochs), test_accs, label = "Testing accuracy")
plt.xlabel("Epoch")
plt.ylabel("Accuracy (%)")
plt.legend()
plt.title("Accuracy vs training iterations");
print(f"Final training log loss: {train_losses[-1]:.3f}")
print(f"Final testing log Loss: {test_losses[-1]:.3f}")
Final training log loss: 0.089
Final testing log Loss: 0.077
print(f"Final training accuracy: {train_accs[-1]:.3f}")
print(f"Final testing accuracy: {test_accs[-1]:.3f}")
Final training accuracy: 0.968
Final testing accuracy: 0.979
Моделот покажува висока прецизност и ниска загуба кога станува збор за класификација на тумори во базата на податоци за обука, а исто така добро се генерализира на невидливите тестови. За да одите еден чекор понатаму, можете да ги истражите стапките на грешка кои даваат повеќе увид надвор од вкупниот точност.
За овој проблем, ФПР е процентот на предвидувањата за малигни тумори меѓу туморите кои всушност се бенигни.
Compute a confusion matrix using sklearn.metrics.confusion_matrix
, кој ја оценува точноста на класификацијата и го користи matplotlib за да ја прикаже матрицата:
def show_confusion_matrix(y, y_classes, typ):
# Compute the confusion matrix and normalize it
plt.figure(figsize=(10,10))
confusion = sk_metrics.confusion_matrix(y.numpy(), y_classes.numpy())
confusion_normalized = confusion / confusion.sum(axis=1, keepdims=True)
axis_labels = range(2)
ax = sns.heatmap(
confusion_normalized, xticklabels=axis_labels, yticklabels=axis_labels,
cmap='Blues', annot=True, fmt='.4f', square=True)
plt.title(f"Confusion matrix: {typ}")
plt.ylabel("True label")
plt.xlabel("Predicted label")
y_pred_train, y_pred_test = log_reg(x_train_norm, train=False), log_reg(x_test_norm, train=False)
train_classes, test_classes = predict_class(y_pred_train), predict_class(y_pred_test)
show_confusion_matrix(y_train, train_classes, 'Training')
show_confusion_matrix(y_test, test_classes, 'Testing')
Во многу медицински тестови како откривање на рак, имајќи висока лажна позитивна стапка за да се обезбеди ниска лажна негативна стапка е совршено прифатливо и всушност охрабрувано бидејќи ризикот од пропуштање на дијагноза на малигни тумори (лажна негативна) е многу полош од погрешно класифицирање на бенигни тумори како малигни (лажна позитивна).
Со цел да се контролира за ФПР и ФНР, обидете се да го промените хиперпараметар за прагот пред да ги класифицирате предвидувањата за веројатност. Понискиот праг ги зголемува вкупните шанси на моделот да направи класификација на малигни тумори. Ова неизбежно го зголемува бројот на лажни позитиви и ФПР, но исто така помага да се намали бројот на лажни негативи и ФНР.
Зачувајте го моделот
Започнете со создавање на модул за извоз кој зема сурови податоци и ги извршува следниве операции:
- Нормализација
- Веројатност предвидување
- Предвидување на класа
class ExportModule(tf.Module):
def __init__(self, model, norm_x, class_pred):
# Initialize pre- and post-processing functions
self.model = model
self.norm_x = norm_x
self.class_pred = class_pred
@tf.function(input_signature=[tf.TensorSpec(shape=[None, None], dtype=tf.float32)])
def __call__(self, x):
# Run the `ExportModule` for new data points
x = self.norm_x.norm(x)
y = self.model(x, train=False)
y = self.class_pred(y)
return y
log_reg_export = ExportModule(model=log_reg,
norm_x=norm_x,
class_pred=predict_class)
Ако сакате да го зачувате моделот во неговата моментална состојба, можете да го направите тоа соtf.saved_model.save
За да вчитате зачуван модел и да правите предвидувања, користетеtf.saved_model.load
function.
models = tempfile.mkdtemp()
save_path = os.path.join(models, 'log_reg_export')
tf.saved_model.save(log_reg_export, save_path)
INFO:tensorflow:Assets written to: /tmpfs/tmp/tmp9k_sar52/log_reg_export/assets
INFO:tensorflow:Assets written to: /tmpfs/tmp/tmp9k_sar52/log_reg_export/assets
log_reg_loaded = tf.saved_model.load(save_path)
test_preds = log_reg_loaded(x_test)
test_preds[:10].numpy()
array([1., 1., 1., 1., 0., 1., 1., 1., 1., 1.], dtype=float32)
Conclusion
Овој бележник воведе неколку техники за справување со проблемот со логистичката регресија.Еве уште неколку совети кои можат да помогнат:
- TensorFlow Core APIs може да се користат за изградба на работни процеси за машинско учење со високи нивоа на конфигурирање
- Анализирањето на стапките на грешка е одличен начин да се добие повеќе увид во перформансите на моделот за класификација надвор од неговата вкупна точност.
- Преоптоварување е уште еден заеднички проблем за логистички регресија модели, иако тоа не беше проблем за ова упатство. Посетете го Overfit и underfit упатство за повеќе помош со ова.
За повеќе примери за користење на TensorFlow Core API, погледнетеВодичАко сакате да дознаете повеќе за полнење и подготовка на податоци, погледнете ги упатствата наИзображување на податоци за полнењеилиCSV податоци за полнење.
Оригинално објавен на веб-страницата на TensorFlow, овој напис се појавува тука под нов наслов и е лиценциран под CC BY 4.0.
Оригинално објавен на веб-страницата на TensorFlow, овој напис се појавува тука под нов наслов и е лиценциран под CC BY 4.0.
Тензорфлоу