无法将scikit-learn的DecisionTreeClassifier输出保存为CSV

2 投票
1 回答
1105 浏览
提问于 2025-04-18 12:33

我有一段代码,目的是用来处理一些训练和测试数据,以便使用scikit-learn的决策树分类器(DecisionTreeClassifier)。这段代码运行得很好,直到我想把.predict函数的输出保存到一个CSV文件里为止。目前的代码是:

import numpy as np
import pandas as pd
from sklearn import tree

with open('data/training.csv', 'r') as f:

    df = pd.read_csv(f, index_col=None)

df['Num_Labels'] = df.Label.map(lambda x: '-1' if x == 's' else '1')  # Convert labels to '0' or '1'.

Train_values = df.iloc[:, 1:31].values
Train_labels = df.iloc[:, 33:34].values
# print Train_values.values
# print type(Train_values.values)

with open('data/test.csv', 'r') as f2:

    df2 = pd.read_csv(f2, index_col=None)

Test_values = df2.iloc[:, 1:31].values

# #----------------------------------------------------------------------------------------------

X = Train_values
Y = Train_labels

clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, Y)

Pred = clf.predict(Test_values)

#print Pred
#print type(Pred[:1])
np.savetxt('Output.csv', Pred, delimiter =' ')

而终端输出是这样的:

/usr/bin/python2.7 /home/amit/PycharmProjects/HB/Read.py
Traceback (most recent call last):
  File "/home/amit/PycharmProjects/HB/Read.py", line 38, in <module>
    np.savetxt('Output.csv', Pred, delimiter =' ')
  File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 1073, in savetxt
    fh.write(asbytes(format % tuple(row) + newline))
TypeError: float argument required, not str
['1' '-1' '-1' ..., '1' '1' '1']
<type 'numpy.ndarray'>

Process finished with exit code 1

1 个回答

2

这里可能有点问题出在 Pred 上。npyio.py 文件里的 savetxt 代码其实挺简单的:

for row in X:
    fh.write(asbytes(format % tuple(row) + newline))

这段代码是逐行读取 X(在这个例子中就是 Pred)。格式字符串 format 在这里是 %f %f %f,这意味着每一行有三个占位符,和这一行的元素数量(也就是列数)相等。错误信息提示在 row 这个向量里有其他类型的值,而不是浮点数。此外,错误信息看起来像是有短文本字符串,而不是浮点数。

我猜 Pred 是一个 ndarray(多维数组)。如果不是,那就有点奇怪了。不过,它可能是一个字符串数组,而不是浮点数或其他数字的数组!

你可以通过下面的方式来进一步检查:

print Pred.dtype

如果结果像 S3 这样,那你就得到了一个字符串数组。在这种情况下,我建议你检查一下 XY 的数据类型是否正确。如果它们不是数字,情况可能会变得有点复杂。

撰写回答