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

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)这行,试了三遍数据集,每次都是这鬼报错。气得我摔了咖啡杯——数据明明是干净的啊?!

根源就一个字:NaN
Scikit-learn的KMeans对缺失值零容忍。我本地跑的CSV有几行空值,但肉眼没看出来(毕竟用Pandas看表时默认隐藏了NaN)。更坑的是,报错信息里连哪列有NaN都不说,纯纯的“黑箱报错”。

错误示范(我刚入行时写的)

fromsklearn.clusterimportKMeans# 直接用原始数据(含NaN)X=pd.read_csv("data.csv")# 有3列含NaNkmeans=KMeans(n_clusters=4)kmeans.fit(X)# 一跑就崩!

注释:天真以为数据是干净的,结果KMeans在底层检查时发现NaN,直接抛异常。别问,问就是血泪史

正确姿势(现在秒级解决)

fromsklearn.imputeimportSimpleImputerfromsklearn.clusterimportKMeans# 先处理缺失值(关键步骤!)imputer=SimpleImputer(strategy='mean')# 用均值填充X_clean=imputer.fit_transform(X)# 返回numpy数组# 再聚类kmeans=KMeans(n_clusters=4,random_state=42)kmeans.fit(X_clean)

注释:

  1. SimpleImputer是Scikit-learn自带的填充工具,strategy='mean'自动算列均值补缺
  2. fit_transform直接返回处理后的数据(避免Pandas和numpy混用坑)
  3. random_state防随机性,聚类结果可复现

避坑总结(血的教训)

  1. 数据进KMeans前必做检查
    print(X.isnull().sum().sum())# 直接看总缺失数,别靠眼睛
    print(X.dtypes)# 确认列类型,避免object类型被误当数值
  1. 别信“数据是干净的”
    我上次用df.dropna()删了整行,结果聚类结果歪了——缺失值不是垃圾,而是信息!用均值/中位数填充比删行更合理。

  2. 报错时盯住具体行
    如果报错在fit,大概率是输入数据问题;在transform,可能是测试集有新缺失。别乱改算法,先查数据


(图:左边原始数据有空值,右边填充后数值完整,KMeans才能跑)

最后说句大实话:KMeans报错90%是数据问题,不是算法问题。我踩过这坑三次,现在一看到ValueError就先跑isnull().sum()。别等凌晨三点才改,数据干净了,聚类才香

(字数:688)