日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MachineLearning(7)-决策树基础+sklearn.DecisionTreeClassifier简单实践

發(fā)布時(shí)間:2023/12/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MachineLearning(7)-决策树基础+sklearn.DecisionTreeClassifier简单实践 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)生了不同的決策樹生成算法:

算法最優(yōu)特征選擇標(biāo)準(zhǔn)
ID3信息增益:Gain(A)=H(D)?H(D∥A)Gain(A)=H(D)-H(D\|A)Gain(A)=H(D)?H(DA)
C4.5信息增益率:GainRatio(A)=Gain(A)/Split(A)GainRatio(A)=Gain(A)/Split(A)GainRatio(A)=Gain(A)/Split(A)
CARTgini指數(shù)增益:Gini(D)?Gini(D∥A)Gini(D)-Gini(D\|A)Gini(D)?Gini(DA)

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=1K?pk?(1?pk?)=1?k=1K?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) Criterion選擇屬性的準(zhǔn)則–gini–cart算法
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圖 tree.export_graphviz 參數(shù)
feature_names特征列表list,和訓(xùn)練時(shí)的特征列表排列順序?qū)ζ浼纯?/td>
class_names類別l列表ist,和訓(xùn)練時(shí)的label列表排列順序?qū)ζ浼纯?/td>
filledFalse/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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。