Python 创建具有200k唯一值的虚拟变量

Python 创建具有200k唯一值的虚拟变量,python,jupyter-notebook,data-science,Python,Jupyter Notebook,Data Science,我试图为分类数据集创建一个虚拟变量,但问题是python没有兼容的ram来运行代码,因为唯一值太大,无法创建虚拟变量。这是一个具有500k行和200k唯一值的大型数据集。是否可以创建一个具有200k唯一值的虚拟变量?执行此操作确实需要大量RAM 就我能想到的编程解决方案而言: 维度缩减:如果你的200K个类别与那些可以缩减的类别之间存在某种关系(例如,这些类别的层次结构级别,因此你可以将类别分组并按级别执行分析,例如lvl1=10个类别,lvl2=100等)我可以问一下:您有哪些类型的数据包含

我试图为分类数据集创建一个虚拟变量,但问题是python没有兼容的ram来运行代码,因为唯一值太大,无法创建虚拟变量。这是一个具有500k行和200k唯一值的大型数据集。是否可以创建一个具有200k唯一值的虚拟变量?

执行此操作确实需要大量RAM

就我能想到的编程解决方案而言

  • 维度缩减:如果你的200K个类别与那些可以缩减的类别之间存在某种关系(例如,这些类别的层次结构级别,因此你可以将类别分组并按级别执行分析,例如lvl1=10个类别,lvl2=100等)<代码>我可以问一下:您有哪些类型的数据包含20万个唯一类别值?
  • 拆分数据集并合并结果:我使用numpy处理了以下内容。最终会得到更小的子集,每个子集为200K个类别编码(即使某些类别不在子集中)
    然后您需要决定如何进一步处理这些子集
不知怎的,导入语句破坏了格式,所以我在这里将它们分开:

import numpy as np
import random
代码的其余部分:

def np_one_hot_encode(n_categories: int, arr: np.array):
    # Performs one-hot encoding of arr based on n_categories
    # Allows encoding smaller chuncks of a bigger array
    # even if the chunks do not contain 1 occurrence of each category
    # while still producing n_categories columns for each chunks
    result = np.zeros((arr.size, n_categories))
    result[np.arange(arr.size), arr] = 1
    return result


# Testing our encoding function
# even if our input array doesn't contain all categories
# the output does cater for all categories
encoded = np_one_hot_encode(3, np.array([1, 0]))
print('test np_one_hot_encode\n', encoded)
assert np.array_equal(encoded, np.array([[0, 1, 0], [1, 0, 0]]))

# Generating 500K rows with 200K unique categories present at least once
total = int(5e5)
nunique = int(2e5)
uniques = list(range(0, nunique))
random.shuffle(uniques)
values = uniques+(uniques*2)[:total-nunique]
print('Rows count', len(values))
print('Uniques count', len(list(set(values))))

# Produces subsets of the data in (~500K/50 x nuniques) shape:
n_chunks = 50
for i, chunk in enumerate(np.array_split(values, n_chunks)):
    print('chunk', i, 'shape', chunk.shape)
    encoded = np_one_hot_encode(nunique, chunk)
    print('encoded', encoded.shape)
以及输出:

test np_one_hot_encode
[[0. 1. 0.]
[1. 0. 0.]]
Rows count 500000
Uniques count 200000
chunk 0 shape (10000,)
encoded (10000, 200000)
chunk 1 shape (10000,)
encoded (10000, 200000)
  • 分布式处理使用Dask、Spark等工具。。。所以您可以处理子集的处理

  • 数据库:我能想到的另一个解决方案是将您的模型规范化为数据库(关系型或“大”平面数据模型),您可以利用索引仅过滤和处理部分数据(仅某些行和某些类别),从而允许您在内存中处理较小的输出


但最终没有什么神奇的,如果你最终想要将一个N-M矩阵加载到内存中,N=500K,M=200K,它将占用需要占用的RAM,没有办法解决这个问题,因此最有可能获得的收益是降维或完全不同的数据处理方法(例如分布式计算).

谢谢你的回答,我认为这真的很有帮助。对于那些200k的唯一值是字符串类型的数据。不客气<代码>数据的字符串类型
:您能再详细说明一下吗?200k唯一值是公司名称和职务