对数几率回归是利用广义线性模型解决二分类任务的一种方法。
对数几率回归简称对率回归,是使用Sigmoid函数作为联系函数时的广义线性模型,是广义线性模型的一个特例。
对于一个线性回归的模型我们一般都会定义为
为了做一个二分类的估计我们可以做一个概率的判断

但是单位阶跃函数是不连续的,难以求导,所以用对数几率函数替代
此函数最为一个激活函数在二分类的问题上简直是完美,此函数的特征

此函数有个自己的名字叫做sigmoid函数,我们可以看到在整个实数域上其结果值都限制在(0,1)中。
由此得到拟合模型
为了简单我们设

于是便有
使用极大似然估计对于y=1的概率,可以得到数据集每个样本的概率是
对于{0,1},则有
最终损失函数
最小时的值,就可求出模型参数
最后使用梯度下降法进行拟合求出最小时
的值
下面来看一个泰坦尼格号营救计划的一个实例
tensorflow 1.14.0
import pandas as pd
import numpy as np
import tensorflow as tf
一、数据准备
a.读取数据
data = pd.read_csv('./datasets/train.csv')
b.查看数据结构

c.数据数据处理
data = data[[ 'Survived', 'Pclass', 'Sex', 'Age', 'SibSp',
'Parch', 'Fare', 'Embarked']]
#对于null 值进行0的填充
data = data.fillna(0)
#将 pclass 数据设置成独热编码
data['p1'] = np.array(data['Pclass'] == 1).astype(np.float64)
data['p2'] = np.array(data['Pclass'] == 2).astype(np.float64)
data['p3'] = np.array(data['Pclass'] == 3).astype(np.float64)#删除无用项
del data['Pclass']
#查看Embarked项的值分布
data.Embarked.unique()
#将 Embarked 数据设置成独热编码
data['e1'] = np.array(data['Embarked'] == 'S').astype(np.float64)
data['e2'] = np.array(data['Embarked'] == 'C').astype(np.float64)
data['e3'] = np.array(data['Embarked'] == 'Q').astype(np.float64)
del data['Embarked']
data_data = np.stack([data.Sex.values.astype(np.float64), data.Age.values.astype(np.float64), data.SibSp.values.astype(np.float64), data.Parch.values.astype(np.float64), data.Fare.values.astype(np.float64), data.p1.values, data.p2.values, data.p3.values, data.e1.values, data.e2.values, data.e3.values ]).T
data_target = np.reshape(data.Survived.values.astype(np.float64), (891,1))
二、网络设置
a.设置参数
x = tf.placeholder('float', shape=[None, 11])
y = tf.placeholder('float', shape=[None, 1])
b.输入训练数据
weights = tf.Variable(tf.random_normal([11,1]))
bias = tf.Variable(tf.random_normal([1]))
c.执行推断
output = tf.matmul(x, weights) + bias
pred = tf.cast(tf.sigmoid(output)>0.5, tf.float32)
d.计算损失
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=output))
e.训练模型
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
f.评估
accuracy = tf.reduce_mean(tf.cast(tf.equal(pred, y), tf.float64))
最后开始进行训练
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(10000):
for n in range(len(data_target)//100):
index = np.random.permutation(len(data_target))
data = data_data[index]
target = data_target[index]
batch_xs = data[n:n+100]
batch_xy = target[n:n+100]
sess.run(train_step, feed_dict={x: batch_xs, y: batch_xy})
if i%1000 == 0:
print(sess.run((loss, accuracy), feed_dict={x:batch_xs, y:batch_xy}))
训练输出

网友评论