Python 如何使用NumPy加速自定义DecisionTreeClassifier中的方法“fit”?
我正在做关于实现决策树分类器的家庭作业,问题是我的算法有效,它产生的结果在准确性上并不比sklearn库中的树差,但它的工作时间要长得多。我在数据集wine和mine上都检查了300毫秒,而sklearn的工作时间为1.5毫秒。请告诉我,我应该如何只使用numpy库重写下面的代码,而不连接GPU或类似的东西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): """ Считаем меру неопределённости посредством кр
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在他们的代码上投入了大量资金。要接近他们的表现,请聪明地思考。。。