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

