You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MLP Classifier输出极端概率值原因排查:Urn抽球预测异常

问题:MLP分类器预测抽球概率出现极端值的原因分析

我正在用MLP Classifier分析36个不同urn(每个含10个编号0-9的球)的666次过往抽球结果,想获取下一次抽球各球的预期概率,但算法输出了极端值。尝试增加隐藏层数量(最多到1000层)后结果依旧,期望各球概率接近0.1(0.075-0.125之间),请问为何会出现这种极端值?

相关代码

import numpy as np
from sklearn.neural_network import MLPClassifier
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import StandardScaler

# Assuming your data is stored in the 'results' list
# Each sublist represents the past results for an urn
results = [
    [3, 2, 7, ..., 6, 9],  # Urn 1
    [5, 2, ..., 0],       # Urn 2
    # ... (other urns)
    [4, 2, 7, ..., 1, 1]  # Urn 36
]

# Encode the past results as binary vectors
encoder = OneHotEncoder(categories=[range(10)] * 666, sparse=False)
X = np.vstack([encoder.fit_transform([urn]) for urn in results])

# Use the last ball drawn in each urn as the label
labels = np.array([urn[-1] for urn in results])

# Normalize the features
scaler = StandardScaler()
X_normalized = scaler.fit_transform(X)

# Initialize the MLP classifier with increased complexity
mlp = MLPClassifier(hidden_layer_sizes=(100, 100, 100), max_iter=1000, random_state=42)

# Train the model
mlp.fit(X_normalized, labels)

# Predict probabilities for each ball in the next drawing for all urns
for urn_idx, urn_results in enumerate(results):
    next_drawing_probs = mlp.predict_proba(scaler.transform(encoder.transform([urn_results])))
    print(f"Urn {urn_idx + 1} probabilities:")
    for ball, prob in enumerate(next_drawing_probs):
        print(f"  Ball {ball}: {prob:.4f}")

输出示例(最后2个urn)

Urn 35 probabilities:
Ball 0: 0.0000
Ball 1: 0.0000
Ball 2: 0.0000
Ball 3: 0.0000
Ball 4: 0.0001
Ball 5: 0.9999
Ball 6: 0.0000
Ball 7: 0.0000
Ball 8: 0.0000
Ball 9: 0.0000
Urn 36 probabilities:
Ball 0: 0.0000
Ball 1: 0.0000
Ball 2: 0.0000
Ball 3: 0.0000
Ball 4: 0.0000
Ball 5: 0.0000
Ball 6: 0.0000
Ball 7: 0.0000
Ball 8: 0.0000
Ball 9: 0.9999
Process finished with exit code 0


原因分析及解决建议

核心原因:

  • 样本量与特征维度严重失衡:每个样本的特征维度是666*10=6660维,但训练样本只有36个,完全是维数灾难。模型根本不需要学习任何抽球规律,直接记住每个样本对应的标签(即每个urn的最后一次抽球结果),自然输出极端概率。
  • 任务类型匹配错误:MLPClassifier是分类模型,目标是最小化分类误差,会倾向于输出高置信度的预测,而非贴近真实分布的概率估计。你的需求是概率密度估计,用分类器本身就不合适。
  • 模型复杂度加剧过拟合:增加隐藏层到1000层,在样本量极少的情况下只会让模型过拟合更严重。参数远多于样本数,模型可以完美拟合所有训练样本的标签,输出极端概率是必然结果。
  • 数据构造逻辑错误:用每个urn的全部666次抽球作为特征,预测该urn的最后一次结果,每个urn仅贡献1个训练样本,模型无法学习到跨urn的通用规律。

修正建议:

  • 重构训练数据:把每个urn的抽球序列拆成多个输入-输出对,比如用前k次抽球预测第k+1次。这样每个urn能生成665个样本,总样本量达到36*665=23940个,足够支撑模型学习。
  • 更换合适模型:如果是序列预测,用RNN、LSTM这类专门处理序列数据的模型;如果是概率估计,考虑朴素贝叶斯、核密度估计这类更适合小样本或概率任务的方法。
  • 降低特征维度:不要对全部666次抽球做OneHot编码,改用统计特征替代,比如每个球的出现次数、最近10次的抽球结果等,大幅减少特征数。
  • 简化模型并加正则化:如果坚持用MLP,用极小的隐藏层(比如(10,10)),同时添加正则化参数(如alpha=0.1)来限制模型复杂度,防止过拟合。

内容的提问来源于stack exchange,提问作者Jorge_Espinoza_73

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 05:35:19