Я пытаюсь использовать логистическую регрессию для набора данных, который содержит 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;конвергенция.
Буду очень признателен за ваши советы, хорошего вам дня, люди :))