Python中如何将CSV文件转为符合DecisionTreeClassifier要求的特征变量X
分类任务代码修正方案
现有代码问题清单
- 生成的TestFile.csv每行包裹了方括号,pandas读取时会将整行识别为1列字符串,无法匹配14个特征的输入要求
- 特征数据中存在NaN缺失值,sklearn自带的DecisionTreeClassifier不支持直接训练含缺失值的数据集
- 未处理G1.csv的表头行(如果存在的话),会导致标签Y和特征X的样本顺序、数量不匹配
- 标签Y为字符串格式,部分场景下无法被分类器直接识别,建议转换为数值类型
- 预测输入P未做格式对齐,新版本sklearn会触发格式警告
最优实现方案(无需额外生成TestFile.csv)
直接用pandas对原始G1.csv切片,省去中间写文件的冗余步骤,代码更简洁不易出错:
import pandas as pd import numpy as np from sklearn.tree import DecisionTreeClassifier from sklearn.impute import SimpleImputer # 读取原始文件,header=0代表第一行是表头,若文件没有表头就填header=None df = pd.read_csv('G1.csv', header=0) # 直接提取标签Y(第一列)和特征X(原文件第4到17列,pandas索引从0开始,对应列索引3到16) Y = df.iloc[:, 0].values X_raw = df.iloc[:, 3:17].values # 处理缺失值,这里用均值填充,也可替换为'median'(中位数)、'constant'(固定值)等策略 imputer = SimpleImputer(strategy='mean') X = imputer.fit_transform(X_raw) # 训练模型 clf = DecisionTreeClassifier() clf.fit(X, Y) # 待预测样本处理,同步做缺失值填充 P = [[2.94008,3.03106,-9.70609,6.09667,6.51713,0.0900986,np.nan,np.nan,np.nan,0.792683,-1.70732,-1.82927,1008.96,31.54]] P_processed = imputer.transform(P) # 输出预测结果 print(f"\n1) 使用决策树的预测结果为 {str(clf.predict(P_processed)[0])}")
*注:如果缺失样本占比很低,也可以直接删除含缺失值的样本,无需填充,注意删除特征行时要同步删除对应位置的标签,保证样本对齐。
如果你一定要用已生成的TestFile.csv
可以用以下代码读取并处理你现有的带方括号的TestFile.csv:
import ast import numpy as np # 逐行解析带方括号的TestFile.csv X_list = [] with open('TestFile.csv', 'r') as f: for line in f: # 去掉换行符后安全解析字符串为数值列表 row = ast.literal_eval(line.strip()) X_list.append(row) X_raw = np.array(X_list, dtype=np.float64) # 后续缺失值处理、训练步骤和上述最优方案的对应部分一致
内容的提问来源于stack exchange,提问作者raideR49
相关产品推荐
相关产品推荐

