python - 如何改进神经网络预测、分类

标签 python tensorflow keras neural-network

我正在尝试学习一些神经网络来获得乐趣。我决定尝试从 kaggle 的数据集中对一些神奇宝贝传奇卡进行分类。我阅读了文档并遵循了机器学习掌握指南,同时阅读了媒体以尝试理解该过程。

我的问题/疑问:我尝试预测,但一切都预测为“0”。我认为这是错误的。我的错误准确率是 92% 吗?我在网上读到一些关于错误准确性的内容。

请帮忙!

一些背景信息:数据集有 800 行,12 列。我正在预测最后一列(真/假)。我正在使用具有数字和分类的数据属性。我用标签编码了数字类别。这些卡片中有 92% 是假的。 8% 是正确的。

我在 200 张卡片上采样并运行了一个神经网络,并获得了 91% 的准确率……我还重置了所有内容,并在所有 800 张卡片上获得了 92% 的准确率。我过度拟合了吗?

提前感谢您的帮助

dataFrame = dataFrame.fillna(value='NaN')

labelencoder = LabelEncoder()

numpy_dataframe = dataFrame.as_matrix()
numpy_dataframe[:, 0] = labelencoder.fit_transform(numpy_dataframe[:, 0])
numpy_dataframe[:, 1] = labelencoder.fit_transform(numpy_dataframe[:, 1])

numpy_dataframe
X = numpy_dataframe[:,0:10]
Y = numpy_dataframe[:,10]
model = Sequential()
model.add(Dense(12, input_dim=10, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, epochs=150, batch_size=10)
scores = model.evaluate(X, Y)
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

#this shows that we have 91.88% accuracy with the whole dataframe


dataFrame200False = dataFrame 
dataFrame200False['Legendary'] = dataFrame200False['Legendary'].astype(str)
dataFrame200False= dataFrame200False[dataFrame200False['Legendary'].str.contains("False")]

dataFrame65True = dataFrame

dataFrame65True['Legendary'] = dataFrame65True['Legendary'].astype(str)
dataFrame65True= dataFrame65True[dataFrame65True['Legendary'].str.contains("True")]

DataFrameFalseSample = dataFrame200False.sample(200)
DataFrameFalseSample

dataFrameSampledTrueFalse = dataFrame65True.append(DataFrameFalseSample, ignore_index=True)
dataFrameSampledTrueFalse

#label encoding the files
labelencoder = LabelEncoder()

numpy_dataSample = dataFrameSampledTrueFalse.as_matrix()
numpy_dataSample[:, 0] = labelencoder.fit_transform(numpy_dataSample[:, 0])
numpy_dataSample[:, 1] = labelencoder.fit_transform(numpy_dataSample[:, 1])

numpy_dataSample
a = numpy_dataframe[:,0:10]
b = numpy_dataframe[:,10]

model = Sequential()
model.add(Dense(12, input_dim=10, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(a, b, epochs=1000, batch_size=10)

scoresSample = model.evaluate(a, b)
print("\n%s: %.2f%%" % (model.metrics_names[1], scoresSample[1]*100))

dataFramePredictSample = dataFrame.sample(500)
labelencoder = LabelEncoder()

numpy_dataframeSamples = dataFramePredictSample.as_matrix()
numpy_dataframeSamples[:, 0] = labelencoder.fit_transform(numpy_dataframeSamples[:, 0])
numpy_dataframeSamples[:, 1] = labelencoder.fit_transform(numpy_dataframeSamples[:, 1])

Xnew = numpy_dataframeSamples[:,0:10]
Ynew = numpy_dataframeSamples[:,10]


# make a prediction
Y = model.predict_classes(Xnew)
# show the inputs and predicted outputs
for i in range(len(Xnew)):
    print("X=%s, Predicted=%s" % (Xnew[i], Y[i]))

最佳答案

问题:

问题是,正如您所说,您的数据集严重不平衡。这意味着 0 类的训练示例比 1 类多得多。这导致网络在训练期间严重偏向于预测 0 类。

评价:

您应该做的第一件事是使用准确性作为您的评估指标!我的建议是绘制一个混淆矩阵,以便您准确了解模型的预测结果。您还可以查看宏平均(如果您不熟悉该技术,请阅读 this)。

处理问题:

有两种方法可以提高模型的性能:

  • 重新采样您的数据,使其变得平衡。您在这里有几个选择。最常见的方法是对少数类进行过度采样(例如 SMOTE ),使其达到大多数人的数量。另一种选择是对多数类欠采样(例如 Clustering Centroids ),使其人口下降到少数类。
  • 在训练期间使用类权重。这迫使网络更加关注来自少数类的样本(阅读 this post 了解更多信息)。

关于python - 如何改进神经网络预测、分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55317559/

相关文章:

tensorflow - 如何解释 CNN 中的 model.summary() 输出?

python - 如何在keras中输入多个时间序列到LSTM

python - 一张一张保存GAN生成的图像

python - 使用 rpy2 从 python 调用 R 脚本

python 从单个列表理解创建一个 set/dict/list 及其值的总和

python如何将数据框中的一列转换为日期类型和绘图

python - Tensorflow 循环运行 session 多次

python - 查找给定 torrent 文件的播种者/对等者 IP 地址的最佳方法是什么

python - 超过 url Tensorflow Serving Python 请求的最大重试次数

python - tf.multiply vs tf.matmul 计算点积