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

使用scikit-learn和pandas实现决策树时遇ValueError报错求助

解决决策树训练中的ValueError: could not convert string to float问题

这个错误主要来自两个核心问题,咱们一步步拆解解决:

问题1:引入了无关特征CustomerID

CustomerID只是用户的唯一标识符,和你的分类目标Class没有任何逻辑关联,把它放进特征列表里不仅对模型训练毫无帮助,还可能因为数据类型识别问题(比如CSV读取时被识别为字符串)触发转换错误——本质上它根本不该作为特征参与训练。

问题2:类别型字符串特征未做数值编码

scikit-learn的所有模型(包括决策树)只能处理数值型数据,但你的特征Gender、Car Type、Shirt Size都是字符串格式的类别特征,直接传入模型就会触发"字符串转浮点数失败"的错误。


修正后的完整代码

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn import metrics

col_names=['CustomerID','Gender','Car Type', 'Shirt Size','Class']
# 用原始字符串处理Windows路径,避免转义问题;同时跳过原数据集的表头行
pima=pd.read_csv(r"F:\Current semster courses\Machine Learning\ML_A1_Fall2019\Q2_dataset.csv",header=None, names=col_names, skiprows=1)

# 1. 移除无关的CustomerID,只保留有意义的类别特征
feature_cols=['Gender','Car Type', 'Shirt Size']
X=pima[feature_cols]
y=pima.Class

# 2. 对类别型特征做独热编码,转换成模型可识别的数值型数据
X_encoded = pd.get_dummies(X, columns=feature_cols)

# 3. 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_encoded, y, test_size=0.3, random_state=1)

# 4. 训练并评估决策树模型
clf = DecisionTreeClassifier()
clf = clf.fit(X_train,y_train)
y_pred = clf.predict(X_test)
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))

关键改动说明

  • 移除无关特征:从feature_cols中删掉CustomerID,消除无效特征带来的干扰。
  • 修正CSV读取逻辑:你的数据集本身带表头行,代码里设置了header=None,所以需要用skiprows=1跳过原表头,避免把表头当作数据行读取。
  • 独热编码转换:用pd.get_dummies()把每个类别特征的不同取值转换成二进制列(比如Gender会拆成Gender_F和Gender_M),让模型能处理数值型输入。
  • 路径转义处理:给文件路径加上r前缀变成原始字符串,避免Windows路径中的反斜杠被识别为转义字符。

这样修改后,模型就能正常完成训练和预测了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:17:13