You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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)

关键注意点

  1. 特征必须数值化:所有Sklearn的监督学习模型都要求输入特征是数值型,字符串、文本这类非数值数据必须先转换。
  2. 标签格式要正确:不要用嵌套列表存标签,要保证是一维的数组或列表,形状为(样本数量,)。
  3. 编码方式选合适的:无序分类特征用独热编码,有序分类(比如轻度/中度/重度)用标签编码。

内容的提问来源于stack exchange,提问作者Sahan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:13:40