numpy delete 正在将浮点值转换为字符串

numpy delete is converting float values into string

我正在 python 中为 class 编写连续值和分类值的决策树算法,我在选择最佳属性后更新数据库时遇到问题。

我编写了名为 delete_rows 和 delete_attribute 的函数,以在每次迭代时分别取消部分示例和一列。 (算法是根据Russel-Norving教材上找到的伪代码,应该是ID3版本)

new_examples_list = delete_rows(examples_list, best_attr, v)
new_examples_list = delete_attribute(new_examples_list, best_attr)

我不太了解numpy,但是在网上搜索后我是这样写的:

def delete_attribute(examples_list, attribute):
    examples_list = numpy.delete(examples_list, attribute, axis=1)
    return examples_list

问题是,当我调用它时,examples_list(包含数据库所有数据的矩阵)中的所有数据都转换为字符串,即使对于最初为 float 的属性也是如此。由于我必须对分类值或数值使用不同的函数,并且我使用 is_instance 函数检查类型,这会导致树的以下步骤出现问题。

我可以通过调整 delete_attribute 功能来解决这个问题吗?或者这可能是一个更大的问题? 我希望我解释清楚了,我对 python 还是个新手,这是我第一次提问。

编辑:我添加了一个示例:

说我的原始数据是这样的(从一个csv读取)

titles = [A, B, C, D, Goal]

data = [[20,15,21,17,'No']
        [40,16,33,8,'Yes']
        [44,40,38,18,'No']
        [18,16,21,2,'Yes']
        [7,12,8,40,'Yes']]

算法发现 A 是最好的属性和将数据划分为 19 的阈值。假设我们希望看到 A > 19 的值的拆分数据 delete_rows 方法只是保留符合此条件的示例,我得到

data = [[20.0, 15.0, 21.0, 17.0, 'No'] 
       [40.0, 16.0, 33.0, 8.0, 'Yes']
       [44.0, 40.0, 38.0, 18.0, 'No']]

当我尝试如前所示使用 delete_attribute 删除 A 的列时,我得到了这个:

data = [['15.0' '21.0' '17.0' 'No']
       ['16.0' '33.0' '8.0' 'Yes']
       ['40.0' '38.0' '18.0' 'No']]

我假设由于原始数据同时具有数值和字符串值,因此它会将任何内容转换为字符串?我只想将结果的最后一列保留为字符串。谢谢。

在此示例中,所有数据都是数字,但当然我还必须考虑其他具有混合值的数据库

看来您需要将数组数据类型显式定义为对象

import numpy as np
titles = ['A', 'B', 'C', 'D', 'Goal']

data = np.array([[20,15,21,17,'No'],
        [40,16,33,8,'Yes'],
        [44,40,38,18,'No'],
        [18,16,21,2,'Yes'],
        [7,12,8,40,'Yes']], dtype='object')

def delete_attribute(examples_list, attribute):
    examples_list = numpy.delete(examples_list, attribute, axis=1)
    return examples_list

np.delete(data,titles.index('A'),1)

输出

array([[15, 21, 17, 'No'],
       [16, 33, 8, 'Yes'],
       [40, 38, 18, 'No'],
       [16, 21, 2, 'Yes'],
       [12, 8, 40, 'Yes']], dtype=object)