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
相关产品推荐
相关产品推荐

