如何处理具有大量特征的数据集?

机器算法验证 机器学习 Python 随机森林 多类
2022-03-25 13:14:39

我是机器学习的新手,所以如果答案很明显,我提前道歉。

我有一个包含地址功能的数据集。我希望使用一种热编码为数据集中出现的每条街道创建一个特征。所以如果我的数据集看起来像:

Miles| Address
4    | 111 First St
2    | 456 Grenada Ave
9    | 789 Grenada Ave

它会变成:

Miles| Address          | First_St | Grenada_Ave
4    | 111 First St     | 1        | 0
2    | 456 Grenada Ave  | 0        | 1
9    | 789 Grenada Ave  | 0        | 1

这样做会将功能数量增加到 1500 多个,并将训练和测试文件从大约 90 MB 增加到超过 5 GB。

我希望将 RandomForest 应用于这些新数据集,但是当我调用forest.fit(使用 Python/sklearn)时,内存使用量激增至 60gb,然后 Python 进程终止。

几个问题:

创建这么多功能是否被认为是不好的做法?如果不是 - 如何使用这种大小的数据进行建模?

2个回答

在这种情况下,一种热编码可能是最通用的方法。但是,请注意,许多功能将为零。如果你说,1000 条不同的街道,999 个特征将为 0。

要处理这种情况,您可能应该使用矩阵的稀疏表示,如果您还没有这样做的话。

使用:

class sklearn.preprocessing.OneHotEncoder(n_values='auto',
categorical_features='all', dtype=<type 'float'>, 
sparse=True, handle_unknown='error')

在一次热编码之后,您可以对数据进行稀疏表示。并确保:

sklearn.ensemble.RandomForestClassifier

处理稀疏表示(就是这种情况,更多信息在这里http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

请注意,在进行一次热编码时,可能会出现很多列大部分时间为 0 的情况(如果一条街道只出现一次或两次)。放弃这些稀缺的观察通常会更好(就模型预测的性能而言)。

在您的情况下,一种热编码可能不是唯一的解决方案。 您是在尝试根据街道还是根据位置来预测某些东西(例如,为了示例的房屋价格)?您还可以将地址转换为它们的 GPS 坐标(尽管可能需要一些努力)并将它们用作连续预测器。

同意@RUser4512 - 街道真的是该功能的最佳代表吗?邮政编码、人口普查区等其他内容是否更适合您要解决的问题?

如果街道是合适的表示,那么 SVM 可能是一个好方法。它适用于稀疏数据,是谷歌在他们的Sofia包中采用的方法。