训练具有每个记录的不同特征的kNN算法

时间:2018-01-18 13:38:59

标签: algorithm machine-learning knn

我有一个数据集,其中每条记录可以包含不同数量的功能。 总共有56个功能,每个记录可以包含1到56个此功能的记录。

每个特征都像一个标志,所以或存在于数据集中,如果存在,则存在另一个值double,它将值放在其中。

数据集的一个例子就是这个 enter image description here

我知道是否有可能使用不同的功能为每条记录训练我的kNN算法,所以例如一条记录有3个特征加上标签,另一条记录有4个特征加上标签等等。

我正在尝试用Python实现它,但我不知道我该怎么做。

2 个答案:

答案 0 :(得分:1)

是的,这绝对是可能的。你需要考虑的一件事是距离测量。

用于kNN分类器的默认距离通常是欧几里德距离。但是,欧几里德距离需要具有相同数量的特征(维度)的记录(向量)。

您使用的距离测量,在很大程度上取决于您认为应该使记录相似的内容。

如果两个记录的特征之间存在对应关系,那么您知道记录x的特征i描述了与记录y中的特征i相同的特征,您可以调整欧几里德距离。例如,您可以忽略缺失的维度(如果一个记录中缺少某个要素,则不会增加距离)或惩罚缺少的维度(这样,只要记录中缺少某个要素,就会添加一定的惩罚值)

如果两个记录的特征之间没有对应关系,则必须查看设定距离,例如最小匹配距离或豪斯多夫距离。

答案 1 :(得分:0)

数据集中的每个实例都应由相同数量的要素表示。如果您有具有可变数量的要素的数据(例如,每个数据点是x和y的向量,其中每个实例具有不同的点数),那么您应该将这些点视为缺失值。

因此,您需要处理缺失的值。例如:

  1. 将缺失值替换为每列的平均值。
  2. 选择能够处理缺失值的算法,例如决策树。
  3. 使用能够预测缺失值的模型。
  4. 修改

    首先,您需要将数据转换为更好的格式。目前,每个功能都由两列表示,这不是一个非常好的技术。因此,我建议重新构建数据如下:

    +------+------------+-----------+----------+--------+
    | ID   |  Feature1  |  Feature2 | Feature3 | Label  |
    +-------------------+-----------+----------+--------+
    |  1   |    15.12   |   ?       |   56.65  |  True  |
    |  2   |    ?       |   23.6    |   ?      |  True  |
    |  3   |    ?       |   12.3    |   ?      |  False |
    +-------------------+-----------+----------+--------+
    

    然后你可以用?替换缺失值(用0表示)(这取决于每个特征的"含义")或者使用我和之前已经提到过。