Точность очень плохая в логистической регрессии тензорного потока - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь написать программу, которая предсказывает наличие злокачественной или доброкачественной опухоли

Набор данных из: https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Prognostic%29

Это мой код, и моя точность составляет около 65%, что не лучше, чем бросок монеты. Любая помощь будет оценена

import tensorflow as tf
import pandas as pd
import numpy as np


df = pd.read_csv(r'D:\wholedesktop\logisticReal.txt')
df.drop(['id'], axis=1, inplace=True)

x_data = np.array(df.drop(['class'], axis=1))
x_data = x_data.astype(np.float64)
y = df['class']
y.replace(2, 0, inplace=True)
y.replace(4, 1, inplace=True)
y_data = np.array(y)
# y shape = 681,1
# x shape = 681,9

x = tf.placeholder(name='x', dtype=np.float32)
y = tf.placeholder(name='y', dtype=np.float32)

w = tf.Variable(dtype=np.float32, initial_value=np.random.random((9, 1)))
b = tf.Variable(dtype=np.float32, initial_value=np.random.random((1, 1)))

y_ = (tf.add(tf.matmul(x, w), b))
error = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=y_, labels=y))
goal = tf.train.GradientDescentOptimizer(0.05).minimize(error)

prediction = tf.round(tf.sigmoid(y_))
correct = tf.cast(tf.equal(prediction, y), dtype=np.float64)
accuracy = tf.reduce_mean(correct)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(2000):
        sess.run(goal, feed_dict={x: x_data, y: y_data})
        print(i, sess.run(accuracy, feed_dict={x: x_data, y: y_data}))

    weight = sess.run(w)
    bias = sess.run(b)
    print(weight)
    print(bias)

1 Ответ

0 голосов
/ 17 мая 2018

Ваша нейронная сеть имеет только один слой, поэтому лучшее, что она может сделать, это разместить прямую линию на ваших данных, которая разделяет различные классы.Этого совершенно недостаточно для общего (многомерного) набора данных.Сила (глубоких) нейронных сетей заключается в связи между многими слоями нейронов.В вашем примере вы можете добавить больше слоев вручную, передав выходные данные matmul в новый matmul с различными весами и смещениями, или вы можете использовать коллекцию contrib.layers, чтобы сделать ее более краткой:

x = tf.placeholder(name='x', dtype=np.float32)
fc1 = tf.contrib.layers.fully_connected(inputs=x, num_outputs=16, activation_fn=tf.nn.relu)
fc2 = tf.contrib.layers.fully_connected(inputs=fc1, num_outputs=32, activation_fn=tf.nn.relu)
fc3 = tf.contrib.layers.fully_connected(inputs=fc2, num_outputs=64, activation_fn=tf.nn.relu)

Хитрость заключается в том, чтобы передать выходные данные одного слоя в качестве входных данных следующему слою.По мере того, как вы добавляете все больше и больше слоев, ваша точность будет расти (вероятно, из-за переоснащения, используйте dropout, чтобы исправить это).

...