1 什么是逻辑回归

1.1逻辑回归与线性回归的区别:

  线性回归预测的是一个连续的值,不论是单变量还是多变量(比如多层感知器),他都返回的是一个连续的值,放在图中就是条连续的曲线,他常用来表示的数学方法是Y=aX+b;

  与之相对的,逻辑回归给出的值并不是连续的,而是 类似于“是” 和 “否” 的回答,这就类似于二元分类的问题。

1.2逻辑回归实现(sigmoid):

  在逻辑回归算法中,我们常使用的激活函数是Sigmoid函数,他能够将数据映射到 0 到 1 之间,并且通过映射判断,如果映射到的值在 1 ,就返回出一个正面的结果,与之相反,当映射的值为0时就返回一个负面的结果,这就是我们上面所提到的回答: “是”或“否”。那么,什么是Sigmoid函数呢?

  Sigmoid函数是一种在生物学中常见的S型函数,也称为S型生长曲线,他的值我们可以看做是恒在 0  到  1 之间的(因为这段区间使我们真正所关心的)。sigmoid的形式如下图所示:   深度学习之逻辑回归的实现  -- sigmoid

  深度学习网络本质上来说也是一种多层映射网络,当我们输入特征后,在通过如多层感知器的映射后,会一层层的映射到一个最终的形式。使用Sigmoid函数的意义就在于,他会在最后的映射中将结果映射成为0 到 1 之间的值,这时候我们就可以将映射后的值看做是神经网络给出的概率的结果。

1.3逻辑回归的常用损失函数(交叉熵):

  在线性回归中,我们常用 “mse” (平方差) 来进行损失的刻画,但是“mse”一般来进行惩罚的是损失与原有的数据集在同一个数量级的情况,假如说数量级特别的庞大,但是损失值比较小,那么所得到的损失就会很小,不利于我们的训练。针对这种情形,我们在逻辑回归中(同时在大多数的二分类问题中)使用更有效的方法————交叉熵,他会给我们展现出一种更大的损失。下面这个图就直观的显示出了L2(均方差)与logistic(交叉熵)之间关于在处理损失的差别。

 深度学习之逻辑回归的实现  -- sigmoid

  在keras中,我们使用的函数是binary_crossentropy,下面会以一个例子的形式来使用交叉熵实现逻辑回归。


 

2逻辑回归的简单实现

   这是一个关于信用卡是否存在欺诈行为的预测。

   我们给出部分数据集,并查看是否为一个二分类问题

data = pd.read_csv('tensorflow_study\dataset\credit-a.csv')

# 查看数据
print(data.head())
# 查看数据是否为二分类问题
print(data.iloc[:,-1].value_counts())

深度学习之逻辑回归的实现  -- sigmoid

   然后,我们取出数据,并建立一个神经网络模型,这里采用两个隐藏层,使得训练时拟合程度更高一些。

# 取出除了最后一列的所有数据
x = data.iloc[:, :-1]
# 取出数据并进行替换
y = data.iloc[:, -1].replace(-1,0)

# 模拟神经网络创建顺序模型,添加两个隐藏层
# 第一层是获取到的4个单元的隐藏层,数据集是15个数据的元组,使用relu激活
# 第二层是一个简单的数据处理层
# 第三层是输出层,使用Sigmoid进行激活,完成映射
model = tf.keras.Sequential(
    [tf.keras.layers.Dense(4,input_shape=(15,),activation='relu'),
    tf.keras.layers.Dense(4,activation='relu'),
    tf.keras.layers.Dense(1,activation='sigmoid')]
)

model.summary()

  查看一下我们创建的模型是否符合我们的需求

深度学习之逻辑回归的实现  -- sigmoid

   再配置一个优化器,采用TensorFlow的梯度下降算法进行优化,使用交叉熵作为损失函数,并计算其正确率,开始训练我们的模型,再调用原始数据集中的前三个数据进行预测测试。

model.summary()

# 配置优化器
# 使用梯度下降算法进行优化,使用交叉熵作为损失函数,并计算其正确率
model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['acc']
)

# 训练模型
history = model.fit(x,y,epochs=100)

 t_data = data.iloc[:3,:-1]
 print(model.predict(t_data))

  结果显而易见

深度学习之逻辑回归的实现  -- sigmoid

   这时候,我们也可以通过pandas进行对我们模型的训练过程进行可视化查看,方便我们能够更加准确的针对我们的模型训练做一些改进。

# 查看我们在训练过程中的loss和acc的变化情况
# 散点图展示数据
plt.figure(1)

ax1 = plt.subplot(2,1,1)
ax2 = plt.subplot(2,1,2)
plt.sca(ax1)
plt.title('loss ')
plt.plot(history.epoch,history.history.get('loss'))
plt.sca(ax2)
plt.title('acc ')
plt.plot(history.epoch,history.history.get('acc'))
plt.show()

深度学习之逻辑回归的实现  -- sigmoid

   在这里,我们就会明显的发现,当我们训练到18次的时候,loss的变化就趋于稳定状态了,二acc也是跟随着loss的稳定趋于更小的波动。

 

::下面附上源码和数据

'''
@Author: mountain
@Date: 2020-03-30 16:11:00
@Description: 逻辑回归 --预测信用卡是否存在欺诈行为
'''
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf


data = pd.read_csv('tensorflow_study\dataset\credit-a.csv')

# 查看数据
print(data.head())
# 查看数据是否为二分类问题
print(data.iloc[:,-1].value_counts())


# 取出除了最后一列的所有数据
x = data.iloc[:, :-1]
# 取出数据并进行替换
y = data.iloc[:, -1].replace(-1,0)

# 模拟神经网络创建顺序模型,添加两个隐藏层
# 第一层是获取到的4个单元的隐藏层,数据集是15个数据的元组,使用relu激活
# 第二层是一个简单的数据处理层
# 第三层是输出层,使用Sigmoid进行激活,完成映射
model = tf.keras.Sequential(
    [tf.keras.layers.Dense(4,input_shape=(15,),activation='relu'),
    tf.keras.layers.Dense(4,activation='relu'),
    tf.keras.layers.Dense(1,activation='sigmoid')]
)

model.summary()

# 配置优化器
# 使用梯度下降算法进行优化,使用交叉熵作为损失函数,并计算其正确率
model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['acc']
)

# 训练模型
history = model.fit(x,y,epochs=100)

t_data = data.iloc[:3,:-1]
print(model.predict(t_data))


# 查看我们在训练过程中的loss和acc的变化情况
# 散点图展示数据
plt.figure(1)

ax1 = plt.subplot(2,1,1)
ax2 = plt.subplot(2,1,2)
plt.sca(ax1)
plt.title('loss ')
plt.plot(history.epoch,history.history.get('loss'))
plt.sca(ax2)
plt.title('acc ')
plt.plot(history.epoch,history.history.get('acc'))
plt.show()
ljhg

相关文章:

  • 2021-10-13
  • 2021-08-26
  • 2021-04-06
  • 2022-12-23
  • 2022-12-23
  • 2021-08-21
  • 2022-12-23
猜你喜欢
  • 2021-08-14
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2018-12-19
  • 2021-06-15
相关资源
相似解决方案