机器学习模型拟合问题:Anaconda Python3.6运行Sklearn代码报错
解决Anaconda Python3.6环境中决策树网格搜索的报错问题
我帮你梳理了代码里导致报错的几个核心问题,一步步来修正就能正常运行了:
1. 废弃模块与缺失的导入
你用的sklearn.grid_search.GridSearchCV在scikit-learn 0.20版本后已经被移到sklearn.model_selection模块,而且代码里压根没导入ShuffleSplit,这肯定会触发NameError。修正后的导入部分应该是:
from sklearn.metrics import make_scorer from sklearn.tree import DecisionTreeRegressor # 替换废弃的grid_search,同时导入ShuffleSplit from sklearn.model_selection import GridSearchCV, ShuffleSplit
2. 未定义的performance_metric函数
你调用了make_scorer(performance_metric)但没给出这个函数的实现,这也是会报错的。比如如果你的性能指标是R²(常用回归指标),可以先定义这个函数:
# 示例:定义基于R²的性能评估函数,你可以根据需求替换成MAE/MSE等 def performance_metric(y_true, y_predict): from sklearn.metrics import r2_score return r2_score(y_true, y_predict)
3. GridSearchCV参数顺序问题
你调用GridSearchCV(regressor, params, scoring_fnc, cv=cv_sets)的参数顺序容易出错,建议用关键字参数明确指定,避免版本差异导致的参数位置变化:
grid = GridSearchCV(estimator=regressor, param_grid=params, scoring=scoring_fnc, cv=cv_sets)
4. 返回语句的语法错误
代码最后return grid....的省略号是语法错误,一般我们需要返回网格搜索找到的最优模型,用grid.best_estimator_就能直接拿到训练好的最优决策树回归器:
return grid.best_estimator_
完整修正后的代码
把以上修正整合后,完整可运行的代码如下:
from sklearn.metrics import make_scorer, r2_score from sklearn.tree import DecisionTreeRegressor from sklearn.model_selection import GridSearchCV, ShuffleSplit def performance_metric(y_true, y_predict): """自定义性能指标函数,这里以R²为例""" return r2_score(y_true, y_predict) def fit_model(X, y): """ Performs grid search over the 'max_depth' parameter for a decision tree regressor trained on the input data [X, y]. """ # 创建交叉验证集,适配新版本scikit-learn的参数格式 cv_sets = ShuffleSplit(n_splits=10, test_size=0.20, random_state=0) # 初始化决策树回归器 regressor = DecisionTreeRegressor() # 定义max_depth的参数范围(这里改成1到10,原代码range(1,10)只到9) params = {'max_depth': range(1, 11)} # 将自定义指标转换为网格搜索可识别的评分函数 scoring_fnc = make_scorer(performance_metric) # 创建网格搜索对象 grid = GridSearchCV(estimator=regressor, param_grid=params, scoring=scoring_fnc, cv=cv_sets) # 拟合数据并找到最优模型 grid.fit(X, y) # 返回最优模型 return grid.best_estimator_
额外提醒:Python3.6环境建议安装scikit-learn 0.22.x版本(更高版本不再支持Python3.6),可以用pip install scikit-learn==0.22.2.post1来安装适配版本。
内容的提问来源于stack exchange,提问作者Abdulaziz Alshamran
相关产品推荐
相关产品推荐

