使用Yellowbrick绘制KMeans肘部曲线时报'KMeans'无k属性如何解决?
KMeans调用Yellowbrick肘部曲线后置报错解决方案
问题原因
该报错发生在肘部曲线渲染完成后的对象打印阶段,属于Scikit-learn与Yellowbrick的版本兼容问题:
- Yellowbrick的KElbowVisualizer内部会为封装的KMeans实例动态添加
k属性记录聚类数取值,但新版Scikit-learn的参数校验逻辑会拦截非官方定义的属性,KMeans原生参数只有n_clusters无k属性。 - 你当前是在Jupyter类交互环境运行代码,函数返回的可视化对象会被自动触发repr打印,调用
get_params获取属性时找不到k就会抛出异常,所以曲线生成、肘部取值都正常,仅最后抛错。
可行解决方案
方案1:修改函数逻辑避免返回可视化对象(最推荐)
在函数内完成渲染后只返回你需要的肘部取值即可,不需要返回整个可视化对象触发打印逻辑:
from sklearn.cluster import KMeans from yellowbrick.cluster.elbow import kelbow_visualizer RSEED = 2 def elbow_method(X, max_range_for_elbow, rseed = RSEED): visualizer = kelbow_visualizer(KMeans(random_state=rseed), X, k=(1, max_range_for_elbow)) visualizer.show() # 仅返回最优聚类数供后续使用 return visualizer.elbow_value_ optimal_k = elbow_method(data_standardized,10)
方案2:阻止Jupyter自动打印返回值
不需要修改函数,只需要在调用函数的代码行末尾添加分号,即可禁止Jupyter自动打印返回的可视化对象:
elbow_method(data_standardized,10);
方案3:版本适配
要么将Scikit-learn降级到1.0及以下版本,要么将Yellowbrick升级到1.5及以上版本,Yellowbrick官方已在新版修复了该兼容问题。
内容的提问来源于stack exchange,提问作者Chops
相关产品推荐
相关产品推荐

