我正在“使用 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
有关吗?
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 版起已弃用:
已在 1.0 版中弃用,并将在 1.2 中删除。
normalize
确实,在较新的 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 个选择:
'params':{'normalize':[True, False]
函数中删除 find_best_model_using_gridsearchcv
使用其他参数,如 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)```