使用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
相关产品推荐
相关产品推荐

