使用SilhouetteVisualizer报NoneType无split属性错误如何解决
报错根因
触发AttributeError: 'NoneType' object has no attribute 'split'的核心原因是旧版本Yellowbrick和scikit-learn版本不兼容:新版scikit-learn中KMeans模型的_metric属性默认值为None,旧版Yellowbrick的SilhouetteVisualizer逻辑里没有做非空判断,直接调用该属性的split()方法就会触发报错。
另外你贴的代码还存在三处会导致运行异常/警告的问题:
- 缺少KMeans的导入语句,运行时会触发NameError
- 多轮循环绘图没有清理上一轮的画布缓存,可能出现多图重叠、显示错乱的问题
- 新版scikit-learn的KMeans没有显式指定
n_init参数会弹出参数警告
修复方案
你可以任选以下一种方式解决核心兼容性报错:
- 最直接的方案:升级Yellowbrick到最新兼容版本,执行命令:
升级后不需要修改原有可视化逻辑即可正常运行。pip install --upgrade yellowbrick - 无法升级Yellowbrick的场景:初始化SilhouetteVisualizer时手动传入
metric参数,绕过对模型_metric属性的读取逻辑,参数值和KMeans使用的距离度量保持一致即可,KMeans默认使用欧氏距离,传入'euclidean'即可。
修正后完整可运行代码
# 补全缺失的导入 from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score from yellowbrick.cluster import SilhouetteVisualizer import matplotlib.pyplot as plt for i in range(2, 10): plt.close() # 清理上一轮画布缓存,避免图像重叠 # 显式指定n_init消除新版sklearn的参数警告 km = KMeans(n_clusters=i, random_state=100, n_init="auto") km.fit(df) sil_score = silhouette_score(df, km.labels_) print(f"Silhouette score for {i} clusters : {sil_score}") # 旧版Yellowbrick需要保留metric参数,升级到最新版可删除该参数 sil_km = SilhouetteVisualizer(km, metric="euclidean") sil_km.fit(df) plt.show()
内容的提问来源于stack exchange,提问作者tushar
相关产品推荐
相关产品推荐

