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

如何为sklearn的MLPRegressor设置out_activation_为logistic?

解决MLPRegressor无法设置out_activation_为'logistic'的问题

核心原因

out_activation_是模型训练后自动生成的只读属性,并非可手动配置的参数。对于MLPRegressor(回归任务),scikit-learn会默认将输出层激活函数设为identity(恒等函数)——因为回归任务需要输出连续数值,而logistic(sigmoid)仅输出0-1范围的数值,不符合普通回归的需求。无论你在fit前如何修改这个属性,模型训练时都会自动重置为对应任务的默认值。

另外,你代码中的MLPRegressor().out_activation_ = 'logistic'完全无效:这行创建了一个全新的未使用的MLPRegressor实例,和你定义的MatchingNetwork没有任何关系。

正确解决方案

根据你的需求,分两种情况处理:

情况1:需要输出0-1范围的回归值(概率回归)

如果目标是预测0到1之间的连续值(比如概率),可以通过以下两种方式实现:

  • 方式一:手动给输出添加sigmoid激活
    用MLPRegressor训练后,对模型输出单独应用sigmoid函数:
    import numpy as np
    
    # 训练模型
    MatchingNetwork.fit(X_train2, y_train2)
    # 对预测结果应用sigmoid转换为0-1范围
    y_pred = 1 / (1 + np.exp(-MatchingNetwork.predict(X_test2)))
    
  • 方式二:转分类任务使用MLPClassifier
    如果目标变量本质是二分类标签(0/1),直接用MLPClassifier并设置activation='logistic'(隐藏层激活),此时模型输出层会自动使用logistic激活:
    from sklearn.neural_network import MLPClassifier
    
    # 注意y_train2需为0/1格式的分类标签
    MatchingNetwork = MLPClassifier(alpha=1e-15, hidden_layer_sizes=(300,), 
                                    random_state=1, max_iter=20000, 
                                    activation='logistic', batch_size=64)
    MatchingNetwork.fit(X_train2, y_train2)
    # 用predict_proba获取概率值
    y_proba = MatchingNetwork.predict_proba(X_test2)[:, 1]
    

情况2:强制修改MLPRegressor的输出层激活(不推荐)

如果你一定要在MLPRegressor中使用logistic作为输出层激活,需要通过子类化自定义模型实现,但这会跳过scikit-learn内部逻辑,可能引发训练不稳定:

from sklearn.neural_network import MLPRegressor

class CustomMLPRegressor(MLPRegressor):
    def __init__(self, *args, out_activation='logistic', **kwargs):
        super().__init__(*args, **kwargs)
        self.out_activation = out_activation
        
    def _initialize(self, y, layer_units):
        super()._initialize(y, layer_units)
        # 强制覆盖输出层激活函数
        self.out_activation_ = self.out_activation

# 使用自定义模型
MatchingNetwork = CustomMLPRegressor(alpha=1e-15, hidden_layer_sizes=(300,), 
                                     random_state=1, max_iter=20000, 
                                     activation='logistic', batch_size=64,
                                     out_activation='logistic')
MatchingNetwork.fit(X_train2, y_train2)
print(MatchingNetwork.out_activation_)  # 输出'logistic'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:45:52