分类和实值参数混合的决策树

数据挖掘 大数据 scikit-学习 决策树 分类数据
2022-02-19 19:12:05

我有大约 3,000,000 个样本,每个样本由一个大小约为 20 的列表描述。此列表中的某些元素是分类的,例如城市名称、星期几等(某些类别有大量选项,例如一类是在我的数据集中有超过 700,000 个独特元素的 url!)。还有一些元素具有实际值,例如一天中的时间。

我的数据被标记(2 个类别),我需要为测试数据训练一个分类器。我倾向于决策树或随机森林,因为它们似乎是此类问题的不错选择。

现在我的问题是:

1)如何预处理分类数据?one-hot-encoding 似乎是正确的选择,但考虑到我的一些类别有大量可能的值,一个热编码器会产生很长的单词!我对么?

2) 如何组合不同类别的数据?例如,来自“城市”类别的数据和来自“网址”的数据,因为它们的长度不同。我只是将它们连接起来吗?

3) 如何将分类数据与实值数据结合起来,例如“城市名称”和“一天中的时间”,以生成一个矩阵,然后可以将其传递给决策树分类器?

4)在将数据传递给分类器之前我必须做任何特殊的规范化等吗?

我计划使用 python 和 Scikit 来完成这项任务。

非常感谢您的帮助。

1个回答

不幸的是 scikit-learn 不能很好地处理分类特征——它们必须被编码。One-hot-encoding 很棒,可以很容易地在 sklearn 中实现。因此,如果您有一个特征列数组 X 和一个类标签向量 y

from sklearn import OneHotEncoder
ohe = OneHotEncoder(categorical_features=[0])
X = ohe.fit_transform(X).toarray()

将为您执行编码(categorical_features 属性给出您要编码的特征的索引)。更重要的是,如果您的功能有多个级别,那么单热编码可能会给您留下一个稀疏且低效的 X 数组。在这种情况下,进行计数变换可能是有益的,可能会用相应的对数优势比替换每个级别。

计数变换

上面的链接对它进行了更彻底的解释,但是,用外行的话来说,对于每个分类特征,您:

  1. 计算一个级别(类别)属于 class0 或 class1 的次数
  2. 每个计数加 0.5(当一个级别严格属于一个类时,这会处理实例)
  3. 计算它属于任一类的概率。
  4. 计算优势比的对数
  5. 用相应的对数优势比替换每个级别

通过这种方式,您可以获得表示特征多个级别中每个级别的数值,而无需为每个级别创建虚拟变量。尽管如此,20 个变量还是很多,您可能希望使用 PCA 进行数据压缩和降维。

一般来说,基于树的方法的一大优点是它们不需要标准化。话虽如此,从数据科学的角度来看,我会训练几种不同的模型(基于树的方法、支持向量机、逻辑回归、knn 等),然后看看哪一个产生最好的结果。除了 CART 之外的所有方法都受益于缩放,所以请尝试

from sklearn.preprocessing import StandardScaler
stdsc = StandardScaler()
X_train_std = stdsc.fit_transform(X_train)
X_test_std = stdsc.transform(X_test)

我希望这能回答你的大部分问题。我不确定你为什么要连接两个非常不同的变量,比如城市和网址,但是如果你对它们进行编码或进行计数转换,你的 X 数组应该没问题,你可以将它们分开。此外,您不必担心给定变量的长度 - python 是面向对象的(如果您收到抱怨“长度”的错误消息,您可能只是混淆了您的索引)。