问题描述
我正在尝试为我运行的 K-Means 模型绘制轮廓图,但是,我收到错误:ImportError: cannot import name 'safe_indexing' from 'sklearn.utils
。
我最初遇到了此 post here 中描述的 NotFoundError 问题,但是一旦我修复了它,我就遇到了这个问题。我的代码如下:
from yellowbrick.cluster import SilhouetteVisualizer
fig,ax = plt.subplots(2,2,figsize=(15,8))
for i in range(1,6):
kmeans = KMeans(n_clusters=i,init='k-means++',n_init=10,max_iter=100,random_state=0)
q,mod = divmod(i,2)
visualizer = SilhouetteVisualizer(km,colors='yellowbrick',ax=ax[q-1][mod])
visualizer.fit(ct1)
解决方法
在带有yellowbrick v1.2 和scikit-learn v0.23.2 的python3.7 中,我没有收到错误,但是当我将scikit-learn 提升到v0.24.0 时,我得到了相同的ImportError。
我查看了 API 文档,就像您引用的链接一样,在 sklearn v0.22.0 中,他们将 utils.safe_indexing
弃用为私有 (utils._safe_indexing
)。但是我安装了yellowbrick v1.2 和v0.22.0utils.safe_indexing,因此如果您只安装 v0.24.0 之前的 scikit-learn 版本,导入应该可以工作。
编辑:这是 Yellowbrick 的 github issue,如果您想跟踪他们的解决方法或更新此问题的进度
,我也遇到过这种情况,说说我的解决方法
我用的是python3.8、yellowbrick v1.2和scikit-learn v0.24.0,然后我按照adbailey说的改成了scikit-learn v0.23.2,但好像没什么变化。
所以,我尝试在“Colab”上运行它。嗯,它现在有效。 Colab的部分要求如下:
pip install yellowbrick==0.9.1 scikit-learn==0.22.2
也就是说,参考这个配置是没有问题的。
ngAfterViewInit() {
this.qrScannerComponent.getMediaDevices().then((devices) => {
console.log(devices);
const videoDevices: MediaDeviceInfo[] = [];
for (const device of devices) {
if (device.kind.toString() === 'videoinput') {
videoDevices.push(device);
}
}
if (videoDevices.length > 0) {
let chosenDev;
for (const dev of videoDevices) {
if (dev.label.includes('front')) {
chosenDev = dev;
break;
}
}
if (chosenDev) {
this.qrScannerComponent.chooseCamera.next(chosenDev);
} else {
this.qrScannerComponent.chooseCamera.next(videoDevices[0]);
}
}
});
this.qrScannerComponent.capturedQr.subscribe((result) => {
console.log(result);
});