【问题标题】:Deep Learning: Multiclass Classification with same amount of labels between the training dataset and test dataset深度学习:在训练数据集和测试数据集之间具有相同数量标签的多类分类
【发布时间】:2020-04-30 08:26:54
【问题描述】:

我正在编写用于进行多类分类的代码。我有 7 列(6 个特征和 1 个标签)的自定义数据集,训练数据集有 2 种标签(1 和 2),测试数据集有 3 种标签(1、2 和 3)。该模型的目的是查看模型预测标签“3”的效果如何。 目前,我正在尝试MLP算法,代码如下:

import tensorflow as tf
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers.embeddings import Embedding
from keras import optimizers
from tensorflow.keras.callbacks import EarlyStopping
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
import numpy as np
from sklearn.metrics import confusion_matrix
from sklearn.utils.multiclass import unique_labels
from keras.models import load_model
from sklearn.externals import joblib
from joblib import dump, load
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
#from keras.layers import Dense, Embedding, LSTM, GRU
#from keras.layers.embeddings import Embedding


#Load the test dataset
df1 = pd.read_csv("/home/user/Desktop/FinalTestSet.csv")
test = df1

le = LabelEncoder()

test['Average_packets_per_flow'] = le.fit_transform(test['Average_packets_per_flow'])
test['Average_PktSize_per_flow'] = le.fit_transform(test['Average_PktSize_per_flow'])
test['Avg_pkts_per_sec'] = le.fit_transform(test['Avg_pkts_per_sec'])
test['Avg_bytes_per_sec'] = le.fit_transform(test['Avg_bytes_per_sec'])
test['N_pkts_per_flow'] = le.fit_transform(test['N_pkts_per_flow'])
test['N_pkts_size_per_flow'] = le.fit_transform(test['N_pkts_size_per_flow'])

#Select the x and y columns from dataset
xtest_Val = test.iloc[:,0:6].values
Ytest = test.iloc[:,6].values
#print Ytest

#MinMax Scaler
scaler = MinMaxScaler(feature_range=(-1, 1))
Xtest = scaler.fit_transform(xtest_Val)

#print Xtest

#Load the train dataset
df2 = pd.read_csv("/home/user/Desktop/FinalTrainingSet.csv")
train = df2

le = LabelEncoder()

test['Average_packets_per_flow'] = le.fit_transform(test['Average_packets_per_flow'])
test['Average_PktSize_per_flow'] = le.fit_transform(test['Average_PktSize_per_flow'])
test['Avg_pkts_per_sec'] = le.fit_transform(test['Avg_pkts_per_sec'])
test['Avg_bytes_per_sec'] = le.fit_transform(test['Avg_bytes_per_sec'])
test['N_pkts_per_flow'] = le.fit_transform(test['N_pkts_per_flow'])
test['N_pkts_size_per_flow'] = le.fit_transform(test['N_pkts_size_per_flow'])

#Select the x and y columns from dataset
xtrain_Val = train.iloc[:,0:6].values
Ytrain = train.iloc[:,6].values
#print Ytrain

#MinMax Scaler
scaler = MinMaxScaler(feature_range=(-1, 1))

# Fit the model
Xtrain = scaler.fit_transform(xtrain_Val)


#Reshape data for CNN
Xtrain = Xtrain.reshape((Xtrain.shape[0], 1, 6, 1))
print(Xtrain)
#Xtest = Xtest.reshape((Xtest.shape[0], 1, 6, 1))
#print Xtrain.shape

max_length=70
EMBEDDING_DIM=100
vocab_size=100
num_labels=2

#Define model
def init_model():
    model = Sequential()
    model.add(Dense(64, activation='relu', input_dim=Xtrain.shape[0]))
    model.add(Flatten())
    model.add(Dropout(0.5))
    model.add(Dense(64, activation='relu'))  
    model.add(Flatten())
    model.add(Dropout(0.5))
    model.add(Dense(64, activation='softmax'))
    model.add(Flatten())

#adam optimizer
    adam = optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)

    model.compile(optimizer = adam, loss='categorical_crossentropy', metrics=['accuracy'])
    return model

print('Train...')
model = init_model()

#To avoid overfitting
callbacks = [EarlyStopping('val_loss', patience=3)]
hist = model.fit(Xtrain, Ytrain, epochs=50, batch_size=50, validation_split=0.20, callbacks=callbacks, verbose=1)

#Evaluate model and print results
score, acc = model.evaluate(Xtest, Ytest, batch_size=50)
print('Test score:', score)
print('Test accuracy:', acc)

但是,我收到以下错误:

ValueError: Input 0 is incompatible with layer flatten_1: expected min_ndim=3, found ndim=2

我试图移除展平层,但得到不同的错误:

ValueError: Error when checking input: expected dense_1_input to have shape (424686,) but got array with shape (6,)

424686 是数据集中的行数,6 是特征数。

感谢任何建议。谢谢。

根据 Omarfoq 的建议,现在我为训练和测试数据集使用了三个标签。代码和错误保持不变。

谁能给我建议解决方案?谢谢。

【问题讨论】:

    标签: python machine-learning deep-learning multiclass-classification imbalanced-data


    【解决方案1】:

    我会说你正在尝试的东西不合逻辑,如果训练集中不存在“3”类,你的模型将永远不会预测它。你正在尝试什么没有意义。尝试重新表述您的问题。

    【讨论】:

    • 您能否详细说明为什么不可能?假设在我的训练数据集中有两种类型的图片,“猫”和“鸟”,我想区分仅在测试数据集中可用的“狗”图片。模型不应该能够区分“狗”图片既不是“猫”也不是“鸟”图片吗?
    • 实际上你有可能做到这一点,解决方案包括向你的数据集添加一些随机图像,并要求你的模型将图像分类为“cat”、“bird”、“out_of_class” .但是,如果您创建一个仅将图像分类为“猫”、“鸟”的模型,这将无法正常工作。您可以以一种非常肮脏的方式使用,将标签“狗”赋予两个类别之间概率相等的图像,但不要指望这会给您带来好的结果
    • 谢谢你的解释,说我得到的错误是因为我使用不同数量的标签来训练和测试数据集是否正确?
    • 绝对是的,您遇到的问题是因为您使用的是大小为 2 的输出,因此您的模型输出了一个维度为 2 的向量,同时在第二步中您正在等待它会给你一个大小为 3 的向量。这就是导致错误的原因。
    • 我尝试在两个数据集中使用相同数量的标签,但仍然出现相同的错误。您能否提出一些替代解决方案。
    猜你喜欢
    • 1970-01-01
    • 2018-03-25
    • 2015-12-21
    • 2022-01-19
    • 2016-01-03
    • 2016-08-26
    • 2019-10-07
    • 2020-06-12
    • 1970-01-01
    相关资源
    最近更新 更多