使用Scikit-Learn遇AttributeError:已验证输入为numpy array仍报list无shape属性
问题排查与解决
核心问题定位
你已经确认print(data.shape[0])能正常执行,说明这一行的data确实是numpy数组,错误必然出在后续的分支代码中,大概率是Isolation Forest分支的用法错误。
具体解决步骤
1. 修复Isolation Forest分支的silhouette_score用法
silhouette_score要求第二个参数是整数类型的簇标签,但IsolationForest.score_samples()返回的是连续型的异常分数(范围约-0.5到0.5),直接传入会导致函数内部处理异常,引发list相关错误。需要先将分数转换为二分类标签:
elif self.cluster_method == 'isolation_forest': predicted_scores = self.cluster_model.score_samples(data) # 以0为阈值,把分数小于0的标记为异常簇(1),正常样本标记为0 predicted_labels = (predicted_scores < 0).astype(int) score = silhouette_score(data, predicted_labels) print(f"Silhouette score: {score}")
2. 额外排查验证
- 在每个分支的
silhouette_score调用前,打印参数的类型和形状,确认都是numpy数组且维度匹配:# KMeans分支 print("KMeans: data类型", type(data), "形状", data.shape) print("KMeans: 预测标签类型", type(predicted_labels), "形状", predicted_labels.shape) # Isolation Forest分支 print("IF: data类型", type(data), "形状", data.shape) print("IF: 预测标签类型", type(predicted_labels), "形状", predicted_labels.shape) - 确认调用
evaluate_performance时,传入的原始数据没有被意外转为list:直接传递df.to_numpy()(推荐替代df.values),避免手动转成list。
3. 验证模型状态
确保self.cluster_model对应的Isolation Forest模型已经完成训练,未训练的模型调用score_samples可能返回异常结果。
内容的提问来源于stack exchange,提问作者AbhishekRaoC
相关产品推荐
相关产品推荐

