Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用NumPy加速自定义DecisionTreeClassifier中的方法“fit”?_Python_Numpy_Machine Learning_Scikit Learn - Fatal编程技术网

Python 如何使用NumPy加速自定义DecisionTreeClassifier中的方法“fit”?

Python 如何使用NumPy加速自定义DecisionTreeClassifier中的方法“fit”?,python,numpy,machine-learning,scikit-learn,Python,Numpy,Machine Learning,Scikit Learn,我正在做关于实现决策树分类器的家庭作业,问题是我的算法有效,它产生的结果在准确性上并不比sklearn库中的树差,但它的工作时间要长得多。我在数据集wine和mine上都检查了300毫秒,而sklearn的工作时间为1.5毫秒。请告诉我,我应该如何只使用numpy库重写下面的代码,而不连接GPU或类似的东西 def __info(self, x, y, criterion): """ Считаем меру неопределённости посредством кр

我正在做关于实现决策树分类器的家庭作业,问题是我的算法有效,它产生的结果在准确性上并不比sklearn库中的树差,但它的工作时间要长得多。我在数据集wine和mine上都检查了300毫秒,而sklearn的工作时间为1.5毫秒。请告诉我,我应该如何只使用numpy库重写下面的代码,而不连接GPU或类似的东西

def __info(self, x, y, criterion):
    """
    Считаем меру неопределённости
    посредством критерия criterion
    по выборке (x, y)
    """
    y_len = y.shape[0]
    if y_len == 0:
        return 0.0

    prob_distr = np.bincount(y,\
                             minlength=self.num_class,\
                             weights=[1/y_len]*y_len)

    if   criterion == 'error':
        return 1 - prob_distr.max()

    elif criterion == 'gini':
        return 1 - np.power(prob_distr, 2).sum()

    elif criterion == 'entropy':
        return -(prob_distr * np.log2(prob_distr+1e-10)).sum() # 2 - в битах (e - натах).

    else:
        return 0.1
        # raise RuntimeError("No such criterion as \'{}\'!".format(criterion))


def __find_threshold(self, x, y):
    """
    Находим оптимальный признак и порог для сплита
    Здесь используемые разные impurity в зависимости от self.criterion
    """
    max_info_gain = -1
    if x.shape[0] == 0:
        raise RuntimeError("Received an empty sample!")

    for feature_id in range(x.shape[1]): # Использовать np.apply_along_axis()

        current_info = self.__info(x, y, self.criterion)

        tmp = np.unique(x[:,feature_id])
        if tmp.shape[0] < 2:
            thresholds = tmp
        else:
            thresholds = np.mean((tmp[:-1], np.roll(tmp, -1)[:-1]), axis=0)

        for threshold in thresholds: # Испо-ать np.apply_along_axis()

            x_left, x_right, y_left, y_right = self.__div_samples(x, y, feature_id, threshold)
            left_share = x_left.shape[0] / x.shape[0]

            left_info  = left_share       * self.__info(x_left,  y_left,  self.criterion)
            right_info = (1 - left_share) * self.__info(x_right, y_right, self.criterion)

            info_gain = current_info - left_info - right_info

            if info_gain > max_info_gain:

                max_info_gain = info_gain
                best_feature_id = feature_id
                best_threshold  = threshold


    x_left, x_right, y_left, y_right = self.__div_samples(x, y, best_feature_id, best_threshold) # ~о-мально!
    return best_feature_id, best_threshold, x_left, x_right, y_left, y_right
如果愿意,可以在my github中查看完整代码:


对不起,这里的所有评论都是俄语的

您是否有CUDA all设置的GPU?然后您可以使用CuPy,它使用NumPy,但在GPU上执行所有计算。这通常会使性能提高10倍。当然,建立CUDA是一个痛苦的世界,特别是如果你有旧的硬件,但CUDA是受欢迎的,是真正的高效和快速

这是一个帮助您入门的链接:-


谢谢,顺便说一句,我会抛出这个链接,但我认为这有点像作弊。实际上,我需要在不使用GPU等额外技巧的情况下,将计算从循环转移到numpy,因为评论者不会欣赏这一点:如果你利用了计算机的所有资源,你不能争辩。除非您计划在abacus上运行此代码,否则我认为审阅者会印象深刻。Sci kit在他们的代码上投入了大量资金。要接近他们的表现,请聪明地思考。。。