4. 决策树

1. 决策树基本信息

  • 非参数学习
  • 解决分类问题
  • 天然就解决多分类问题
  • 也可以解决回归问题
  • 非常好的可解释性

2. 信息熵

熵: 代表随机变量不确定度的度量

熵越大:数据的不确定性越高

熵越小:数据的不确定性越低

表达式:

3. 使用信息熵寻找最优划分

from sklearn.tree import DecisionTreeClassifier
dt_clf = DecisionTreeClassifier(max_depth=2, criterion='entropy', random_state=2)   # criterion标准使用entropy信息熵计算,默认为基尼系数gini
dt_clf.fit(x,y)
  • 信息熵的模拟
def split(X, y, d, value):      # 对数据分割
    index_a = (X[:,d] <= value)
    index_b = (X[:,d] > value)
    return X[index_a], X[index_b], y[index_a], y[index_b]

from collections import Counter
from math import log

def entropy(y):           # 求出在某点时的信息熵
    counter = Counter(y)
    res = 0.0
    for num in counter.values():    # 对某点左右两边的数据值统计,根据信息熵公式求出
        p = num / len(y)
        res += -p * log(p)
    return res
 
def try_split(X, y):    # 遍历数据集求出最小的信息熵
    
    best_entropy = float('inf')
    best_d, best_v = -1, -1
    for d in range(X.shape[1]):     # 根据不同的列遍历
        sorted_index = np.argsort(X[:,d])      # 求出对某列数据的排序后的索引,按照从小到大的值的顺序排列的索引
        for i in range(1, len(X)):      # 对当前列的所有值不改变顺序的 按照顺序去搜索出最小的信息熵
            if X[sorted_index[i], d] != X[sorted_index[i-1], d]:
                v = (X[sorted_index[i], d] + X[sorted_index[i-1], d])/2     # 
                X_l, X_r, y_l, y_r = split(X, y, d, v)
                p_l, p_r = len(X_l) / len(X), len(X_r) / len(X)   # 在某点左右两侧值的概率
                e = p_l * entropy(y_l) + p_r * entropy(y_r)      # 信息熵
                if e < best_entropy:     # 如果当前信息熵更低替换
                    best_entropy, best_d, best_v = e, d, v
                
    return best_entropy, best_d, best_v

4. 基尼系数

from sklearn.tree import DecisionTreeClassifier

dt_clf = DecisionTreeClassifier(max_depth=2, criterion="gini", random_state=42)  # 默认为gini,设置通过critertion标准为gini基尼系数
dt_clf.fit(X, y)
  • 信息熵的计算比基尼系数稍慢,sklearn默认为基尼系数,大多数时候两者效果差不多

5. CART 与决策树中的超参数

  • 复杂度:预测:O( logm ), 训练:O( n * m * logm )
  • 通过剪枝降低复杂度,解决过拟合:max_depth = 2, min_sample_split = 10, max_leaf_nodes = 4

6. 决策树的回归问题解决

from sklearn.tree import DecisionTreeRegressor

dtr_clf = DecisionTreeRegressor(max_depth=4, max_features=11, )
dtr_clf.fit(x_train, y_train)
dtr_clf.score(x_test, y_test)

7. 决策树的局限性

  • 分割线横平竖直,无法斜向表示、

  • 对个别数据非常的敏感
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页