Random Forest模型打印得分报错:'str'对象无mean_test_score属性
问题原因
你遇到的报错是新旧版本scikit-learn的搜索类返回值结构不匹配导致的,核心错误点有两个:
- 你调用
report函数时传入的random_search.cv_results_是字典结构,不是旧版本废弃的grid_scores_对象列表。直接遍历字典默认会遍历键名(都是字符串),所以循环内的score变量实际是字符串类型的键,自然没有mean_test_score属性。 - 你使用的
report函数是针对scikit-learn 0.20版本之前的grid_scores_返回值编写的,当前版本的cv_results_需要按字典键访问对应值。
修复后的代码
直接替换原report函数即可,适配当前版本的cv_results_结构:
import numpy as np def report(cv_results, n_top=3): # 按测试平均分从高到低排序,取前n_top结果的索引 top_indices = np.argsort(cv_results['mean_test_score'])[::-1][:n_top] for i, idx in enumerate(top_indices): print("Model with rank: {0}".format(i + 1)) print("Mean Test score: {0:.3f} (std: {1:.3f})".format( cv_results['mean_test_score'][idx], cv_results['std_test_score'][idx])) print("Parameters: {0}".format(cv_results['params'][idx])) print("")
调用方式保持不变:report(random_search.cv_results_)
额外说明
- scikit-learn 0.22及以上版本的
cv_results_默认自带std_test_score字段,无需手动计算多折得分的标准差 - 旧版本的
grid_scores_、cv_validation_scores属性已被正式移除,不要继续使用
内容的提问来源于stack exchange,提问作者WPB
相关产品推荐
相关产品推荐

