0

我的神经网络试图预测一个人是否患有糖尿病,这是我的数据集 kaggle.com/uciml/pima-indians-diabetes-database。我使用的是 3 层神经网络,我的准确率为 65%。
任何提高准确性的帮助将不胜感激。

这是我的代码---------------------------------- ------------

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

df=pd.read_csv(r'C:\Users\manas\Downloads\diabetes.csv')

actualY=df['Outcome']
actualX=df.drop(['Outcome'],axis=1)
actualX=np.array(np.reshape(actualX,newshape=[768,8]))
actualY=np.array(np.reshape(actualY,newshape=[768,1]))
#Y=[768,1]
#X=[768,8]
x=tf.placeholder(dtype=tf.float64,shape=[768,8])
W1=tf.Variable(dtype=np.float64,initial_value=np.random.random((8,500)))
B1=tf.Variable(dtype=np.float64,initial_value=np.random.random((1,1)))
y_prediction1=((tf.add(tf.matmul(x,W1),B1)))
output1=tf.nn.sigmoid(y_prediction1)
W2=tf.Variable(dtype=np.float64,initial_value=np.random.random((500,600)))
B2=tf.Variable(dtype=np.float64,initial_value=np.random.random((1,1)))
y_prediction2=((tf.add(tf.matmul(output1,W2),B2)))
output2=tf.nn.sigmoid(y_prediction2)
W3=tf.Variable(dtype=np.float64,initial_value=np.random.random((600,1)))
B3=tf.Variable(dtype=np.float64,initial_value=np.random.random((1,1)))
y_prediction3=((tf.add(tf.matmul(output2,W3),B3)))


y_true=tf.placeholder(dtype=tf.float64,shape=[768,1])

loss=tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=y_prediction3,labels=y_true))



optimizer=tf.train.GradientDescentOptimizer(0.01).minimize(loss)
sess=tf.Session()
sess.run(tf.global_variables_initializer())


for i in range(200):
    (sess.run(optimizer,feed_dict={x:actualX,y_true:actualY}))
     print(i,sess.run(loss, feed_dict={x: actualX, y_true: actualY}))
    print(i)
prediction = tf.round(tf.sigmoid((y_prediction3)))

correct = tf.cast(tf.equal(prediction, y_true), dtype=np.float64)

accuracy = tf.reduce_mean(correct)
print(sess.run(accuracy,feed_dict={x: actualX, y_true: actualY}))
4

2 回答 2

0

数据集很小,在选择模型参数时必须小心。

从你的代码中我有几件事不明白。这是一个二元分类,对吧?如果是这样,您应该有一个单热编码输出和大小为 2 的 GT。在您的代码中,似乎每个示例只有一个输出!如果要将 GT 保留为向量,则应tf.nn.sparse_softmax_cross_entropy_with_logits改为使用。在将其与 比较之前,您不应该使用 softmax 和argmaxon吗?也检查那部分。y_trueprediction

如果您的代码一切正常,我也会考虑以下建议:

  • 减少隐藏单元的数量(例如 128 或 256)
  • 不知道为什么你使用大小(1,1)的偏差,它应该是一个带有输出数量的向量(即在你的例子中B1 = tf.Variable(tf.random_normal([500]))
  • 对权重使用 Xavier init,对偏差使用零初始化
  • 如果网络开始过度拟合训练集,则添加 dropout 层
  • 尝试 Adam opt 并交叉验证学习率(或保留您当前的 opt 并更改学习率)
  • 使用小批量(目前你正在做的是 GD 而不是 SGB,我认为这更有可能陷入局部最小值)
  • 使用 relu 而不是 sigmoid 激活
  • 绘制学习曲线并检查网络是否正确训练(即准确度在增加,损失在减少)

无论如何,使用这个小数据集,您应该很容易过度拟合训练集。在 200 个 epoch 后获得 65% 清楚地表明你的模型有问题。仔细检查您的代码并确保其中没有任何问题。您可以将此代码用作示例。

UPDATE1:你必须有一个热编码输出!在您的情况下,它是维度 2。检查此代码,我对您的代码做了一些修改,但我没有运行它。解决任何可能的错误并尝试使其运行:

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

df=pd.read_csv(r'C:\Users\manas\Downloads\diabetes.csv')

actualY=df['Outcome']
actualX=df.drop(['Outcome'],axis=1)
actualX=np.array(np.reshape(actualX,newshape=[768,8]))
actualY=np.array(np.reshape(actualY,newshape=[768,1]))
#Y=[768,1]
#X=[768,8]

x = tf.placeholder('float',,shape=[None,8])
y_true = tf.placeholder('float',,shape=[None,1])

W1 = tf.get_variable("W1", shape=[8, 128],initializer=tf.contrib.layers.xavier_initializer())
b1 = tf.get_variable("b1", shape=[128],initializer=initializer=tf.zeros_initializer())
h1 = tf.nn.relu(tf.add(tf.matmul(x,W1),b1))

W2 = tf.get_variable("W2", shape=[128, 128],initializer=tf.contrib.layers.xavier_initializer())
b2 = tf.get_variable("b2", shape=[128],initializer=initializer=tf.zeros_initializer())
h2 = tf.nn.relu(tf.add(tf.matmul(h1,W2),b2))

W3 = tf.get_variable("W3", shape=[128, 2],initializer=tf.contrib.layers.xavier_initializer())
b3 = tf.get_variable("b3", shape=[2],initializer=initializer=tf.zeros_initializer())
logits = tf.add(tf.matmul(h2,W3),b3)


loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logits,labels=tf.one_hot(y_true)))
optimizer = tf.train.AdamOptimizer(0.001).minimize(loss)

sess = tf.Session()
sess.run(tf.global_variables_initializer())


for i in range(200):
    sess.run(optimizer,feed_dict={x:actualX,y_true:actualY})
    print(i,sess.run(loss, feed_dict={x: actualX, y_true: actualY}))
    print(i)


pred = tf.nn.softmax(logits)
correct_prediction = tf.equal(tf.argmax(pred, 1), y_true)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
print(sess.run(accuracy,feed_dict={x: actualX, y_true: actualY}))
于 2018-08-12T09:57:43.590 回答
0

这是我运行的代码

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

df=pd.read_csv(r'C:\Users\manas\Downloads\diabetes.csv')

actualY=df['Outcome']
actualX=df.drop(['Outcome'],axis=1)
actualX=np.array(np.reshape(actualX,newshape=[768,8]))
actualY=np.array(np.reshape(actualY,newshape=[768,1]),dtype=int)
#Y=[768,1]
#X=[768,8]

x = tf.placeholder('float',shape=[None,8])
y_true = tf.placeholder(shape=[None,1],dtype=tf.int64)

W1 = tf.get_variable("W1", shape=[8, 
128],initializer=tf.contrib.layers.xavier_initializer())
b1 = tf.get_variable("b1", shape=[128],initializer=tf.zeros_initializer())
h1 = tf.nn.relu(tf.add(tf.matmul(x,W1),b1))


W2 = tf.get_variable("W2", shape=[128, 
128],initializer=tf.contrib.layers.xavier_initializer())
b2 = tf.get_variable("b2", shape=[128],initializer=tf.zeros_initializer())
h2 = tf.nn.relu(tf.add(tf.matmul(h1,W2),b2))

W3 = tf.get_variable("W3", shape=[128, 
2],initializer=tf.contrib.layers.xavier_initializer())
b3 = tf.get_variable("b3", shape=[2],initializer=tf.zeros_initializer())
logits = tf.add(tf.matmul(h2,W3),b3)


loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels=tf.one_hot(y_true,depth=2)))

optimizer = tf.train.AdamOptimizer(0.001).minimize(loss)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

for i in range(3000):
    sess.run(optimizer,feed_dict={x:actualX,y_true:actualY})
    print(i,sess.run(loss, feed_dict={x: actualX, y_true: actualY}))
    print(i)


pred = tf.nn.softmax(logits)
correct_prediction = tf.equal(tf.argmax(pred, 1), tf.arg_max(y_true,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

print(sess.run(tf.round(tf.nn.softmax(logits)),feed_dict={x:actualX,y_true:actualY}))

print(sess.run(accuracy,feed_dict={x: actualX, y_true: actualY}))

尽管这给出了 的损失0.14772553,但它给出了 的准确度64.564555 %

所以我真的不知道问题是什么。

于 2018-08-13T14:01:12.513 回答