python - 如何提高神经网络预测、分类
问题描述
我正在尝试学习一些神经网络以获得乐趣。我决定尝试从 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 类产生严重偏差。
评估:
您应该做的第一件事是不要使用准确性作为评估指标!我的建议是绘制一个混淆矩阵,以便您准确了解模型的预测。您还可以研究宏观平均(如果您不熟悉该技术,请阅读此内容)。
处理问题:
有两种方法可以提高模型的性能:
- 重新采样您的数据,使其变得平衡。您在这里有几个选择。最常见的方法是对少数类进行过采样(例如SMOTE),以使其覆盖多数人口。另一种选择是对多数类进行欠采样(例如Clustering Centroids),使其人口下降到少数。
- 在训练期间使用类权重。这迫使网络更加关注少数类的样本(阅读这篇文章了解更多信息)。
推荐阅读
- asp.net-mvc - 使用 Linq 查询连接存储库中的资源表和 Resources_Role 表
- vim - vim 可以在运行前检查:使当前目录是当前文件的父目录吗?
- python - Spark 中的 ROWS BETWEEN 1 PRECEDING 和 1 PRECEDING 是什么?
- protocol-buffers - google.protobuf.StringValue 的意义何在?
- sql - 取 MIN(Column) 和 MAX(Column) 对应的 Location 列
- node.js - 如果 Mongoose Schema(req.body) 是对象数组,则无法保存
- android - 我的微调器不显示所选项目并且不调用 onItemSelected
- javascript - 如何将特定的 JSON 数据放入表中
- java - 在 Eclipse 中提示“未处理的异常类型 xxx”
- android - 具有多个堆栈的 Android JetPack 导航