处理具有不同数量功能的数据

时间:2016-09-22 07:15:22

标签: python pandas machine-learning scikit-learn

我有这个分类/回归任务,但最有趣的是每条记录的功能数量不同。功能已经被提取并且已经准备好,因此数据的上下文是未知的,并且特征的值从-10到10波动。有记录具有超过200个特征,同样存在具有低于20的特征量的记录

数据框df有两列:IDATTRIBUTES,输出如下:

      ID                                          ATTRIBUTES                
   0  1  1.1 2.1 3.3 4.4 5.5 6.6 ... 99.9  100.0 101.1 102.2
   1  2  1.1 2.1 3.3 4.4 5.5 6.6 ... 45.0  46.0  47.0  49.0 
   2  3  1.1 2.1 3.3 4.4 5.5 6.6 ... 9.0   10.0  11.0  12.0
   3  4  1.1 2.1 3.3 4.4 5.5 6.6 ... 70.0  71.0  72.0  73.0
   4  5  1.1 2.1 3.3 4.4 5.5 6.6 ... 131.0 132.0 134.0 135.0

我已将列ATTRIBUTES拆分为不同的列:

df['ATTRIBUTES'].str.split(' ', expand=True).astype(float)

现在df看起来像这样:

       0   1    2   3   4    5    6    7    8   9  ...   131   132   133   134   135 
       0  1.1  2.1 3.3 4.4. 5.5. 6.6. 7.7  8.8 9.9 ...   NaN   NaN   NaN   NaN   NaN 
       1  1.1  2.1 3.3 4.4. 5.5. 6.6. 7.7  8.8 9.9 ...   NaN   NaN   NaN   NaN   NaN
       2  1.1  2.1 3.3 4.4. 5.5. 6.6. 7.7  8.8 9.9 ...   NaN   NaN   NaN   NaN   NaN
       3  1.1  2.1 3.3 4.4. 5.5. 6.6. 7.7  8.8 9.9 ...   NaN   NaN   NaN   NaN   NaN
       4  1.1  2.1 3.3 4.4. 5.5. 6.6. 7.7  8.8 9.9 ...  131.0 132.0 133.0 134.0 135.0 

假设record1有102个功能,rec2 - 49,rec3-12,rec4-73,rec5 - 135.在拆分操作后,记录rec1, rec2, rec3, rec4填充了NaN值以填充数据帧。< / p>

经过一些谷歌搜索后,我想出了以下想法:

  1. 首先想到的是使用有意义的功能更改NaNImputer;
  2. 丢弃少于20(40,60等)功能的记录。
  3. 对于分类,我选择了RandomForest

    基线表现约为0.4117,同时验证了10%的训练集(使用train_test_split)。

    尽管我尝试了一切:

    1. Feature scaling - standardisation
    2. 通过主成分分析(PCA)降低维数
    3. 使用ExtraTreesClassifier
    4. 选择基于树的特征

      基线表现并未高于0.4 ...... 所以我的问题是 - 如何继续缺少特定记录的功能?

1 个答案:

答案 0 :(得分:0)

时,数据插补可能有效
  • 缺少属性的数据点代表数据点的一小部分
  • 每个数据点缺少的属性数量不大。

您得到的结果不佳 - 至少就数据完整性而言 - 是因为您实际上是通过插补来扭曲数据中的数据差异,实际上您是伪装任何潜在的特定于问题的元信息隐藏在原始数据中。您在分类问题上的工作结果非常依赖于数据的质量和模型的“正确性”。

我会开始尝试几种不同的方法来处理这类数据问题。无论如何,这些并不是唯一可行的方法,哪种方式最适合您,取决于您的问题和数据的具体情况。

  1. 查看是否可以聚合某些“缺失”或“额外”属性。可能是每个数据点都有固定数量的功能,然后是“可选”功能,可以通过某种方式进行聚合吗?

  2. 看看您是否可以按照以下方式细分数据 - 在每个细分中 - 您拥有的数据点数量相同。然后尝试将分类器放在这些段中。

  3. 检查要素数量和数据点类别之间是否存在某种模式。

  4. 删除数据集中包含NaN值的所有功能。

  5. 我希望这有点帮助!