【问题标题】:Why does my accuracy hit a threshold that it cannot overcome?为什么我的准确率达到了无法克服的阈值?
【发布时间】:2021-03-08 07:08:19
【问题描述】:

我正在进行一个机器学习项目,我正在尝试预测英雄联盟游戏的获胜者。我现在正在训练 50,000 个游戏(我总共存储了 2000 万个数据点),我的模型得到的结果很差。

我的数据在一个 csv 文件中,前 5 列是代表一支球队的冠军 ID 的数字,接下来的 5 列是代表另一支球队冠军 ID 的数字,第 11 列是 1 或 0(一队胜1,一队负0)

例如,1 行如下所示:

它是使用 numpy 加载的:

dataset = loadtxt('/content/drive/MyDrive/Data/dataset.csv', delimiter=',')

有人可以帮忙吗?我对 Keras 不是很熟悉,所以我不确定我的模型本身是否需要修复,或者我的数据是否存在问题。

型号:

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'])

这是我的准确率/损失图:

【问题讨论】:

  • 能否请您描述/展示您正在使用的所有功能?
  • 此外,对于 50K 数据点,该网络似乎太浅了。
  • @R.Schaefer 我只使用了上面提到的 csv 文件,我只是附上了一张截图,其中 1 行的样子,以及它是如何加载的。谢谢你的帮助。
  • @Frightera 您能否详细介绍解决此问题的最佳方法?我只是简单地添加更多层还是对如何最好地做到这一点有直觉。提前谢谢你
  • 首先扩展您的数据。在尝试添加更多图层之后。您需要对这些层进行试验,没有直接的答案。

标签: python machine-learning keras data-science


【解决方案1】:

您的冠军 ID 是名义上的分类变量,您必须对它们进行转换,以便每个都有自己的维度。如果您将 csv 加载到 Pandas 中,那么您会将第 0 到第 9 列的类型更改为分类,并保持第 11 列不变。然后在您的数据框上调用pd.get_dummies(df)。 SKLearn 还具有转换为 one-hot 的功能。在 NumPy 中有多种方法可以做到这一点。

虽然冠军 ID 似乎是整数,但如果将它们转换为整数,则可以将这些列中的每一列传递给嵌入层并直接在模型中进行矢量化。简单得多。但是,您必须使用 Functional API 而不是 Sequential。

编辑(这是不检查它是否有效并假设 ID 中有 140 个类):

dataset = dataset.astype('int32')
data = [dataset[:, i] for i in range(dataset.shape[1])]
inputs = [Input((1,), dtype=tf.int32) for _ in data[:-1]]
embs = [Embedding(140, 5)(inp) for inp in inputs]
concat = Concatenate()(embs)
x = Dense(12, activation='relu')(concat)
x = Dense(8, activation='relu')(x)
output = Dense(1, activation='sigmoid')(x)
model = Model(inputs=inputs, outputs=output)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(data[:-1], data[-1])

反正差不多。我没有任何数据,您也没有在我可以使用的问题中提供任何数据。从长远来看,您可能希望查看卷积,以便每个团队中冠军的顺序无关紧要,但看看您是否不能首先运行它。首先要优化的超参数是 5、12 和 8 以及层数。还有学习率。

【讨论】:

  • 如果您对数据进行一次热编码,您将在输入数据中获得数百或数千个维度。那时您可能无法加载所有数据。嵌入是更好的解决方案的另一个原因。与一次性对所有内容进行编码相比,嵌入层的输出维度可以更低,这将减少模型中的参数数量并减少过拟合。
  • 谢谢!你能指出我直接在我的模型中嵌入和矢量化的起始方向吗?我在网上找到了这个:keras.io/api/layers/core_layers/embedding 但我不确定要使用哪些参数
  • 对不起,我错过了你的评论。如果您的输入还没有准备好输入到嵌入层,那么有 tensorflow.org/api_docs/python/tf/keras/layers/StringLookup 用于字符串和一个等价的用于整数的重新映射器。
【解决方案2】:

不幸的是,根据所使用的数据,无论哪种模型,都可能会产生良好的结果。一个原因是有很多可能的组合可用(573658984353378;~140 个冠军,每轮选出 10 个冠军)。此外,我不认为只有选择的冠军足以获得良好的预测结果。想象一下,一支职业战队在一个奇怪的设置中与非典型英雄比赛,但他们仍然可能会赢下另一支拥有非常强大英雄的队伍。除了上述陈述之外,数据可能存在严重偏差,可能会采用欠采样/过采样来生成包含 50% 胜率和 50% 败率的数据集。

您的模型必须派生并且假设了太多无法观察到的变量。为了改善您的结果,如下所示的其他数据可能会带来更好的结果:

  • 哪些冠军属于哪个队伍?有多少个团队?
  • 英雄到角色的映射;想象一下索拉卡在打野,拉莫斯覆盖中路,等等。
  • 球员的指标/技能以及他们通常扮演的角色和扮演的冠军
  • 将英雄映射到符文、法术和能力顺序
  • 确定英雄技能的类型(伤害、支援、消耗……)
  • 英雄的伤害类型/防御类型
  • 每个英雄的购买物品信息;订单也很重要
  • 控制地图/视野/龙/...
  • 关于种植金币、击杀英雄、造成伤害等的统计数据。
  • 球队和球员的金币分配
  • 等等..

【讨论】:

    猜你喜欢
    • 2020-03-25
    • 2022-01-23
    • 1970-01-01
    • 2014-02-28
    • 2011-09-10
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    相关资源
    最近更新 更多