我正在从头开始编写一个决策树算法,现在我正在尝试将数据分割成组,其中每个组包含的值大于或等于或小于NumPy数组中包含连续DataFrame列值的每个值,并获得这些拆分的目标的平均值。到目前为止我的代码是:
for i in range(len(columns)):
col = columns[i]
# cont - list of continous columns in my DataFrame
if col in cont:
values = xs[col].values
targets = y.values
for j in range(len(values)):
value = values[j]
greater_idx = np.where(values >= value)[0]
less_idx = np.where(values < value)[0]
targets_greater = targets[greater_idx].sum()
targets_less = targets[less_idx] .sum()
print(targets_greater/(j+1))
print(targets_less /(j+1))xs DataFrame的长度接近400 K,所以循环非常慢,每次都会杀死我的木星笔记本内核。我知道应该有一个方法完全摆脱这个循环,但我不知道如何做到这一点。
发布于 2021-01-29 09:31:58
与其采用矢量化的方法进行比较,不如在算法上有很大的改进空间:
使用(sorted_idxs).
xs[col].values的排序索引,xs[col].values.
target_less[0] (0)中的每个值是xs[col].values中最低元素的target_less-value,可以使用unsort_idx = np.argsort(sorted_idxs)和target_less[unsort_idx].现在,对于数组中的所有值都有了所有的target_less-values (当然,target_greater很容易通过targets.sum() - target_less获得)。
编辑:
下面是与建议相一致的代码:
import numpy as np
import pandas as pd
xs = pd.DataFrame(np.random.random(10000))
y = pd.Series(np.random.randint(0, 2, size=10000))
sorted_idxs = np.argsort(xs[0].values)
sorted_values = xs[0].values[sorted_idxs]
sorted_targets = y.values[sorted_idxs]
sorted_targets_less = np.insert(np.cumsum(sorted_targets), 0, 0)[:-1]
unsorted_idxs = np.argsort(sorted_idxs)
targets_less = sorted_targets_less[unsorted_idxs]
for i, target_less_value in enumerate(targets_less):
assert target_less_value == y.values[np.where(xs.values < xs.values[i])[0]].sum()一个警告词:上面假设在xs.values中有一组严格不同的值。如果有重复值,则需要调整进行累积和的部分。
https://stackoverflow.com/questions/65951110
复制相似问题