【scikit-learn基础】--『监督学习』之 决策树分类
決策樹分類算法是一種監(jiān)督學(xué)習(xí)算法,它的基本原理是將數(shù)據(jù)集通過一系列的問題進(jìn)行拆分,這些問題被視為決策樹的葉子節(jié)點(diǎn)和內(nèi)部節(jié)點(diǎn)。
決策樹的每個(gè)分支代表一個(gè)可能的決策結(jié)果,而每個(gè)葉子節(jié)點(diǎn)代表一個(gè)最終的分類結(jié)果。
決策樹分類算法的歷史可以追溯到1980年代初,當(dāng)時(shí)研究者開始探索用機(jī)器學(xué)習(xí)來解決分類問題。
在1981年,J.Ross Quinlan開發(fā)了ID3算法,該算法使用信息增益來選擇決策樹的最佳劃分屬性。
后來,在1986年,J.Ross Quinlan提出了C4.5算法,該算法引入了剪枝技術(shù),以防止過擬合,該算法還引入了處理連續(xù)屬性、缺失數(shù)據(jù)和多值屬性等新特性。
在1998年,Jerome Friedman等人提出了CART算法(Classification and Regression Trees),該算法采用了二叉樹,使得決策樹更加簡潔和易于解釋。
1. 算法概述
決策樹不僅可以用在分類問題上,也可以用在回歸問題上。
關(guān)于決策樹在回歸問題上的應(yīng)用,可以參考:TODO
回到決策樹分類算法上來,構(gòu)建決策樹的有三種算法:
1.1. ID3
ID3算法的完整名稱是Iterative Dichotomiser 3,即迭代二叉樹3代。
ID3算法的核心思想是以信息增益來度量屬性的選擇,選擇分裂后信息增益最大的屬性進(jìn)行分裂。
對(duì)于任意樣本數(shù)據(jù) \(x(x_1,x_2,...,x_n)\),它的信息熵定義為:
\(entropy(x) = -\sum_{i=1}^n p_i\log_2(p_i)\)
基于信息熵,信息增益的公式為:
\(IG(T) = entropy(S) - \sum_{value(T)}\frac{|S_x|}{|S|}entropy(S_x)\)
其中:
- \(S\) 表示全部樣本的集合
- \(|S|\) 表示\(S\)中樣本數(shù)量
- \(T\) 表示樣本的某個(gè)特征
- \(value(T)\) 表示特征\(T\)所有的取值集合
- \(S_x\) 是\(S\)中特征\(T\)的值為\(x\)的樣本的集合
- \(|S_x|\) 表示\(S_x\)中樣本數(shù)量
1.2. C4.5
C4.5算法是以ID3算法為基礎(chǔ)的,它改為使用信息增益率來作為決策樹分裂的依據(jù)。
這樣,就克服了ID3算法中信息增益選擇屬性時(shí)偏向選擇取值多的屬性的不足。
C4.5算法中引入了一個(gè)分裂信息(split information)的項(xiàng)來懲罰取值較多的特征:
\(SI(T) = - \sum_{value(T)}\frac{|S_x|}{|S|}\log\frac{|S_x|}{|S|}\)
基于此,信息增益率的公式為:
\(gainRatio(T)=\frac{IG(T)}{SI(T)}\)
\(IG(T)\)就是上一節(jié)ID3算法中的信息增益公式。
1.3. CART
CART算法全稱是 classification and regression tree(分類與回歸樹)。
這個(gè)算法既可以用來分類,也可以用來回歸,在回歸問題上的介紹可以參考。
CART算法是根據(jù)基尼系數(shù)(Gini)來劃分特征的,每次選擇基尼系數(shù)最小的特征作為最優(yōu)切分點(diǎn)。
其中基尼系數(shù)的計(jì)算方法:\(gini(p) = \sum_{i=1}^n p_i(1-p_i)=1-\sum_{i=1}^n p_i^2\)
2. 創(chuàng)建樣本數(shù)據(jù)
用scikit-learn中的樣本生成器make_classification來生成分類用的樣本數(shù)據(jù)。
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
# 分類數(shù)據(jù)的樣本生成器
X, y= make_classification(n_samples=1000, n_classes=4, n_clusters_per_class=1, n_informative=6)
plt.scatter(X[:, 0], X[:, 1], marker="o", c=y, s=25)
plt.show()
關(guān)于樣本生成器的詳細(xì)內(nèi)容,請(qǐng)參考:TODO
3. 模型訓(xùn)練
首先,分割訓(xùn)練集和測(cè)試集。
from sklearn.model_selection import train_test_split
# 分割訓(xùn)練集和測(cè)試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
這次按照8:2的比例來劃分訓(xùn)練集和測(cè)試集。
然后用不同的算法來訓(xùn)練決策樹模型:
from sklearn.tree import DecisionTreeClassifier
reg_names = [
"ID3算法",
"C4.5算法",
"CART算法",
]
# 定義
regs = [
DecisionTreeClassifier(criterion="entropy"),
DecisionTreeClassifier(criterion="log_loss"),
DecisionTreeClassifier(criterion="gini"),
]
# 訓(xùn)練模型
for reg in regs:
reg.fit(X_train, y_train)
# 在測(cè)試集上進(jìn)行預(yù)測(cè)
y_preds = []
for reg in regs:
y_pred = reg.predict(X_test)
y_preds.append(y_pred)
for i in range(len(y_preds)):
correct_pred = np.sum(y_preds[i] == y_test)
print("【{}】 預(yù)測(cè)正確率:{:.2f}%".format(reg_names[i], correct_pred / len(y_pred) * 100))
# 運(yùn)行結(jié)果
【ID3算法】 預(yù)測(cè)正確率:71.50%
【C4.5算法】 預(yù)測(cè)正確率:72.50%
【CART算法】 預(yù)測(cè)正確率:75.00%
算法的正確率差別不是特別大。
感興趣的朋友,可以嘗試調(diào)整樣本生成器部分,生成一些特征較多的數(shù)據(jù)來看看算法之間的性能差別。
4. 總結(jié)
決策樹分類算法廣泛應(yīng)用于圖像識(shí)別、文本分類、語音識(shí)別、信用評(píng)分、疾病診斷等眾多領(lǐng)域。
例如,在電商平臺(tái)上,可以通過決策樹分類算法對(duì)用戶的行為數(shù)據(jù)進(jìn)行挖掘和分析,實(shí)現(xiàn)對(duì)用戶的精準(zhǔn)推薦;
在醫(yī)療領(lǐng)域,可以通過對(duì)醫(yī)學(xué)數(shù)據(jù)的分析,輔助醫(yī)生進(jìn)行疾病診斷和治療方案制定。
決策樹分類算法的優(yōu)勢(shì)有:
- 易于理解和解釋,直觀地展示出分類的過程
- 對(duì)于數(shù)據(jù)集可以進(jìn)行并行處理,提高了算法的效率
- 對(duì)于缺失數(shù)據(jù)和非數(shù)值屬性有很好的處理能力
- 可以處理多分類問題
決策樹分類算法也存在一些劣勢(shì):
- 可能存在過擬合,需要使用剪枝技術(shù)來控制
- 可能存在偏向性,需要使用加權(quán)投票來處理
- 對(duì)于連續(xù)屬性和多值屬性處理起來比較復(fù)雜,需要額外的處理方法
- 大規(guī)模數(shù)據(jù)集處理起來比較耗時(shí),需要優(yōu)化算法或者使用分布式計(jì)算等方法
總結(jié)
以上是生活随笔為你收集整理的【scikit-learn基础】--『监督学习』之 决策树分类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32CubeMX教程10 RTC
- 下一篇: CUDA驱动深度学习发展 - 技术全解与