1 什么是逻辑回归
1.1逻辑回归与线性回归的区别:
线性回归预测的是一个连续的值,不论是单变量还是多变量(比如多层感知器),他都返回的是一个连续的值,放在图中就是条连续的曲线,他常用来表示的数学方法是Y=aX+b;
与之相对的,逻辑回归给出的值并不是连续的,而是 类似于“是” 和 “否” 的回答,这就类似于二元分类的问题。
1.2逻辑回归实现(sigmoid):
在逻辑回归算法中,我们常使用的激活函数是Sigmoid函数,他能够将数据映射到 0 到 1 之间,并且通过映射判断,如果映射到的值在 1 ,就返回出一个正面的结果,与之相反,当映射的值为0时就返回一个负面的结果,这就是我们上面所提到的回答: “是”或“否”。那么,什么是Sigmoid函数呢?
Sigmoid函数是一种在生物学中常见的S型函数,也称为S型生长曲线,他的值我们可以看做是恒在 0 到 1 之间的(因为这段区间使我们真正所关心的)。sigmoid的形式如下图所示:
深度学习网络本质上来说也是一种多层映射网络,当我们输入特征后,在通过如多层感知器的映射后,会一层层的映射到一个最终的形式。使用Sigmoid函数的意义就在于,他会在最后的映射中将结果映射成为0 到 1 之间的值,这时候我们就可以将映射后的值看做是神经网络给出的概率的结果。
1.3逻辑回归的常用损失函数(交叉熵):
在线性回归中,我们常用 “mse” (平方差) 来进行损失的刻画,但是“mse”一般来进行惩罚的是损失与原有的数据集在同一个数量级的情况,假如说数量级特别的庞大,但是损失值比较小,那么所得到的损失就会很小,不利于我们的训练。针对这种情形,我们在逻辑回归中(同时在大多数的二分类问题中)使用更有效的方法————交叉熵,他会给我们展现出一种更大的损失。下面这个图就直观的显示出了L2(均方差)与logistic(交叉熵)之间关于在处理损失的差别。
在keras中,我们使用的函数是binary_crossentropy,下面会以一个例子的形式来使用交叉熵实现逻辑回归。
2逻辑回归的简单实现
这是一个关于信用卡是否存在欺诈行为的预测。
我们给出部分数据集,并查看是否为一个二分类问题
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()
查看一下我们创建的模型是否符合我们的需求
再配置一个优化器,采用TensorFlow的梯度下降算法进行优化,使用交叉熵作为损失函数,并计算其正确率,开始训练我们的模型,再调用原始数据集中的前三个数据进行预测测试。
model.summary() # 配置优化器 # 使用梯度下降算法进行优化,使用交叉熵作为损失函数,并计算其正确率 model.compile( optimizer='adam', loss='binary_crossentropy', metrics=['acc'] ) # 训练模型 history = model.fit(x,y,epochs=100)
结果显而易见
这时候,我们也可以通过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()
在这里,我们就会明显的发现,当我们训练到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()