将混合数据类型的 Pandas Dataframe 转换为 LibSVM 格式

数据挖掘 scikit-学习 熊猫 libsvm
2022-02-23 17:11:43

我有一个大约百万行和 3 列的熊猫数据框。这些列有 3 种不同的数据类型。NumberOfFollowers 是数值数据类型,UserName 是分类数据类型,Embeddings 是分类集类型。

df:

Index  NumberOfFollowers                  UserName                    Embeddings        Target Variable

0        15                                name1                      [0.5 0.3 0.2]       0
1        4                                 name2                      [0.4 0.2 0.4]       1
2        8                                 name3                      [0.5 0.5 0.0]       0
3        10                                name1                      [0.1 0.0 0.9]       0
...      ...                               ....                       ...                 ..

我想将此熊猫数据框转换为 LibSVM 输入格式。

期望的输出:

0 0:15 4:1 1:0.5 2:0.3 3:0.2
1 0:4 5:1 1:0.4 2:0.2 3:0.4
0 0:8 6:1 1:0.5 2:0.5 3:0.0
0 0:10 4:1 1:0.1 2:0.0 3:0.9
...

我发现的一种解决方案是使用:

https://scikit-learn.org/stable/modules/generated/sklearn.datasets.dump_svmlight_file.html

它将输入作为 NumPy 数组或稀疏矩阵。

UserName 具有一百万个唯一值,因此在此列上调用 pd.get_dummies 并将其存储为密集的 NumPy 数组不是解决方案,并且不适合内存。

所以,我知道它可以使用稀疏矩阵来完成,但是,我不知道如何将上述混合数据类型的数据转换为稀疏矩阵,然后使用 sklearn.datasets.dump_svmlight_file.html。

实际上,我有很多混合数据类型的列,我需要将它们转换为 libSVM 格式。但是,所有列都属于上述三种类型之一。

提前感谢您对如何解决上述问题的任何想法。

1个回答

正如您所提到的,您可以使用 sklearn 的功能,我没有看到使用它的问题(也许我遗漏了一些东西)

import pandas as pd
from sklearn.datasets import dump_svmlight_file

def df_to_libsvm(df: pd.DataFrame):
    x = df.drop('label', axis=1)
    y = df['label']
    dump_svmlight_file(X=x, y=y, f='libsvm.dat', zero_based=True)

对于具有 10^6 个唯一类别的分类特征,您可以将其简单嵌入到二进制向量中。一种方法是将每个用户名映射到一个唯一的整数。然后您可以将数字转换为二进制表示;这样,您将拥有一个大小约为 20 (2^20=1,048,576) 的简单嵌入,即此特征由 20 个二进制特征表示。

当然,如果用户名都是唯一的,那么它们可能不应该是一个特征(与 id 相同)。