准确性始终为零

时间:2019-10-07 21:08:19

标签: python machine-learning keras neural-network

我想使用8个特征来预测目标特征,而当我使用keras时,我一直都将精度设为零。我是机器学习的新手,我很困惑。

尝试了不同的激活,我认为这可能是一个回归问题,所以我使用“线性”作为最后一个激活函数,事实证明准确度仍然为零

from sklearn import preprocessing
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
import pandas as pd


# Step 2 - Load our data
zeolite_13X_error = pd.read_csv("zeolite_13X_error.csv", delimiter=",")
dataset = zeolite_13X_error.values
X = dataset[:, 0:8]
Y = dataset[:, 10]  # Purity
min_max_scaler = preprocessing.MinMaxScaler()
X_scale = min_max_scaler.fit_transform(X)
X_train, X_val_and_test, Y_train, Y_val_and_test = train_test_split(X_scale, Y, test_size=0.3)
X_val, X_text, Y_val, Y_test = train_test_split(X_val_and_test, Y_val_and_test, test_size=0.5)

# Building and training first NN
model = Sequential([
    Dense(32, activation='relu', input_shape=(8,)),
    Dense(32, activation='relu'),
    Dense(1, activation='linear'),
])
model.compile(optimizer='sgd',
              loss='binary_crossentropy',
              metrics=['accuracy'])
hist = model.fit(X_train, Y_train,
                 batch_size=32, epochs=10,
                 validation_data=(X_val, Y_val))

2 个答案:

答案 0 :(得分:1)

如果您决定将其视为回归问题,则

  1. 您的损失应为mean_squared_error或其他一些适合回归的损失,但不应该 binary_crossentropy(仅适用于二进制分类),并且
  2. 精度是毫无意义的-它仅对分类设置有意义。在回归设置中,我们通常将损失本身用于绩效评估-有关更多信息,请参见What function defines accuracy in Keras when the loss is mean squared error (MSE)?中的答案。

如果您决定将其作为分类问题解决,则应将最后一层的激活更改为sigmoid

无论如何,您在此处显示的组合-单节点最后一层的loss='binary_crossentropy'activation='linear'-是没有意义的。

答案 1 :(得分:0)

检查模型的输出以检查值。该模型是在预测概率,而不是二进制0/1决策,我认为这是您的情况,因为您使用精度作为度量标准。如果模型正在预测概率,则可以根据阈值对它们进行四舍五入以将其转换为0或1(您可以选择,即预测> 0.5则为1,否则为0)。

还增加了纪元数。还可以在输出层中使用sigmoid激活。