Огромные затраты не очень хорошо сходятся с логистической регрессией TensorFlow - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь использовать логистическую регрессию для набора данных, который содержит 15 числовых объектов и 4238 строк примеров.Расчетная стоимость началась с 415,91 и сходилась, когда стоимость была снижена только до 220,119.Я думаю, что должно быть что-то не так, но так как я не уверен, что делать, я хотел бы поделиться с вами кодом, для меня было бы полезно узнать, что не так в коде и может вызвать проблему.Буду очень признателен за ваши советы и опыт!

import tensorflow as tf
import pandas as pd
from sklearn.model_selection import train_test_split


dataset = pd.DataFrame.from_csv('framingham_heart_disease.csv', index_col = None)
print(dataset.shape)
dataX, dataY = dataset.iloc[:,:-1], dataset.iloc[:,-1:]
dataX = dataX.values/50
dataY = dataY.values

trainX, testX, trainY, testY = train_test_split(dataX, dataY, test_size=0.20, random_state=42)

numTrainData = trainX.shape[0]
numFeatures = trainX.shape[1]
numLabels = trainY.shape[1]

X = tf.placeholder(tf.float32, [numTrainData,numFeatures])
yExpected = tf.placeholder(tf.float32, [numTrainData, numLabels])

tf.set_random_seed(1)
weights = tf.Variable(tf.random_normal([numFeatures,numLabels],
                                       mean=0,
                                       stddev=0.01,
                                       name="weights"))
bias = tf.Variable(tf.random_normal([1,numLabels],
                                    mean=0,
                                    stddev=0.01,
                                    name="bias"))

apply_weights_OP = tf.matmul(X, weights, name="apply_weights")
weights_after_nan = tf.where(tf.is_nan(apply_weights_OP), tf.ones_like(apply_weights_OP) * 0, apply_weights_OP);
add_bias_OP = tf.add(weights_after_nan, bias, name="add_bias") 
activation_OP = tf.nn.sigmoid(add_bias_OP, name="activation")

learningRate = tf.train.exponential_decay(learning_rate=0.0001,
                                          global_step= 1,
                                          decay_steps=trainX.shape[0],
                                          decay_rate= 0.95,
                                          staircase=True)
cost_OP = tf.nn.l2_loss(activation_OP-yExpected, name="squared_error_cost")
training_OP = tf.train.GradientDescentOptimizer(learningRate).minimize(cost_OP)


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

numEpochs = 3000
cost = 0.0
diff = 1
epoch_values = []
accuracy_values = []
cost_values = []

for i in range(numEpochs):
    if i > 1 and diff < .0001:
        print("change in cost %g; convergence."%diff)
        break
    else:
        step = sess.run(training_OP, feed_dict={X: trainX, yExpected: trainY})
        # Report occasional stats
        if i % 100 == 0:
            # Add epoch to epoch_values
            epoch_values.append(i)
            # Generate accuracy stats on test data
            newCost = sess.run(cost_OP, feed_dict={X: trainX, yExpected: trainY})
            # Add cost to live graphing variable
            cost_values.append(newCost)
            # Re-assign values for variables
            diff = abs(newCost - cost)
            cost = newCost

            #generate print statements
            print("step %d, cost %g, change in cost %g"%(i, newCost, diff))

Я ожидаю лучшей конвергенции с более низкой стоимостью, но вместо этого я получаю это: шаг 0, стоимость 415,91, изменение стоимости 415,91, шаг 100, стоимость 229,459, изменение стоимости 186,45, шаг 200, стоимость221.717, изменение стоимости 7.74254 шаг 300, стоимость 220.504, изменение стоимости 1.2124 шаг 400, стоимость 220.225, изменение стоимости 0.279007 шаг 500, стоимость 220.15, изменение стоимости 0.0752258 шаг 600, стоимость 220.127, изменение стоимости 0.022522 шаг 700, стоимость220.121, изменение стоимости 0.00689697 шаг 800, стоимость 220.119, изменение стоимости 0.00166321 шаг 900, стоимость 220.119, изменение стоимости 6.10352e-05 изменение стоимости 6.10352e-05;конвергенция.

Буду очень признателен за ваши советы, хорошего вам дня, люди :))

...