Logistic Regression中Elastic Net惩罚项配置报错,如何设置l1_ratio?
问题:Elastic Net逻辑回归训练报错,l1_ratio参数设置疑问
在完成IBM机器学习课程作业时,训练逻辑回归模型已设置penalty='elasticnet',但多次报错。已知Elastic Net模型需要l1_ratio参数,但不确定该参数是否必须设置以及正确的设置位置。
相关代码
# 定义带Elastic Net惩罚的逻辑回归参数 l1_ratio=0.5 # Elastic Net惩罚:收缩系数但不剔除特征 penalty= 'elasticnet' # 多分类问题 multi_class = 'multinomial' # Elastic Net和多分类仅支持saga求解器 solver = 'saga' # 设置最大迭代次数 max_iter = 1000
# 初始化逻辑回归模型并训练 e_net_model = LogisticRegression(random_state=rs, penalty=penalty, multi_class=multi_class, solver=solver, max_iter = 1000) # 训练模型 e_net_model.fit(X_train, y_train)
报错信息
TypeError Traceback (most recent call last) Input In [60], in <cell line: 2>() 1 # Type your code here ----> 2 e_net_model.fit(X_train, y_train) File ~\anaconda3\lib\site-packages\sklearn\linear_model\_logistic.py:1291, in LogisticRegression.fit(self, X, y, sample_weight)
解决方案
- 当使用
penalty='elasticnet'时,必须显式设置l1_ratio参数,这是scikit-learn的硬性要求,不设置会触发TypeError。 - 正确位置是在初始化
LogisticRegression对象时,将l1_ratio作为参数传入,和其他配置参数放在一起。
修正后的代码:
# 初始化带Elastic Net惩罚的逻辑回归模型 e_net_model = LogisticRegression( random_state=rs, penalty=penalty, l1_ratio=l1_ratio, # 传入预先定义的l1_ratio值 multi_class=multi_class, solver=solver, max_iter=1000 ) # 训练模型 e_net_model.fit(X_train, y_train)
补充说明:l1_ratio取值范围为0到1,0对应纯L2惩罚,1对应纯L1惩罚,你设置的0.5是L1和L2惩罚各占一半的混合模式,完全符合需求。
内容的提问来源于stack exchange,提问作者Nikhil Sharma
相关产品推荐
相关产品推荐

