コンテンツ概要
- セットアップ
- Load the data
- データの前処理
- 論理回帰
- 論理回帰の基本
- Log Loss 機能
- gradient descent update ルール
- トレーニング モデル
- 業績評価
- Save モデル
- 結論
このガイドでは、TensorFlow Core 低レベルの API を使用して、物流回帰でバイナリ分類を実行する方法を示しています。ウィスコンシンの乳がんデータセット腫瘍の分類について
論理回帰特徴を持つ一連の例を考慮すると、物流回帰の目標は、特定のクラスに属する各例の確率として解釈できる0と1の間の値を出力することである。
セットアップ
このチュートリアルはパンダCSV ファイルを A に読み込むデータフレームで、シアボンデータセット内でペアウィザードの関係を構築するには、レッスン混乱マトリックスを計算するために、そして、マッピング視覚化を作るために
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
データをロード
次に、Load theウィスコンシンの乳がんデータセットから TheUCI Machine Learning Repositoryこのデータセットには、腫瘍の半径、テクスチャ、およびコンカビリティなどのさまざまな特徴が含まれています。
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 に読み込むデータフレーム利用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
最初の5行を表示する:
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
平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成30年 平成
データセットをトレーニングおよびテストセットに分割するpandas.DataFrame.sample
で、pandas.DataFrame.drop
そしてpandas.DataFrame.iloc
ターゲット ラベルから機能を分割することを確認してください. The test set is used to evaluate your model's generalizability to unseen data. テストセットは、あなたのモデルの一般化可能性を目に見えないデータに評価するために使用されます。
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"
ターゲットコラムは、Categoric Variable with'M'
悪性腫瘍と、'B'
良性腫瘍の診断を示す. この列はモデルトレーニングのための数値バイナリ形式に変換する必要があります。
THEpandas.Series.map
機能は、バイナリ値をカテゴリーにマッピングするのに役立ちます。
データセットはまた、Tensor に変換する必要があります。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
トレーニングセットから数組の平均基盤特性の共同分布をレビューし、それらが目標にどのように関連しているかを観察する:
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
perimeter=意味
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
スムージー / Mean
427.0
9.633618e-02
1.436820e-02
0.05263
0.085850
0.09566
1.050000e-01
1.634000e-01
コンパクト=意味
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
シミュレーション=意味
427.0
1.804597e-01
2.637837e-02
0.12030
0.161700
0.17840
1.947000e-01
2.906000e-01
不一致な範囲を考慮すると、各機能にゼロ平均と単位変数があるようにデータを標準化することが有益である。標準化.
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)
論理回帰
物流回帰モデルを構築する前に、伝統的な線形回帰と比べる方法の違いを理解することが重要です。
論理回帰の基本
Linear regression returns a linear combination of its inputs; this output is unlimited. この出力は無制限です。論理回帰is in the(0, 1)
範囲. それぞれの例では、例がその範囲に属する確率を表します。陽性クラス
論理回帰は、伝統的な線形回帰の継続的な出力をマッピングします。(-∞, ∞)
2 確率は、(0, 1)
この変換はまたシンメトリックであり、線形出力のシンボルを振り回すことで、元の確率の逆に結果が出る。
クラスにいる確率を表します。1
(腫瘍は悪性である) 望ましいマッピングは、線形回帰出力を解釈することによって達成することができる。log oddsRatio of Being in Class(クラスにいること)1
クラスとは異なり、0
:
ln(Y1−Y)=wX+b
wX + b = z を設定すると、この方程式は Y に対して解決できます:
Y=ez1+ez=11+e−z
表現 11+e−z は、e−z と呼ばれます。シグモード機能したがって、論理回帰の方程式はY=σ(wX+b)として書くことができる。
このチュートリアルのデータセットは、高次元機能マトリックスに関係しています. Therefore, the above equation must be rewritten in a matrix vector form as follows:
Y=σ(Xw+b)
where:
- YM×1:ターゲットベクター
- XM×N:A Feature Matrix(XM×N)
- wn×1:重量ベクター
- B:バイアス
- σ: 出力ベクターの各要素に適用されるシグモイド関数
Start by visualizing the sigmoid function, which transforms the linear output, (-∞, ∞)
落ちるのは、0
そして1
シグモイド機能は、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");
Log Loss 機能
THEロゴ 喪失, 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. それは次の方程式によって決定されます:
L=−1m∑i=1myi⋅log(y^i)+(1−yi)⋅log(1−y^i)
どこ:
- y^: 予測確率のベクター
- y: 真のターゲットのベクター
You can use thetf.nn.sigmoid_cross_entropy_with_logits
function to compute the log loss. This function automatically applies the sigmoid activation to the regression output:
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)
gradient descent update ルール
TensorFlow Core API は、自動差異をサポートします。tf.GradientTape
もしあなたが論理回帰の背後にある数学について好奇心を持っているならグレードアップデート, here is a short explanation:
In the above equation for the log loss, recall that each y^i can be rewritten in terms of the inputs as σ(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
トレーニング モデル
トレーニングのためのミニバッチを使用すると、メモリの効率性とより迅速なコンバーゲンスの両方を提供します。tf.data.Dataset
API にはバッチングとシャフリングのための有用な機能があります 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)
The loop utilizes the log loss function and its gradients with respect to the input in order to iteratively update the model's parameters. このループは、モデルのパラメータを繰り返し更新するために、ログ損失機能とそのグラディエントを使用します。
# 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
このモデルは、トレーニングデータセットで腫瘍を分類する際の高精度と低損失を示し、また、目に見えないテストデータによく一般化します。さらに一歩進むには、全体的な精度スコアを超えてより多くの洞察を与えるエラー率を探索することができます。
この問題のために、FPRは、本質的に良性である腫瘍の間の悪性腫瘍予測の割合です。
混乱マトリックスを使用して計算するsklearn.metrics.confusion_matrix
, which evaluates the accuracy of the classification, and use matplotlib to display the 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')
がん検出などの多くの医学的検査研究では、低い偽否定率を確保するために高い偽否定率を持つことは、悪性腫瘍の診断(偽否定)を逃すリスクが悪性腫瘍(偽否定)として誤って分類するよりもはるかに悪いため、完全に受け入れられ、実際に奨励されます。
FPRとFNRをコントロールするには、確率予測を分類する前に上位値のハイパーパラメータを変更してみてください。下位値は、悪性腫瘍の分類のモデルの全体的な確率を増加させます。これは必然的に偽ポジティブとFPRの数を増加させるが、偽ネガティブとFNRの数を減らすのに役立ちます。
Save モデル
最初に、原始データを収集し、以下の操作を実行する輸出モジュールを作成します。
- 標準化
- 確率予測
- クラス予測
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
機能です。
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)
結論
このノートは、物流回帰問題に対処するためのいくつかのテクニックを紹介しました. Here are some more tips that may help:
- TensorFlow Core API は、高度な構成可能な機械学習ワークフローを構築するために使用できます。
- エラー レートを分析することは、分類モデルのパフォーマンスについて、全体的な精度スコアを超えてより多くの洞察を得るための素晴らしい方法です。
- Overfittingは、このチュートリアルでは問題ではなかったが、物流回帰モデルのもう一つの一般的な問題である Overfit and underfit チュートリアルをご覧ください。
TensorFlow Core API の使用の詳細については、こちらをご覧ください。guide. データのロードおよび準備についてもっと知りたい場合は、上記のチュートリアルをご覧ください画像データロードまたはCSVデータロード.
最初はTensorFlowのウェブサイトに掲載され、この記事はここに新しいタイトルの下に表示され、CC BY 4.0でライセンスを受けています。
最初はTensorFlowのウェブサイトに掲載され、この記事はここに新しいタイトルの下に表示され、CC BY 4.0でライセンスを受けています。
TensorFlowについて