微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Tensorflow.js 模型只预测相同的值

如何解决Tensorflow.js 模型只预测相同的值

我有一个大小为 [299,13] 的数据集(包含数据和标签),并且模型不断输出/预测相同的值。这是一个二元分类任务。我如何让我的模型预测不总是相同的值?

这是代码(带有一些虚拟数据):

var Dataset = tf.tensor([[1,0.491821360184978,9,314,0.504585169147173,542,1231,3213,1,0.267304071302649,3,0.615917680092409,0],[0,0.72959029133292,758,0.402582737085955,400,1788,4599,0.532702887951197,4,0.18630897965037,1],[1,0.198764110760428,5,787,0.65507860022684,887,192,4831,0.739456077544426,0.100068056951143,0.583574833590476,596,0.933996451580092,631,331,811,0.258445986493932,7,0.811276729811182,0.701499878184206,8,854,0.0326334179806069,845,470,4930,0.825469683527519,0.448086959665654,0.954482878414911,2,468,0.736300149681564,557,3110,739,0.325783042694677,0.43488580142501,0.384845877769,662,0.265402742189238,649,384,1158,0.484884260891815,0.915444292219105,0.379266474923531,551,0.275982850450116,1022,3329,1413,0.237295089390298,0.817104709627837,0.691365367558705,549,0.479627221800976,796,3381,495,0.37129382411555,0.332832739155564,0.433042848178662,529,0.545178403950882,842,4768,506,0.386370525896832,0.189942077251933,0.611272282663452,823,0.737901576655264,839,2724,1787,0.365032317656007,6,0.884073622694046,0.0084315409129881,352,0.76858549557176,476,685,4796,0.302944943656102,0.849655932794213,0.977380232874908,701,0.588833228576897,999,2897,3325,0.418024491281536,0.631872118440871,0.419601058571829,10,0.0157052616592944,1009,4438,113,0.909015627566542,0.0297684897733232,0.739471449044276,836,0.0430176780439737,1030,1456,3932,0.331426481315121,0.734008754824423,0.00209807072438295,0.499622407429238,418,1912,4452,0.727130871883893,0.157427964683612,0.956533819923862,681,0.196708599930969,829,4562,1718,0.233193195569506,0.60582783922237,0.504637155233183,809,0.608861975627751,717,130,4194,0.134197560919101,0.375188428842507,0.747363884375055,522,0.868234577182028,849,3529,1192,0.0322641640468155,0.185973206518818,0.244142898027225,402,0.0280582030746698,315,3576,3882,0.724916254371562,0.062229775169706,0.858414851618448,459,0.367325906336267,616,930,3892,0.177388425930446,0.859824526007041,0.921555604905976,863,0.821166873626313,528,1624,1289,0.366243396916411,0.453840754701258,0.171321120311715,524,0.177251413832862,1608,3123,0.192861821442111,0.122983286410146,0.539946042901786,692,0.817780349862711,392,1053,4891,0.409578972921785,0.0453862502541893,0.996848843212564,0.877740438211017,762,3046,843,0.888578696082088,0.877971306478434,0.218116987741582,655,0.240496962520226,407,1001,1474,0.976212355833712,0.936396547703282,1]])
var x = Dataset.slice([0,[-1,12]) 
var y = Dataset.slice([0,12],1]) y = y.cast('int32').reshape([-1]).oneHot(2) y.print()


const model = tf.sequential({
    layers: [
        tf.layers.dense({ inputShape: [12],units: 12,activation: "relu6" }),tf.layers.dense({ units: 56,activation: "tanh" }),tf.layers.dense({ units: 28,tf.layers.dense({ units: 14,activation: "sigmoid" }),tf.layers.dense({ units: 58,tf.layers.dense({ units: 2,activation: "softmax" })
    ] }) model.summary()

model.compile({
    optimizer: tf.train.adam(),loss: 'categoricalCrossentropy',metrics: ['accuracy'],});

model.fit(x,y,{ batchSize: 3,epochs: 10,shuffle: true }).then(h => {
    console.log("Training Complete")
    var predictions = model.predict(x)
    predictions.print() });

解决方法

299 个样本,具有 13 个特征。这可能不足以让模型泛化。在隐藏层中,您使用 tanhsigmoid。我建议使用 relu。您还对标签进行单热编码以使用 softmax,这是可以理解的,但您可能想要使用 sigmoid

如果您使用没有单热编码的 sigmoid,那么您将有机会根据您的业务问题设置一些阈值。 >

    tf.layers.dense({ units: 1,activation: "sigmoid" })

假设您为预测设置了 0.5 阈值,这意味着如果您的预测大于 0.5,那么它将属于第二类。但是您可以将其调整为 0.4,看看会发生什么。您可以通过解释 AUC-ROC 曲线得出结论。

另一件事是关于功能,它们没有正确缩放:

[1,0.00209807072438295,4,352,0.499622407429238,418,1912,4452,1,0.727130871883893,8,0.157427964683612,0]

如果它们在一个范围内没有正确缩放,那么模型可能会给某些特征赋予比其他特征更重要的重要性,否则可能会发生一些意外行为。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。