MachineLearning(7)-决策树基础+sklearn.DecisionTreeClassifier简单实践
sklearn.DecisionTreeClassifier決策樹簡(jiǎn)單使用
- 1.決策樹算法基礎(chǔ)
- 2.sklearn.DecisionTreeClassifier簡(jiǎn)單實(shí)踐
- 2.1 決策樹類
- 2.3 決策樹構(gòu)建
- 2.3.1全數(shù)據(jù)集擬合,決策樹可視化
- 2.3.2交叉驗(yàn)證實(shí)驗(yàn)
- 2.3.3超參數(shù)搜索
- 2.3.4模型保存與導(dǎo)入
- 2.3.5固定隨機(jī)數(shù)種子
- 參考資料
1.決策樹算法基礎(chǔ)
決策樹模型可以用來做 回歸/分類 任務(wù)。
每次選擇一個(gè)屬性/特征,依據(jù)特征的閾值,將特征空間劃分為 與 坐標(biāo)軸平行的一些決策區(qū)域。如果是分類問題,每個(gè)決策區(qū)域的類別為該該區(qū)域中多數(shù)樣本的類別;如果為回歸問題,每個(gè)決策區(qū)域的回歸值為該區(qū)域中所有樣本值的均值。
決策樹復(fù)雜程度 依賴于 特征空間的幾何形狀。根節(jié)點(diǎn)->葉子節(jié)點(diǎn)的一條路徑產(chǎn)生一條決策規(guī)則。
決策樹最大優(yōu)點(diǎn):可解釋性強(qiáng)
決策樹最大缺點(diǎn):不是分類正確率最高的模型
決策樹的學(xué)習(xí)是一個(gè)NP-Complete問題,所以實(shí)際中使用啟發(fā)性的規(guī)則來構(gòu)建決策樹。
step1:選最好的特征來劃分?jǐn)?shù)據(jù)集
step2:對(duì)上一步劃分的子集重復(fù)步驟1,直至停止條件(節(jié)點(diǎn)純度/分裂增益/樹深度)
不同的特征衡量標(biāo)準(zhǔn),產(chǎn)生了不同的決策樹生成算法:
| ID3 | 信息增益:Gain(A)=H(D)?H(D∥A)Gain(A)=H(D)-H(D\|A)Gain(A)=H(D)?H(D∥A) |
| C4.5 | 信息增益率:GainRatio(A)=Gain(A)/Split(A)GainRatio(A)=Gain(A)/Split(A)GainRatio(A)=Gain(A)/Split(A) |
| CART | gini指數(shù)增益:Gini(D)?Gini(D∥A)Gini(D)-Gini(D\|A)Gini(D)?Gini(D∥A) |
k個(gè)類別,類別分布的gini 指數(shù)如下,gini指數(shù)越大,樣本的不確定性越大:
Gini(D)=∑k=1Kpk(1?pk)=1?∑k=1Kpk2Gini(D) =\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2Gini(D)=k=1∑K?pk?(1?pk?)=1?k=1∑K?pk2?
CART – Classification and Regression Trees 的縮寫1984年提出的一個(gè)特征選擇算法,對(duì)特征進(jìn)行是/否判斷,生成一棵二叉樹。且每次選擇完特征后不對(duì)特征進(jìn)行剔除操作,所有同一條決策規(guī)則上可能出現(xiàn)重復(fù)特征的情況。
2.sklearn.DecisionTreeClassifier簡(jiǎn)單實(shí)踐
Scikit-learn(sklearn)是機(jī)器學(xué)習(xí)中常用的第三方模塊,其建立在NumPy、Scipy、MatPlotLib之上,包括了回歸,降維,分類,聚類方法。
sklearn 通過以下兩個(gè)類實(shí)現(xiàn)了 決策分類樹 和 決策回歸樹
sklearn 實(shí)現(xiàn)了ID3和Cart 算法,criterion默認(rèn)為"gini"系數(shù),對(duì)應(yīng)為CART算法。還可設(shè)置為"entropy",對(duì)應(yīng)為ID3。(計(jì)算機(jī)最擅長做的事:規(guī)則重復(fù)計(jì)算,sklearn通過對(duì)每個(gè)特征的每個(gè)切分點(diǎn)計(jì)算信息增益/gini增益,得到當(dāng)前數(shù)據(jù)集合最優(yōu)的特征及最優(yōu)劃分點(diǎn))
2.1 決策樹類
sklearn.tree.DecisionTreeClassifier(criterion=’gini’*,splitter=’best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False) DecisionTreeRegressor(criterion=’mse’, splitter=’best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, presort=False)| splitter | 特征劃分點(diǎn)的選擇策略:best 特征的所有劃分點(diǎn)中找最優(yōu) |
| random 部分劃分點(diǎn)中找最優(yōu) | |
| max_depth | 決策樹的最大深度,none/int 限制/不限制決策樹的深度 |
| min_samples_split | 節(jié)點(diǎn) 繼續(xù)劃分需要的最小樣本數(shù),如果少于這個(gè)數(shù),節(jié)點(diǎn)將不再劃分 |
| min_samples_leaf | 限制葉子節(jié)點(diǎn)的最少樣本數(shù)量,如果葉子節(jié)點(diǎn)的樣本數(shù)量過少會(huì)被剪枝 |
| min_weight_fraction_leaf | 葉子節(jié)點(diǎn)的剪枝規(guī)則 |
| max_features | 選取用于分類的特征的數(shù)量 |
| random_state | 隨機(jī)數(shù)生成的一些規(guī)則、 |
| max_leaf_nodes | 限制葉子節(jié)點(diǎn)的數(shù)量,防止過擬合 |
| min_impurity_decrease | 表示結(jié)點(diǎn)減少的最小不純度,控制節(jié)點(diǎn)的繼續(xù)分割規(guī)律 |
| min_impurity_split | 表示結(jié)點(diǎn)劃分的最小不純度,控制節(jié)點(diǎn)的繼續(xù)分割規(guī)律 |
| class_weight | 設(shè)置各個(gè)類別的權(quán)重,針對(duì)類別不均衡的數(shù)據(jù)集使用 |
| 不適用于決策樹回歸 | |
| presort | 控制決策樹劃分的速度 |
2.3 決策樹構(gòu)建
采用sklearn內(nèi)置數(shù)據(jù)集鳶尾花數(shù)據(jù)集做實(shí)驗(yàn)。
導(dǎo)入第三方庫
from sklearn import tree from sklearn.tree import DecisionTreeClassifier from sklearn.datasets import load_iris import graphviz import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, precision_score, recall_score import joblib plt.switch_backend('agg')2.3.1全數(shù)據(jù)集擬合,決策樹可視化
def demo1():# 全數(shù)據(jù)集擬合,決策樹可視化iris = load_iris()x, y = load_iris(return_X_y = True) # x[list]-feature,y[]-label clf = tree.DecisionTreeClassifier() # 實(shí)例化了一個(gè)類,可以指定類參數(shù),定制決策樹模型clf = clf.fit(x,y) # 訓(xùn)練模型print("feature name ", iris.feature_names) # 特征列表, 自己的數(shù)據(jù)可視化時(shí),構(gòu)建一個(gè)特征列表即可print("label name ",iris.target_names) # 類別列表dot_data = tree.export_graphviz(clf, out_file = None, feature_names = iris.feature_names, class_names = iris.target_names ) graph = graphviz.Source(dot_data) # 能繪制樹節(jié)點(diǎn)的一個(gè)接口graph.render("iris") # 存成pdf圖| feature_names | 特征列表list,和訓(xùn)練時(shí)的特征列表排列順序?qū)ζ浼纯?/td> |
| class_names | 類別l列表ist,和訓(xùn)練時(shí)的label列表排列順序?qū)ζ浼纯?/td> |
| filled | False/True,會(huì)依據(jù)criterion的純度將節(jié)點(diǎn)顯示成不同的顏色 |
value中的值顯示的是各個(gè)類別樣本的數(shù)量(二分類就是[負(fù)樣本數(shù),正樣本數(shù)])
2.3.2交叉驗(yàn)證實(shí)驗(yàn)
def demo2():# n-折實(shí)驗(yàn)iris = load_iris()iris_feature = iris.data # 與demo1中的x,y是同樣的數(shù)據(jù)iris_target = iris.target# 數(shù)據(jù)集合劃分參數(shù):train_x, test_x, train_y, test_y = train_test_split(iris_feature,iris_target,test_size = 0.2, random_state = 1)dt_model = DecisionTreeClassifier()dt_model.fit(train_x, train_y) # 模型訓(xùn)練predict_y = dt_model.predict(test_x) # 模型預(yù)測(cè)輸出# score = dt_model.score(test_x,test_y) # 模型測(cè)試性能: 輸入:feature_test,target_test , 輸出acc# print(score) # 性能指標(biāo)print("label: \n{0}".format(test_y[:5])) # 輸出前5個(gè)labelprint("predict: \n{0}".format(predict_y[:5])) # 輸出前5個(gè)label# sklearn 內(nèi)置acc, recall, precision統(tǒng)計(jì)接口print("test acc: %.3f"%(accuracy_score(test_y, predict_y)))# print("test recall: %.3f"%(recall_score(test_y, predict_y))) # 多類別統(tǒng)計(jì)召回率需要指定平均方式# print("test precision: %.3f"%(precision_score(test_y, predict_y))) # 多類別統(tǒng)計(jì)準(zhǔn)確率需要指定平均方式2.3.3超參數(shù)搜索
def model_search(feas,labels):# 模型參數(shù)選擇,全數(shù)據(jù)5折交叉驗(yàn)證,出結(jié)果min_impurity_de_entropy = np.linspace(0, 0.01, 10) # 純度增益下界,劃分后降低量少于這個(gè)值,將不進(jìn)行分裂min_impurity_split_entropy = np.linspace(0, 0.4, 10) # 當(dāng)前節(jié)點(diǎn)純度小于這個(gè)值將不分裂,較高版本中已經(jīng)取消這個(gè)參數(shù)max_depth_entropy = np.arange(1,11) # 決策樹的深度# param_grid = {"criterion" : ["entropy"], "min_impurity_decrease" : min_impurity_de_entropy,"max_depth" : max_depth_entropy,"min_impurity_split" : min_impurity_split_entropy }param_grid = {"criterion" : ["entropy"], "max_depth" : max_depth_entropy, "min_impurity_split" : min_impurity_split_entropy }clf = GridSearchCV(DecisionTreeClassifier(), param_grid, cv = 5) # 遍歷以上超參, 通過多次五折交叉驗(yàn)證得出最優(yōu)的參數(shù)選擇clf.fit(feas, label) print("best param:", clf.best_params_) # 輸出最優(yōu)參數(shù)選擇print("best score:", clf.best_score_)2.3.4模型保存與導(dǎo)入
模型保存
joblib.dump(clf,"./dtc_model.pkl")
模型導(dǎo)入
model_path = “./dtc_model.pkl”
clf = joblib.load(model_path)
2.3.5固定隨機(jī)數(shù)種子
1.五折交叉驗(yàn)證,數(shù)據(jù)集劃分隨機(jī)數(shù)設(shè)置 random_state
train_test_split(feas, labels, test_size = 0.2, random_state = 1 )
2.模型隨機(jī)數(shù)設(shè)置 andom_state
DecisionTreeClassifier(random_state = 1)
參考資料
1.官網(wǎng)類接口說明:
https://scikit-learn.org/dev/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier
可視化接口說明https://scikit-learn.org/stable/modules/generated/sklearn.tree.export_graphviz.html
2.決策樹超參數(shù)調(diào)參技巧:https://www.jianshu.com/p/230be18b08c2
3.Sklearn.metrics 簡(jiǎn)介及應(yīng)用示例:https://blog.csdn.net/Yqq19950707/article/details/90169913
4.sklearn的train_test_split()各函數(shù)參數(shù)含義解釋(非常全):https://www.cnblogs.com/Yanjy-OnlyOne/p/11288098.html
5.sklearn.tree.DecisionTreeClassifier 詳細(xì)說明:https://www.jianshu.com/p/8f3f1e706f11
6.使用scikit-learn中的metrics以及DecisionTreeClassifier重做《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》中的隱形眼鏡分類問題:http://keyblog.cn/article-235.html
7.決策樹算法:https://www.cnblogs.com/yanqiang/p/11600569.html
總結(jié)
以上是生活随笔為你收集整理的MachineLearning(7)-决策树基础+sklearn.DecisionTreeClassifier简单实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法(22)-leetcode-剑指of
- 下一篇: 机器学习模型评分总结(sklearn)