对数几率回归

对数几率回归是利用广义线性模型解决二分类任务的一种方法。

对数几率回归简称对率回归,是使用Sigmoid函数作为联系函数时的广义线性模型,是广义线性模型的一个特例。

对于一个线性回归的模型我们一般都会定义为

为了做一个二分类的估计我们可以做一个概率的判断

单位阶跃函数

但是单位阶跃函数是不连续的,难以求导,所以用对数几率函数替代

此函数最为一个激活函数在二分类的问题上简直是完美,此函数的特征

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.查看数据结构

train.csv

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}))

训练输出

你可能感兴趣的:(对数几率回归)