使用Sklearn决策树进行疾病症状分类报错:无法将字符串转为float
解决DecisionTreeClassifier训练时的"could not convert string to float"错误
嘿,这个坑我之前踩过!你遇到的ValueError: could not convert string to float本质原因很简单:Scikit-learn的决策树模型根本不认识字符串类型的特征——它只接受数值型的输入数据。你的症状列表全是文本描述,模型没法自动把这些字符串转换成可计算的浮点数,自然就报错了。
另外还要提一句:你原来的labels是嵌套的二维列表,这也会给模型训练添乱,Sklearn要求标签是一维的(每个样本对应一个标签值),得先改成一维列表。
下面给你两种最常用的解决方案,按需选择:
方案一:用LabelEncoder做标签编码(快速简单)
如果只是快速验证模型逻辑,可以用LabelEncoder把每个特征列的字符串转换成整数:
import numpy as np from sklearn import tree from sklearn.preprocessing import LabelEncoder # 原始数据 symptoms = [['flat face','poor moro','hypotonia'], ['small head','small jaw','overlapping fingers'], ['small eyes','cleft lip','cleft palate']] # 把嵌套的标签改成一维列表 labels = ['Trisomy 21', 'Trisomy 18', 'Trisomy 13'] # 对每一列特征分别编码 encoded_symptoms = [] # 转置症状列表,按列处理每个特征维度 for feature_col in zip(*symptoms): le = LabelEncoder() # 把当前列的字符串转换成整数 encoded_col = le.fit_transform(feature_col) encoded_symptoms.append(encoded_col) # 再转置回样本行的格式 encoded_symptoms = np.array(encoded_symptoms).T # 现在可以正常训练模型了 classify = tree.DecisionTreeClassifier() classify.fit(encoded_symptoms, labels)
方案二:用OneHotEncoder做独热编码(更科学)
因为症状之间没有顺序关系(比如"flat face"和"small head"不存在谁比谁重要的逻辑),用独热编码更合适——它会把每个分类特征的不同取值转换成独立的二进制列,避免模型误解特征的顺序:
import numpy as np from sklearn import tree from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer symptoms = [['flat face','poor moro','hypotonia'], ['small head','small jaw','overlapping fingers'], ['small eyes','cleft lip','cleft palate']] labels = ['Trisomy 21', 'Trisomy 18', 'Trisomy 13'] # 对所有3个特征列做独热编码 column_transformer = ColumnTransformer( transformers=[('onehot', OneHotEncoder(sparse_output=False), [0, 1, 2])], remainder='passthrough' ) # 转换特征为数值型 encoded_symptoms = column_transformer.fit_transform(symptoms) # 训练模型 classify = tree.DecisionTreeClassifier() classify.fit(encoded_symptoms, labels)
关键注意点
- 特征必须数值化:所有Sklearn的监督学习模型都要求输入特征是数值型,字符串、文本这类非数值数据必须先转换。
- 标签格式要正确:不要用嵌套列表存标签,要保证是一维的数组或列表,形状为
(样本数量,)。 - 编码方式选合适的:无序分类特征用独热编码,有序分类(比如轻度/中度/重度)用标签编码。
内容的提问来源于stack exchange,提问作者Sahan
相关产品推荐
相关产品推荐

