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

调优LinearRegression模型时替代normalize参数及报错解决咨询

问题解决指南

报错原因

sklearn新版本中已移除LinearRegression的normalize参数,当前该模型仅支持copy_X、fit_intercept、n_jobs、positive这几个有效参数,因此在GridSearchCV中传入normalize会触发参数无效的报错。

替代normalize的方案

原来的normalize=True是对特征做L2归一化(每个样本的特征向量除以自身L2范数),现在需要通过预处理组件+Pipeline实现相同效果,常用选择有三种:

  • Normalizer:完全对应原normalize的逻辑
  • StandardScaler:将特征标准化为均值0、方差1,线性模型使用该方式通常收敛更快、结果更稳定
  • MinMaxScaler:将特征缩放到[0,1]区间

修改后的完整代码

把预处理工具和LinearRegression打包进Pipeline,让GridSearchCV可以正常完成调参,代码如下:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, Normalizer
from sklearn.linear_model import LinearRegression, Lasso
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import GridSearchCV, ShuffleSplit
import pandas as pd

def find_best_model_using_gridsearchcv(X,y):
    algos ={
        'linear_regression':{
            'model': Pipeline([
                # 选Normalizer对应原normalize效果,替换成StandardScaler也可
                ('scaler', Normalizer()),
                ('lr', LinearRegression())
            ]),
            'params':{
                # 可调整LinearRegression的有效参数,比如是否拟合截距
                'lr__fit_intercept': [True, False]
                # 若要对比不同预处理方式,添加此行:
                # 'scaler': [Normalizer(), StandardScaler()]
            }
        },
        'lasso': {
            'model': Lasso(),
            'params':{
                'alpha': [1,2],
                'selection': ['random', 'cyclic']
                
            }
        },
        'decisiontree': {
            'model': DecisionTreeRegressor(),
            'params':{
                'criterion': ['mse', 'friedman_mse'],
                'splitter': ['best', 'random']
            }
        }       
    }


    scores = []
    cv = ShuffleSplit(n_splits=5, test_size=0.2, random_state=0)
    for algo_name, config in algos.items():
        gs = GridSearchCV(config['model'], config['params'], cv=cv, return_train_score=False)
        gs.fit(X,y)
        scores.append({
            'model': algo_name,
            'best_score': gs.best_score_,
            'best_params':gs.best_params_
        })
    return pd.DataFrame(scores, columns=['model','best_score','best_params'])

find_best_model_using_gridsearchcv(X,y)

补充说明

  • Pipeline中的参数需遵循组件名__参数名的格式,比如lr__fit_intercept对应LinearRegression的fit_intercept参数
  • 如果不需要对比不同预处理方式,直接固定使用Normalizer或StandardScaler即可,无需在params中添加scaler的选项

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:58:41