使用Tensorflow进行逻辑回归的二进制分类

时间:2018-04-03 23:18:50

标签: machine-learning logistic-regression

我也是一个ML课程,我正试图在tensorflow上变得更好。为此,我购买了Nishant Shukhla(ML with tensorflow)的书,并试图用不同的数据集运行2特征示例。

使用书中的假数据集,我的代码运行正常。但是,对于我在ML课程中使用的数据,代码拒绝收敛。它的学习率非常小,但确实会收敛,但学到的权重是错误的。 还附加要素数据的图。它不应该是特征缩放问题,因为两个特征上的值在30-100个单位之间变化。

我真的在努力应对不透明的张量流 - 任何帮助都会受到赞赏:

""" Solution for simple logistic regression model
"""
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

import numpy as np
import tensorflow as tf
import time
import matplotlib.pyplot as plt

# Define paramaters for the model
learning_rate = 0.0001
training_epochs = 300

data = np.loadtxt('ex2data1.txt', delimiter=',')
x1s = np.array(data[:,0]).astype(np.float32)
x2s = np.array(data[:,1]).astype(np.float32)
ys = np.array(data[:,2]).astype(np.float32)

print('Plotting data with + indicating (y = 1) examples and o \n indicating (y = 0) examples.\n')
color = ['red' if l == 0 else 'blue' for l in ys]
myplot = plt.scatter(x1s, x2s, color = color)

# Put some labels
plt.xlabel("Exam 1 score")
plt.ylabel("Exam 2 score")

# Specified in plot order
plt.show()

# Step 2: Create datasets
X1 = tf.placeholder(tf.float32, shape=(None,), name="x1")
X2 = tf.placeholder(tf.float32, shape=(None,), name="x2")
Y = tf.placeholder(tf.float32, shape=(None,), name="y")
w = tf.Variable(np.random.rand(3,1), name='w', dtype='float32',trainable=True)
y_model = tf.sigmoid(w[2]*X2 + w[1]*X1 + w[0])
cost = tf.reduce_mean(-tf.log(y_model*Y + (1-y_model)*(1-Y)))
train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

writer = tf.summary.FileWriter('./graphs/logreg', tf.get_default_graph())
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    prev_error = 0.0;
    for epoch in range(training_epochs):
        error, loss = sess.run([cost, train_op], feed_dict={X1:x1s, X2:x2s, Y:ys})
        print("epoch = ", epoch, "loss = ", loss)
        if abs(prev_error - error) < 0.0001:
            break
        prev_error = error

    w_val = sess.run(w, {X1:x1s, X2:x2s, Y:ys})
    print("w learned = ", w_val)

writer.close()
sess.close()

1 个答案:

答案 0 :(得分:0)

X1和X2的范围均为~20-100。但是,一旦我缩放它们,解决方案就会很好地融合。