Keras二分类不同数据集相同的预测结果

     2023-02-16     49

关键词:

【中文标题】Keras二分类不同数据集相同的预测结果【英文标题】:Keras binary classification different dataset same prediction results 【发布时间】:2021-09-06 12:51:25 【问题描述】:

我有 2 个预测标签值,-1 或 1。 使用LSTMDense 的学习看起来不错,但是对于不同的预测数据集,预测总是相同的,将层更改为 Dense 不会改变预测,也许我做错了什么。

这里是代码

// set up data arrays
float[,,] training_data = new float[training.Count(), 12, 200];
float[,,] testing_data = new float[testing.Count(), 12, 200];
float[,,] predict_data = new float[1, 12, 200];

IList<float> training_labels = new List<float>();
IList<float> testing_labels = new List<float>();

// Load Data and add to arrays
...
...

/////////////////////////
NDarray train_y = np.array(training_labels.ToArray());
NDarray train_x = np.array(training_data);

NDarray test_y = np.array(testing_labels.ToArray());
NDarray test_x = np.array(testing_data);

NDarray predict_x = np.array(predict_data);

train_y = Util.ToCategorical(train_y, 2);
test_y = Util.ToCategorical(test_y, 2);

//Build functional model
var model = new Sequential();

model.Add(new Input(shape: new Keras.Shape(12, 200)));
model.Add(new BatchNormalization());

model.Add(new LSTM(128, activation: "tanh", recurrent_activation: "sigmoid", return_sequences: false));            
model.Add(new Dropout(0.2));
model.Add(new Dense(32, activation: "relu"));            
model.Add(new Dense(2, activation: "softmax"));

model.Compile(optimizer: new SGD(), loss: "binary_crossentropy", metrics: new string[]  "accuracy" );
model.Summary();

var history = model.Fit(train_x, train_y, batch_size: 1, epochs: 1, verbose: 1, validation_data: new NDarray[]  test_x, test_y );

var score = model.Evaluate(test_x, test_y, verbose: 2);
Console.WriteLine($"Test loss: score[0]");
Console.WriteLine($"Test accuracy: score[1]");

NDarray predicted=model.Predict(predict_x, verbose: 2);
                    
Console.WriteLine($"Prediction: predicted[0][0]*100");
Console.WriteLine($"Prediction: predicted[0][1]*100");  

这是输出

    483/483 [==============================] 
    - 9s 6ms/step - loss: 0.1989 - accuracy: 0.9633 - val_loss: 0.0416 - val_accuracy: 1.0000
      4/4 - 0s - loss: 0.0416 - accuracy: 1.0000
    Test loss: 0.04155446216464043
    Test accuracy: 1
    1/1 - 0s

    Prediction: 0.0010418787496746518
    Prediction: 99.99896287918091

在 ML.net 中使用相同的预测数据会给出不同的结果,但是使用 ML.Net 的准确度仅为 0.6,这就是我需要深度学习的原因

【问题讨论】:

【参考方案1】:

我没有设置c# 来重现您的代码。但是我看到了一个您可能需要考虑的小问题(不确定这是否会导致麻烦)。根据您设置的上述代码,我认为您使用错误的loss 函数进行训练。按照您的设置,

Util.ToCategorical(train_y, 2);
model.Add(new Dense(2, activation: "softmax"));

那么你的损失函数应该是'categorical_crossentropy'而不应该是'binary_crossentropy'。因为,您将标签 (-1, 1) 转换为 one-hot 编码向量,并在最后一层设置 softmax 激活。

但是,正如您所说,您的标签是 -1 和 1;因此,如果您将问题视为二元分类问题,则设置应如下所示:

# Util.ToCategorical(train_y, 2); # no transformation 
model.Add(new Dense(1, activation: "sigmoid"));
model.compile(..., loss: "binary_crossentropy" )

参考。

Neural Network and Binary classification Guidance Selecting loss and metrics for Tensorflow model

更新

在这里我将给出一些工作演示代码以便更好地理解。但在此之前,这里有一个小提示。假设我们有一个训练数据集,标签从&lt; 0 或负值开始,例如[-2, -1, 0, 1]。要将这个整数值转换为 one-hot 编码向量,我们可以选择 tf.keras.utils.to_categoricalpd.get_dummies 函数。但是这两种方法的一个小区别是,在tf..to_categorical中,我们的整数标签必须从0开始; pd.get_dummies 不是这样,请查看我的other answers。很快,

np.random.randint(-1, 1, size=(80))
array([-1, -1,  0,  0,  0 .. ]

pd.get_dummies(a).astype('float32').values[:5] 
array([[1., 0.],
       [1., 0.],
       [0., 1.],
       [0., 1.],
       [0., 1.]], dtype=float32)

tf.keras.utils.to_categorical(a+1, num_classes = 2)[:5]
array([[1., 0.],
       [1., 0.],
       [0., 1.],
       [0., 1.],
       [0., 1.]], dtype=float32)

好的,我现在给出一些工作演示代码。

img = tf.random.normal([80, 32], 0, 1, tf.float32)
tar = pd.get_dummies(np.random.randint(-1, 1,  # mine: [-1, 1) - yours: [-1, 1]
                                       size=80)).astype('float32').values 

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(10, input_dim = 32, 
                       kernel_initializer ='normal', 
                       activation= 'relu'))
model.add(tf.keras.layers.Dense(2, activation='softmax'))

model.compile(loss='categorical_crossentropy', 
              optimizer='adam', metrics=['accuracy'])
model.fit(img, tar, epochs=10, verbose=2)
Epoch 1/10
3/3 - 0s - loss: 0.7610 - accuracy: 0.4375
Epoch 2/10
3/3 - 0s - loss: 0.7425 - accuracy: 0.4375
....
Epoch 8/10
3/3 - 0s - loss: 0.6694 - accuracy: 0.5125
Epoch 9/10
3/3 - 0s - loss: 0.6601 - accuracy: 0.5750
Epoch 10/10
3/3 - 0s - loss: 0.6511 - accuracy: 0.5750

推理

loss, acc = model.evaluate(img, tar); print(loss, acc)
pred = model.predict(img); print(pred[:5])

3ms/step - loss: 0.6167 - accuracy: 0.7250
0.6166597604751587 0.7250000238418579

# probabilities of the predicted labels -1 and 0
[[0.35116166 0.64883834]
 [0.5542663  0.4457338 ]
 [0.28023133 0.71976864]
 [0.5024315  0.49756846]
 [0.41029742 0.5897026 ]]

现在,如果我们这样做了

print(pred[0])
pred[0].argmax(-1) # expect: -1, 0 as our label 

[0.35116166 0.64883834]
1

它分别为目标标签-10 提供0.35x0.64x。但是,当我们为概率预测的 label 执行 .argmax 时,它返回零索引的最高值; (让训练标签从零索引开始的原因,所以我认为在你的情况下最好将[-1, 1] 转换为[0, 1])。

好的,最后,正如您提到的,您需要预测标签和相应的置信度分数;为此,我们可以使用tf.math.top_k 和k = num_of_class

top_k_values, top_k_indices = tf.math.top_k(pred, k=2)
for values, indices in zip(top_k_values, top_k_indices):
    print(
        'For class , model confidence :.2f%'
        .format(indices.numpy()[0]-1, values.numpy()[0]*100)
        )
    
    print(
        'For class , model confidence :.2f%'
        .format(indices.numpy()[1]-1, values.numpy()[1]*100)
        )
    
    '''
    Note: above we substract -1 to match with 
          the target label (-1, 0)

    And it would not necessary if we initially -
    transform our label from (-1, 0) to (0, 1), i.e. start from zero 
    '''
    print()
    break # remove for full results 
For class 0, model confidence 64.88%
For class -1, model confidence 35.12%

验证分数顺序

# pick first samples: input and label
model(img)[0].numpy(), tar[0]

(array([0.35116166, 0.64883834], dtype=float32),
 array([0., 1.], dtype=float32))

Here, 
0: for -1
1: for 0

# Again, better to transform (-1, 0) to (0, 1) at initial.

【讨论】:

谢谢,我按照你说的做了,现在我得到了不同的预测结果,但预测[0][0]只有一个值,预测[0][1]为空。使用一个数据得到结果 20.3,使用不同数据得到 12.2,我如何将这些数据解释为我的 -1 和 1 结果?即使不更改数据,结果也会发生变化。谢谢! 更改为 categorical_crossentropy 我再次得到相同的结果,预测:0.06129330722615123 预测:99.93870258331299 对于我的第一个评论,我也尝试了预测[0]和预测[1],第一个值相同,第二个为空。 我需要这样的预测结果 (-1) 30% 概率,(1) 70% 概率 [:5] 被称为数组slicing in python。这对你来说不是什么重要的事情。我将它用于检查目的。比如,当我使用print(pred[:5])时,它的意思是打印出前5个元素或前5个样本的概率得分

Keras:使用批量标准化在同一数据集上的不同训练和验证结果

】Keras:使用批量标准化在同一数据集上的不同训练和验证结果【英文标题】:Keras:Differenttrainingandvalidationresultsonsamedatasetusingbatchnormalization【发布时间】:2017-11-1806:29:56【问题描述】:即使我使用相同的数据集,我的训练分类也... 查看详情

Keras C3DNN 预测结果相同

】KerasC3DNN预测结果相同【英文标题】:KerasC3DNNsameresultonprediction【发布时间】:2019-01-0221:05:24【问题描述】:我正在尝试使用由Tensorflow支持的Keras中的Conv3D神经网络进行可变长度的多类序列分类。我创建了一个小示例,在该示例... 查看详情

保存的随机森林模型在同一数据集上产生不同的结果

】保存的随机森林模型在同一数据集上产生不同的结果【英文标题】:SavedRandomForestmodelproducesdifferentresultsonthesamedataset【发布时间】:2020-11-2806:09:41【问题描述】:我在使用保存在磁盘上的随机森林模型并使用完全相同的数据集... 查看详情

auto_arima 在不同时期给出相同的结果?

】auto_arima在不同时期给出相同的结果?【英文标题】:auto_arimagivessameresultfordifferentperiods?【发布时间】:2021-12-2610:53:18【问题描述】:我有样本数据集,我想预测2个时期的以下结果。但是预测函数给了我同样的结果。这是我的... 查看详情

R中的Keras:高精度模型预测相同的输出类别

...型。我得到了大约85%的合理准确度,但该模型为我的测试数据中的每个条目预测了完全相同的结果。输入数据由1000行和46列数字指标组成(缩放到0和1之间)。结 查看详情

预测房价:人工智能回归问题(代码片段)

?我们之前提出了三个经典的问题,他们分别是:二分类问题(电影评论好坏倾向性判断)多分类问题(将新闻按照主题分类)回归问题(根据房地产数据估算房地产价格)我们解决了前两个问题,今天我们解决第三个问题,回... 查看详情

使用 tensorflow keras 预测 5 个不同类别的标签

】使用tensorflowkeras预测5个不同类别的标签【英文标题】:Predictingalabelof5differentclasseswithtensorflowkeras【发布时间】:2021-07-2404:06:21【问题描述】:我有以下问题,我有一个包含3dprinter数据的数据集,并希望使用tensorflownn预测表示... 查看详情

如何将多个 CSV 数据集以适合 Keras 中的模型?

...。我有多个CSV文件。它们具有相同的特征(列),但具有不同的数字(行)。一个文件形状的示例是(1078,8),另一个文件是(666,8)。每个文件代表一个轨迹。现在,我 查看详情

在 R 中使用随机森林预测的不同结果

】在R中使用随机森林预测的不同结果【英文标题】:DifferentresultsusingRandomForestpredictioninR【发布时间】:2017-06-0907:58:02【问题描述】:当我在我的测试数据上运行随机森林模型时,对于相同的数据集+模型,我会得到不同的结果。... 查看详情

火炉炼ai深度学习005-简单几行keras代码解决二分类问题(代码片段)

【火炉炼AI】深度学习005-简单几行Keras代码解决二分类问题(本文所使用的Python库和版本号:Python3.6,Numpy1.14,scikit-learn0.19,matplotlib2.2,Keras2.1.6,Tensorflow1.9.0)很多文章和教材都是用MNIST数据集作为深度学习届的“HelloWorld”程序,但是这... 查看详情

ml之shap:基于adult人口普查收入二分类预测数据集(预测年收入是否超过50k)利用shap值对xgboost模型实现可解释性案例之详细攻略

ML之shap:基于adult人口普查收入二分类预测数据集(预测年收入是否超过50k)利用Shap值对XGBoost模型实现可解释性案例之详细攻略目录基于adult人口普查收入二分类预测数据集(预测年收入是否超过50k)利用Shap值对XGBoost模型实 查看详情

电影评论分类:二分类问题(代码片段)

????????????????????????电影评论分类:二分类问题二分类问题是生活应用当中最广泛使用的机器学习算法.但是正在这里,将使用深度学习框架keras来进行对问题求解,看似大材小用,也别有一番风味.数据集这里使用keras自带的数据集,它... 查看详情

基于r语言的分类、聚类研究

...,setosa均可以完全正确分(聚)类,而另外两类则会出现不同程度的误差,这也是导致整个研究模型出现误差的原因;2.在使用的三种分类研究方法中,决策树模型的效果最优,因此可以使用该方法进行鸢尾花数据集的分类预测... 查看详情

Keras vs PyTorch LSTM 不同的结果

】KerasvsPyTorchLSTM不同的结果【英文标题】:KerasvsPyTorchLSTMdifferentresults【发布时间】:2019-11-1619:50:00【问题描述】:尝试使用Keras和PyTorch在同一数据集上获得类似的结果。数据fromnumpyimportarrayfromnumpyimporthstackfromsklearn.model_selectionimp... 查看详情

Keras LSTM - 为啥“相同”模型和相同权重的结果不同?

】KerasLSTM-为啥“相同”模型和相同权重的结果不同?【英文标题】:KerasLSTM-whydifferentresultswith"same"model&sameweights?KerasLSTM-为什么“相同”模型和相同权重的结果不同?【发布时间】:2018-02-1713:18:46【问题描述】:(注意... 查看详情

tensorflow基本使用(代码片段)

文章目录TensorFlow中的keras传入网络的数据类型数据处理模型建立模型训练验证集的作用创建验证集的方式一:创建验证集的方式二:模型预测预测结果的分析模型的加载和保存TensorFlow中的keras到目前为止,Keras已经与T... 查看详情

相同的权重,实现但不同的结果 n Keras 和 Pytorch

】相同的权重,实现但不同的结果nKeras和Pytorch【英文标题】:Sameweights,implementationbutdifferentresultsnKerasandPytorch【发布时间】:2021-06-1900:31:29【问题描述】:我有一个编码器和一个解码器模型(monodepth2)。我尝试使用Onnx2Keras将它们从... 查看详情

第六章---机器学习与数据建模

学习:通过接收到的数据,归纳提取相同与不同机器学习: 让计算机以数据为基础,进行归纳与总结模型:数据解释现象的系统机器学习:1.监督学习(机器学习的过程有标注:相当于告诉模型,在什么样的数据特征下应该... 查看详情