估计器 LinearRegression() 的参数“标准化”无效

问题描述 投票:0回答:2

我正在“使用 Python 进行机器学习简介”中实现一个示例。

我正在使用的代码:

def find_best_model_using_gridsearchcv(x,y):
  algos = {
      'linear regression' : {
          'model': LinearRegression(),
          'params':{ 
              'normalize':[True, False]
          }
      },
      'lasso': {
          'model': Lasso(),
          'params':{
              'alpha':[1,2],
              'selection': ['random','cyclic']
          }
      },
      'decision tree':{
          '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_train, y_train)
    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)

返回的错误归结为:

ValueError: Invalid parameter 'normalize' for estimator LinearRegression(). 
Valid parameters are: ['copy_X', 'fit_intercept', 'n_jobs', 'positive'].

此错误实际上与

LinearRegression
GridSearchCV
有关吗?

python machine-learning scikit-learn linear-regression
2个回答
2
投票

LinearRegression
used 在旧版本的 scikit-learn 中具有
normalize
参数;例如在 v1.0 中,根据文档,模型曾经是:

class sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=None)

但是

normalize
参数已经带有警告:

自 1.0 版起已弃用:

normalize
已在 1.0 版中弃用,并将在 1.2 中删除。

确实,在较新的 scikit-learn 版本中删除了

normalize
参数;在当前最新的 v1.3 中,根据 documentation,该类是

class sklearn.linear_model.LinearRegression(*, fit_intercept=True, copy_X=True, n_jobs=None, positive=False)

所以,发生的情况是,您正在阅读一本基于较旧的 scikit-learn 版本(1.1 或更早版本)的书,同时使用较新的版本,因此当您使用

LinearRegression()
参数调用
normalize
时,您毫不奇怪地会得到您报告的错误消息。

根据您的具体意图,您有 2 个选择:

  • 如果你想坚持阅读本书,你应该安装 scikit-learn v1.1 或更早版本
  • 如果您不介意稍微偏离书中的示例,则应该从
    'params':{'normalize':[True, False]
    函数中删除
    find_best_model_using_gridsearchcv

0
投票

使用其他参数,如 copy_X、fit_intercept、n_jobs、positive 并为 copy_X = [True, False]、fit_intercept = [True, False]、n_jobs = [1,2,3] 和 Positive = [True, False] 分配值。您将得到该函数的最终结果。


from sklearn.linear_model import Lasso
from sklearn.tree import DecisionTreeRegressor

def find_best_model_using_gridsearchcv(X,y):
    algos = {
        'linear_regression' : {
            'model': LinearRegression(n_jobs=1),
            'params': {
                'copy_X' : [True, False],
                'fit_intercept' : [True, False],
                'n_jobs' : [1,2,3],
                'positive' : [True, False]
            }
        },
        'lasso': {
            'model': Lasso(),
            'params': {
                'alpha': [1,2],
                'selection': ['random', 'cyclic']
            }
        },
        'decision_tree': {
            '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)```
© www.soinside.com 2019 - 2024. All rights reserved.