Python使用sklearn拟合两个列表报字符串转浮点错误如何解决
报错原因
could not convert string to float报错由三处不符合sklearn输入规则的问题导致:
- 模型拟合的特征输入
X必须是二维结构(形状为[样本数量, 特征数量]),当前代码里的x是一维列表,结构不符合要求。 - 特征集合里全是字符串格式内容:
'BMW'是类别文本,'20000miles'是带单位的文本、'2010'是字符串格式的数字,sklearn的决策树模型无法直接解析非数值型输入,必须先转换为数值。 - 标签输入
y和特征的样本量不匹配:当前x如果按单样本算有3个特征,y只有1个标签值,且标签也是字符串格式,同时不满足输入要求。
修复方法
- 先调整数据集为合法结构:每条样本对应一个标签,特征按「样本为行、特征为列」组织成二维结构,同时把带单位的数值、年份这类内容先处理成纯数字,去掉文本单位。
参考合法的数据集结构示例:
from sklearn import tree from sklearn.preprocessing import OneHotEncoder # 3个二手车样本,每个样本3个特征:[品牌, 里程(英里), 出厂年份] X = [ ['BMW', 20000, 2010], ['Audi', 50000, 2015], ['Toyota', 80000, 2012] ] # 对应每个样本的二手车价格,长度和样本数完全一致 y = [12000, 18000, 9000]
- 对品牌这类类别型文本特征做编码转换,把文本转成模型可识别的数值:
encoder = OneHotEncoder(sparse_output=False) X_encoded = encoder.fit_transform(X)
- 根据任务类型选对模型再拟合:如果是预测价格这类连续数值,要使用回归器
DecisionTreeRegressor,DecisionTreeClassifier仅适用于预测离散分类标签:
# 价格预测是回归任务,用决策树回归器 clf = tree.DecisionTreeRegressor() clf.fit(X_encoded, y)
补充:如果只有单条样本是无法完成模型拟合的,模型训练需要足够多的、特征-标签一一对应的样本数据。
内容的提问来源于stack exchange,提问作者Ali Zabihi
相关产品推荐
相关产品推荐

