Scikit-learn KMeans聚类报错怎么办?教你一招避坑

📅 2026/6/20 12:48:04 👤 编程新知 🏷️ 技术资讯
Scikit-learn KMeans聚类报错怎么办?教你一招避坑 博客主页瑕疵的CSDN主页 Gitee主页瑕疵的gitee主页⏩ 文章专栏《热点资讯》被KMeans的NaN坑到凌晨三点终于摸清了根儿目录昨晚改代码改到眼冒金星就为这个KMeans报错ValueError: Input contains NaN, infinity or a value too large for dtype(float64)直接卡在kmeans.fit(X)这行试了三遍数据集每次都是这鬼报错。气得我摔了咖啡杯——数据明明是干净的啊根源就一个字NaNScikit-learn的KMeans对缺失值零容忍。我本地跑的CSV有几行空值但肉眼没看出来毕竟用Pandas看表时默认隐藏了NaN。更坑的是报错信息里连哪列有NaN都不说纯纯的“黑箱报错”。错误示范我刚入行时写的fromsklearn.clusterimportKMeans# 直接用原始数据含NaNXpd.read_csv(data.csv)# 有3列含NaNkmeansKMeans(n_clusters4)kmeans.fit(X)# 一跑就崩注释天真以为数据是干净的结果KMeans在底层检查时发现NaN直接抛异常。别问问就是血泪史。正确姿势现在秒级解决fromsklearn.imputeimportSimpleImputerfromsklearn.clusterimportKMeans# 先处理缺失值关键步骤imputerSimpleImputer(strategymean)# 用均值填充X_cleanimputer.fit_transform(X)# 返回numpy数组# 再聚类kmeansKMeans(n_clusters4,random_state42)kmeans.fit(X_clean)注释SimpleImputer是Scikit-learn自带的填充工具strategymean自动算列均值补缺fit_transform直接返回处理后的数据避免Pandas和numpy混用坑加random_state防随机性聚类结果可复现避坑总结血的教训数据进KMeans前必做检查print(X.isnull().sum().sum())# 直接看总缺失数别靠眼睛print(X.dtypes)# 确认列类型避免object类型被误当数值别信“数据是干净的”我上次用df.dropna()删了整行结果聚类结果歪了——缺失值不是垃圾而是信息用均值/中位数填充比删行更合理。报错时盯住具体行如果报错在fit大概率是输入数据问题在transform可能是测试集有新缺失。别乱改算法先查数据。图左边原始数据有空值右边填充后数值完整KMeans才能跑最后说句大实话KMeans报错90%是数据问题不是算法问题。我踩过这坑三次现在一看到ValueError就先跑isnull().sum()。别等凌晨三点才改数据干净了聚类才香。字数688