如何指定Sklearn MLPClassifier优先关注类别1(获胜)进行预测?
核心问题大概率是数据不平衡——负样本(0)数量远多于正样本(1),你用GridSearchCV选参数时默认用整体准确率指标,当全预测0的准确率比能部分预测1的模型更高时,它就会把这种“躺平”模型选为最优。要让模型专注于类别1的预测,你可以从这几个方向入手:
先修正数据分布
- 过采样:给类别1的样本做复制,或者用SMOTE这类算法生成合成正样本,拉平两类样本数量差距。
- 欠采样:随机删掉一部分类别0的样本,缩小两类数量差。
注意:过采样容易导致模型过拟合,欠采样会丢失有效数据,建议先统计两类样本的比例,再选合适的方法。
给模型加类别权重
初始化MLPClassifier时,加上class_weight='balanced'参数,它会根据样本比例自动给少数类(类别1)更高的错误代价,逼着模型重视类别1的预测。你也可以手动指定权重,比如class_weight={0:1, 1:3},意思是错判类别1的代价是错判类别0的3倍,具体倍数根据数据不平衡程度调整。更换GridSearchCV的评估指标
别再用默认的准确率,换成对类别1更友好的指标,比如类别1的召回率、F1分数或者ROC-AUC。比如把GridSearchCV的scoring参数设为'recall'(召回率),这样它会优先选择能多预测出类别1的参数,而非全预测0的“伪最优”模型。示例代码:from sklearn.model_selection import GridSearchCV from sklearn.neural_network import MLPClassifier mlp = MLPClassifier(random_state=42) param_grid = { # 你的参数网格内容 } # 用类别1的召回率作为评估指标 grid_search = GridSearchCV(mlp, param_grid, scoring='recall', cv=5) grid_search.fit(X_train, y_train)调整模型训练细节
你之前的最优参数里设了shuffle=False,这可能让模型先接触大量类别0样本,直接陷入偏向0的局部最优。改成shuffle=True,每次迭代打乱样本顺序,让模型交替接触两类样本。另外可以检查模型的损失曲线,确认300次迭代是否真的收敛,有时候迭代次数过多反而会让模型过度偏向多数类。
之前用hidden_layer_sizes=(64, 32), max_iter=100时能有0.47的类别1准确率,是因为模型还没收敛到全预测0的状态,反而能学到类别1的部分特征,但GridSearchCV因整体准确率更高,把全预测0的模型当成了最优,这显然不是你需要的结果。
内容的提问来源于stack exchange,提问作者Vincent Coulombe

