介绍
决策树是一种用于监督学习的算法。 它使用树结构,其中包含两种类型的节点:决策节点和叶节点。 决策节点通过在要素上询问布尔值将数据分为两个分支。 叶节点代表一个类。 训练过程是关于在具有特定特征的特定特征中找到“最佳”分割。 预测过程是通过沿着路径的每个决策节点回答问题来从根到达叶节点。
基尼不纯度和熵
术语“最佳”拆分是指拆分之后,两个分支比任何其他可能的拆分更“有序”。 我们如何定义更多有序的? 这取决于我们选择哪种指标。 通常,度量有两种类型:基尼不纯度和熵。 这些指标越小,数据集就越“有序”。
这两个指标之间的差异非常微妙。 但 在大多数应用中,两个指标的行为类似。 以下是用于计算每个指标的代码。
def gini_impurity(y): # calculate gini_impurity given labels/classes of each example m = y.shape[0] cnts = dict(zip(*np.unique(y, return_counts = True))) impurity = 1 - sum((cnt/m)**2 for cnt in cnts.values()) return impurity def entropy(y): # calculate entropy given labels/classes of each example m = y.shape[0] cnts = dict(zip(*np.unique(y, return_counts = True))) disorder = - sum((cnt/m)*log(cnt/m) for cnt in cnts.values()) return disorder
构建树
训练过程实质上是在树上建树。 关键步骤是确定“最佳”分配。 过程如下:我们尝试按每个功能中的每个唯一值分割数据,然后选择混乱程度最小的最佳数据。 现在我们可以将此过程转换为python代码。
def get_split(X, y): # loop through features and values to find best combination with the most information gain best_gain, best_index, best_value = 0, None, None cur_gini = gini_impurity(y) n_features = X.shape[1] for index in range(n_features): values = n