KMeans聚类代码报错:无法将字符串转为浮点数,求排查解决
KMeans聚类报错:could not convert string to float 解决方法
问题重现
你在使用Pandas结合KMeans开展聚类项目时,运行以下代码到第7行时触发报错:
import pandas as pd from sklearn.cluster import KMeans dataset = pd.read_csv("smogon.csv") dataset.drop(["url", 'texto'], axis=1, inplace=True) km = KMeans(n_clusters=1, n_init='auto') cluster = km.fit_predict(dataset[["moves"]]) # 报错行 dataset["Grupo"] = cluster print(dataset)
报错信息:
cluster = km.fit_predict(dataset[["moves"]])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
could not convert string to float
且该问题仅在使用smogon.csv时出现,其他CSV文件可正常运行。
报错原因
KMeans是基于数值计算的聚类算法,仅能处理数值型特征。smogon.csv中的moves列是字符串类型(比如招式名称、字符串化的招式列表等),无法直接被模型解析;而你之前使用的其他CSV中,moves列应为数值格式,因此能正常运行。
解决方法
根据moves列的实际数据格式,选择以下适配方案:
离散类别字符串:编码转换
如果moves是离散的类别型字符串(如不同招式名称),可通过编码将其转为数值:# 标签编码(适合有序类别,需注意模型会默认类别有顺序) from sklearn.preprocessing import LabelEncoder le = LabelEncoder() dataset["moves_encoded"] = le.fit_transform(dataset["moves"]) cluster = km.fit_predict(dataset[["moves_encoded"]])# 独热编码(适合无序类别,避免模型误判类别顺序) dataset_encoded = pd.get_dummies(dataset, columns=["moves"]) cluster = km.fit_predict(dataset_encoded)含数值的字符串:提取数值
如果moves是包含数值的结构化字符串(如"招式A,150,20"这类格式),可直接提取其中的数值部分:# 示例:假设字符串用逗号分隔,提取第二个数值字段 dataset["moves_num"] = dataset["moves"].apply(lambda x: float(x.split(",")[1])) cluster = km.fit_predict(dataset[["moves_num"]])文本类字符串:向量化转换
如果moves是自由文本或多招式组合文本,可通过文本向量化工具转为数值向量:from sklearn.feature_extraction.text import TfidfVectorizer tfidf = TfidfVectorizer() # 将文本转为TF-IDF向量 moves_vector = tfidf.fit_transform(dataset["moves"]) cluster = km.fit_predict(moves_vector.toarray())
内容的提问来源于stack exchange,提问作者yoryi
相关产品推荐
相关产品推荐

