決策樹的學習與總結

決策樹的概念

廢話不多說,決策樹的三個問題分別是,特徵選擇,生成和剪枝問題。

  1. 特徵選擇
    選擇某個特徵之後劃分樣本集會帶來信息增益,會使得確定類別的不確定性下降。
    g(D, A)=H(D)-H(D|A)
    信息熵計算公式:
    H(D)=k=1KCkDlog2CkDH(D)=-\sum_{k=1}^{K} \frac{\left|C_{k}\right|}{|D|} \log _{2} \frac{\left|C_{k}\right|}{|D|}
    條件信息熵公式:
    H(DA)=i=1nDiDH(Di)H(D | A)=\sum_{i=1}^{n} \frac{\left|D_{i}\right|}{|D|} H\left(D_{i}\right)
    兩個做差就是信息增益。

ID3就採用這種生成的算法,而c4.5採用了信息增益比的方法,避免傾向選擇過多屬性的特徵,從而提高整體的信息增益。

而另一個基尼指數也可以選擇特徵,用於cart決策與迴歸
Gini(D)=1k=1K(CkD)2\operatorname{Gini}(D)=1-\sum_{k=1}^{K}\left(\frac{\left|C_{k}\right|}{|D|}\right)^{2}

我的理解是,條件基尼係數作用是經過特徵切割過後的基尼係數作用上等價於信息增益。

在迴歸樹的生成過程中,尋找輸入的切分變量和最優切分點,劃分的依據因爲是迴歸輸出值連續,所以選擇平方誤差或絕對值誤差來裁定所以是二叉樹。

  1. 剪枝
    防止過擬合,相當於在損失函數上加一個正則項,從葉節點遞歸的向上對比損失函數,然後剪掉。

代碼學習

計算熵的函數

def calc_ent(datasets):
    data_length = len(datasets)
    label_count = {}
    for i in range(data_length):
        label = datasets[i][-1]
        if label not in label_count:
            label_count[label] = 0
        label_count[label] += 1
    ent = -sum([(p / data_length) * log(p / data_length, 2)
                for p in label_count.values()])
    return ent

選擇信息增益最大的作爲根節點

def info_gain_train(datasets):
    count = len(datasets[0]) - 1
    ent = calc_ent(datasets)
#     ent = entropy(datasets)
    best_feature = []
    for c in range(count):
        c_info_gain = info_gain(ent, cond_ent(datasets, axis=c))
        best_feature.append((c, c_info_gain))
        print('特徵({}) - info_gain - {:.3f}'.format(labels[c], c_info_gain))
    # 比較大小
    best_ = max(best_feature, key=lambda x: x[-1])
    return '特徵({})的信息增益最大,選擇爲根節點特徵'.format(labels[best_[0]])

遞歸的建立樹

然後用sk-learn實現花分類

#data
def create_data():
    iris = load_iris()
    df = pd.DataFrame(iris.data, columns=iris.feature_names)
    df['label'] = iris.target    df.columns = [
        'sepal length', 'sepal width', 'petal length', 'petal width', 'label'
    ]
    data = np.array(df.iloc[:100, [0, 1, -1]])
    # print(data)
    return data[:, :2], data[:, -1]
    X, y = create_data()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

導入數據
之後參考文檔分類即可
sklearn_dtree

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章