逻辑回归实现

相关库引用

import tensorflow as tf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

加载数据

data = pd.read_csv("E:/datasets/dataset/credit-a.csv", header = None) # 获取数据
x = data.iloc[:, :-1]
y = data.iloc[:, -1].replace(-1, 0)
data.head()

tf.keras实现逻辑回归和softmax多分类
观察发现,最后一列(label)非0即1。因此,这是一个二分类问题。可以考虑把-1全都替换成0

定义模型

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(4, input_shape = (15, ), activation = 'relu'))
model.add(tf.keras.layers.Dense(4, activation = 'relu'))
model.add(tf.keras.layers.Dense(1, activation = 'sigmoid'))
model.summary()

tf.keras实现逻辑回归和softmax多分类

这个模型第一层,有4个神经元,因为输入是15个参数,因此参数个数为(4*15+4=64)。这里使用ReLU作为激活函数;
模型第二层,有4个神经元,输入是4个参数,因此参数个数为(4*4+4=20)。这里使用ReLU作为激活函数;
模型第三层,有1个神经元,输入是4个参数,因此参数个数为(1*4+1=5)。这里使用Sigmoid作为激活函数。
这里总共有89个参数

模型编译

model.compile(
    optimizer = 'adam',
    loss      = 'binary_crossentropy',
    metrics   = ['acc'] # 设置显示的参数
)

这里是二分类问题,因此损失函数可以设置为binary_crossentropy

训练模型

history = model.fit(x, y, epochs = 1000) # 训练1000次

tf.keras实现逻辑回归和softmax多分类

下面我们来看一下模型的一些参数

history.history.keys()

发现有loss和acc两个参数
然后,我们再画出随着训练轮数的增加,loss和acc的变化曲线图

plt.plot(history.epoch, history.history.get('loss'))
plt.plot(history.epoch, history.history.get('acc'))

loss变化曲线图:
tf.keras实现逻辑回归和softmax多分类
acc变化曲线图:
tf.keras实现逻辑回归和softmax多分类

softmax多分类实现

加载数据

(train_image, train_label), (test_image, test_label) = tf.keras.datasets.fashion_mnist.load_data() # 获取数据
plt.imshow(train_image[0]) # 显示第一张图片

tf.keras实现逻辑回归和softmax多分类

数据归一化:

train_image = train_image / 255
test_image = test_image / 255

定义模型

model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape = (28, 28)))
model.add(tf.keras.layers.Dense(128, activation = 'relu'))
# model.add(tf.keras.layers.Dropout(0.5)) 添加一个dropout层,防止过拟合
model.add(tf.keras.layers.Dense(10, activation = 'softmax'))

因为输入图像是二维的(28*28),因此需要先将其变换成一维向量。
第一层128个神经元,激活函数为ReLU
第二层10个神经元,激活函数为softmax

模型编译

model.compile(
    optimizer = 'adam',
    loss      = 'sparse_categorical_crossentropy',
    metrics   = ['acc']
)

这里因为是多分类问题,并且标签是一般的数值标签,因此损失函数使用sparse_categorical_crossentropy

训练模型

model.fit(train_image, train_label, epochs = 10) # 训练10次
# model.fit(train_image, train_label, epochs = 10, validation_data = (test_image, test_label)) # validation_data可以同时查看测试集的正确率和损失

tf.keras实现逻辑回归和softmax多分类

模型评价

在测试集上评估训练的模型

model.evaluate(test_image, test_label)

tf.keras实现逻辑回归和softmax多分类

one-hot编码

one-hot编码的转换

train_label_onehot = tf.keras.utils.to_categorical(train_label)
test_label_onehot = tf.keras.utils.to_categorical(test_label)

模型的编译

model.compile(
    optimizer = 'adam',
    loss      = 'categorical_crossentropy',
    metrics   = ['acc']
)

因为使用的是one-hot编码,因此损失函数使用categorical-crossentropy