【问题标题】:Can conversion from a pandas DataFrame to a raw numpy array improve ML performance?从 pandas DataFrame 转换为原始 numpy 数组可以提高 ML 性能吗?
【发布时间】:2016-11-01 04:39:48
【问题描述】:

熊猫DataFrame 有固定整数数据类型的限制(int64)。 NumPy 数组没有这个限制;例如,我们可以使用np.int8(我们也有不同的浮点大小可用)。(不再存在限制。)

如果我们首先将 DataFrame 转换为具有减小数据类型的原始 NumPy 数组(例如从 np.float64 到 np.float16),scikit-learn 的性能一般会提高吗? 如果是这样,这种可能的性能提升是否只有在内存有限时才会发挥作用?

相对于计算量和复杂性,看起来非常高的浮点精度通常对 ML 并不重要。

如果需要更多上下文,我正在考虑将像 RandomForestRegressor 这样的集成学习器应用于大型数据集(4-16GB,数千万条记录,包含约 10-50 个特征)。不过,我对一般情况最感兴趣。

【问题讨论】:

    标签: python performance numpy pandas scikit-learn


    【解决方案1】:

    RandomForestRegressor 的文档指出,输入样本将在内部转换为 dtype=np.float32。


    以下是原始答案,它解决了在 Pandas 中使用自定义 numpy 类型的问题(问题的划线部分)

    您可以在 Pandas 中使用numpy dtypes。这是导入具有指定列 dtypes 的 .csv 文件的示例(来自我的脚本):

    df = pd.read_csv(filename, usecols=[0, 4, 5, 10],
                     dtype={0: np.uint8,
                            4: np.uint32,
                            5: np.uint16,
                            10: np.float16})
    

    您可以使用 Series.astype() 更改现有 Series 或现有 DataFrame 中列的 dtype:

    s = pd.Series(...)
    s = s.astype(np.float16)
    
    df = pd.DataFrame(...)
    df['col1'] = df['col1'].astype(np.float16)
    

    如果要更改 DataFrame 中多个列的 dtypes,甚至更改所有列的 dtype,请使用 DataFrame.astype():

    df = pd.DataFrame(...)
    df[['col1', 'col2']] = df[['col1', 'col2']].astype(np.float16)
    

    【讨论】:

    • 我想我看到了 pandas 中混合类型的一些限制(即使只是在不同的系列中混合)。我看看能不能找到具体的。
    • 好的,我认为这个限制是特定于读取数据的;即read_csv。我会试一试,看看它是否有效。假设确实如此,您是否期望性能提升?
    • 什么限制?您可以将dtype 参数传递给read_csv,如上所示。至于性能提升,我不知道:分析您的代码。您肯定会看到内存使用量减少,这对于您要处理的大型数据集可能很重要。
    • 我发现 this example 概述了我的问题,显示了降低精度的尝试 (int16) 导致 int64。也许这个限制特定于read_csv,并通过astype 克服。我会尽快报告回来。此外,我仍然很好奇一般而言是否通过不太精确的数据类型来提高性能。
    • 这个问题已经被这个拉取请求解决了:github.com/pydata/pandas/pull/2708(所以从 v0.11 开始)。
    猜你喜欢
    • 2019-08-04
    • 2020-02-10
    • 1970-01-01
    • 2021-12-16
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    相关资源
    最近更新 更多