機器學習 從入門到精通 day_04

1.?決策樹-分類

1.1?概念

????????1. 決策節點 通過條件判斷而進行分支選擇的節點。如:將某個樣本中的屬性值(特征值)與決策節點上的值進行比較,從而判斷它的流向。
????????2. 葉子節點 沒有子節點的節點,表示最終的決策結果。
????????3. 決策樹的深度 所有節點的最大層次數,決策樹具有一定的層次結構,根節點的層次數定為0,從下面開始每一層子節點層次數增加。
????????4. 決策樹優點:可視化 - 可解釋能力-對算力要求低。
????????5. 決策樹缺點:容易產生過擬合,所以不要把深度調整太大了。

是動物能飛有羽毛
麻雀111
蝙蝠110
飛機010
熊貓100

?????????是否為動物:

是動物能飛有羽毛
麻雀111
蝙蝠110
熊貓100

????????是否會飛:

是動物能飛有羽毛
麻雀111
蝙蝠110

????????是否有羽毛:

是動物能飛有羽毛
麻雀111

1.2?基于信息增益決策樹的建立

????????信息增益決策樹傾向于選擇取值較多的屬性,在有些情況下這類屬性可能不會提供太多有價值的信息,算法只能對描述屬性為離散型屬性的數據集構造決策樹。
????????根據以下信息構建一棵預測是否貸款的決策樹。我們可以看到有4個影響因素:職業,年齡,收入和學歷。

職業年齡收入學歷是否貸款
1工人365500高中
2工人422800初中
3白領453300小學
4白領2510000本科
5白領328000碩士
6白領2813000博士

? ? ? ? (1)信息熵:信息熵描述的是不確定性。信息熵越大,不確定性越大。信息熵的值越小,則D的純度越高。
????????假設樣本集合D共有N類,第k類樣本所占比例為P_k,則D的信息熵為:

? ? ? ? (2)信息增益:信息增益是一個統計量,用來描述一個屬性區分數據樣本的能力。信息增益越大,那么決策樹就會越簡潔。這里信息增益的程度用信息熵的變化程度來衡量, 信息增益公式:

? ? ? ? (3 )信息增益決策樹建立步驟:第一步,計算根節點的信息熵上表根據是否貸款把樣本分成2類樣本,"是"占4/6=2/3, "否"占2/6=1/3,所以;第二步,計算屬性的信息增益:
????????<1> "職業"屬性的信息增益,在職業中,工人占1/3, ?工人中,是否代款各占1/2, ?所以有,在職業中,白領占2/3, ?白領中,是貸款占3/4, 不貸款占1/4, 所以有,所以有,最后得到職業屬性的信息增益為:
????????<2>" 年齡"屬性的信息增益(以35歲為界)

????????<3> "收入"屬性的信息增益(以10000為界,大于等于10000為一類)

????????<4> "學歷"屬性的信息增益(以高中為界, 大于等于高中的為一類)

????????第三步,劃分屬性,對比屬性信息增益發現,"收入"和"學歷"相等,并且是最高的,所以我們就可以選擇"學歷"或"收入"作為第一個決策樹的節點, 接下來我們繼續重復1,2的做法繼續尋找合適的屬性節點。

1.3?基于基尼指數決策樹的建立(了解)

????????基尼指數(Gini Index)是決策樹算法中用于評估數據集純度的一種度量,基尼指數衡量的是數據集的不純度,或者說分類的不確定性。在構建決策樹時,基尼指數被用來決定如何對數據集進行最優劃分,以減少不純度。

????????基尼指數的計算:對于一個二分類問題,如果一個節點包含的樣本屬于正類的概率是 (p),則屬于負類的概率是 (1-p)。那么,這個節點的基尼指數 (Gini(p)) 定義為:

????????????????????????????????????????Gini(p) = 1 - p^2 - (1-p)^2 = 2p(1-p)

????????對于多分類問題,如果一個節點包含的樣本屬于第 k 類的概率是 p_k,則節點的基尼指數定義為:

?????????????????????????????????????????????????????????????Gini(p) = 1 - \sum_{k=1}^{K} p_k^2

????????基尼指數的意義:1. 當一個節點的所有樣本都屬于同一類別時,基尼指數為 0,表示純度最高。2. 當一個節點的樣本均勻分布在所有類別時,基尼指數最大,表示純度最低。

????????決策樹中的應用:在構建決策樹時,我們希望每個內部節點的子節點能更純,即基尼指數更小。因此,選擇分割特征和分割點的目標是使子節點的平均基尼指數最小化。具體來說,對于一個特征,我們計算其所有可能的分割點對應的子節點的加權平均基尼指數,然后選擇最小化這個值的分割點。這個過程會在所有特征中重復,直到找到最佳的分割特征和分割點。

????????例如,考慮一個數據集 (D),其中包含 (N) 個樣本,特征 (A) 將數據集分割為 |D_1|和 |D_2| ,則特征 (A) 的基尼指數為:

????????????????????????????????????????????????????????????????????Gini_A = \frac{|D_1|}{|D|} Gini(D_1) + \frac{|D_2|}{|D|} Gini(D_2)

其中 |D_1|和 |D_2| 分別是子集 D_1 和 D_2 中的樣本數量。

????????通過這樣的方式,決策樹算法逐步構建一棵樹,每一層的節點都盡可能地減少基尼指數,最終達到對數據集的有效分類。

????????案例:

????????首先工資有兩個取值,分別是0和1。當工資=1時,有3個樣本。所以:

????????同時,在這三個樣本中,工作都是好。所以:

????????就有了加號左邊的式子:

????????同理,當工資=0時,有5個樣本,在這五個樣本中,工作有3個是不好,2個是好。就有了加號右邊的式子:

????????同理,可得壓力的基尼指數如下:

????????平臺的基尼指數如下:

????????在計算時,工資和平臺的計算方式有明顯的不同。因為工資只有兩個取值0和1,而平臺有三個取值0,1,2。所以在計算時,需要將平臺的每一個取值都單獨進行計算。比如:當平臺=0時,將數據集分為兩部分,第一部分是平臺=0,第二部分是平臺!=0(分母是5的原因)。根據基尼指數最小準則, 我們優先選擇工資或者平臺=0作為D的第一特征。
????????我們選擇工資作為第一特征,那么當工資=1時,工作=好,無需繼續劃分。當工資=0時,需要繼續劃分。
????????當工資=0時,繼續計算基尼指數:

????????當平臺=0時,基尼指數=0,可以優先選擇。同時,當平臺=0時,工作都是好,無需繼續劃分,當平臺=1,2時,工作都是不好,也無需繼續劃分。直接把1,2放到樹的一個結點就可以。

1.4 API介紹??

class sklearn.tree.DecisionTreeClassifier(....)
參數:
criterion "gini" "entropy” 默認為="gini" 當criterion取值為"gini"時采用 基尼不純度(Gini impurity)算法構造決策樹,當criterion取值為"entropy”時采用信息增益( information gain)算法構造決策樹.
max_depth	int, 默認為=None  樹的最大深度# 可視化決策樹
function sklearn.tree.export_graphviz(estimator, out_file="iris_tree.dot", feature_names=iris.feature_names)
參數:estimator決策樹預估器out_file生成的文檔feature_names節點特征屬性名
功能:把生成的文檔打開,復制出內容粘貼到"http://webgraphviz.com/"中,點擊"generate Graph"會生成一個樹型的決策樹圖

? ? ? ? 示例:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeClassifier, export_graphviz# 1)獲取數據集
iris = load_iris()# 2)劃分數據集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)#3)標準化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)# 4)決策樹預估器
estimator = DecisionTreeClassifier(criterion="entropy")estimator.fit(x_train, y_train)# 5)模型評估,計算準確率
score = estimator.score(x_test, y_test)
print("準確率為:\n", score)# 6)預測
index=estimator.predict([[2,2,3,1]])
print("預測:\n",index,iris.target_names,iris.target_names[index])# 可視化決策樹
export_graphviz(estimator, out_file="iris_tree.dot", feature_names=iris.feature_names)

????????把文件"iris_tree.dot"內容粘貼到"Webgraphviz"點擊"generate Graph"決策樹圖:

? ? ? ? 示例:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier, export_graphviz
# 1、獲取數據
titanic = pd.read_csv("src/titanic/titanic.csv")
titanic.head()
# 篩選特征值和目標值
x = titanic[["pclass", "age", "sex"]]
y = titanic["survived"]#2、數據處理
# 1)缺失值處理, 因為其中age有缺失值。
x["age"].fillna(x["age"].mean(), inplace=True)# 2) 轉換成字典, 因為其中數據必須為數字才能進行決策樹,所在先轉成字典,后面又字典特征抽取,這樣之后的數據就會是數字了, 鳶尾花的數據本來就全部是數字,所以不需要這一步。
"""
x.to_dict(orient="records") 這個方法通常用于 Pandas DataFrame 對象,用來將 DataFrame 轉換為一個列表,其中列表的每一個元素是一個字典,對應于 DataFrame 中的一行記錄。字典的鍵是 DataFrame 的列名,值則是該行中對應的列值。
假設你有一個如下所示的 DataFrame x:A  B  C
0  1  4  7
1  2  5  8
2  3  6  9
執行 x.to_dict(orient="records"),你會得到這樣的輸出:
[{'A': 1, 'B': 4, 'C': 7},{'A': 2, 'B': 5, 'C': 8},{'A': 3, 'B': 6, 'C': 9}
]
"""
x = x.to_dict(orient="records")
# 3)、數據集劃分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
# 4)、字典特征抽取
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train) #稀疏矩陣
x_test = transfer.transform(x_test)# 3)決策樹預估器
estimator = DecisionTreeClassifier(criterion="entropy", max_depth=8)
estimator.fit(x_train, y_train)# 4)模型評估
# 方法1:直接比對真實值和預測值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比對真實值和預測值:\n", y_test == y_predict)# 方法2:計算準確率
score = estimator.score(x_test, y_test)
print("準確率為:\n", score)# 6)預測
x_test = transfer.transform([{'pclass': '1rd', 'age': 22.0, 'sex': 'female'}])
index=estimator.predict(x_test)
print("預測1:\n",index)#[1]  頭等艙的就可以活下來
x_test = transfer.transform([{'pclass': '3rd', 'age': 22.0, 'sex': 'female'}])
index=estimator.predict(x_test)
print("預測2:\n",index)#[0]  3等艙的活不下來# 可視化決策樹
export_graphviz(estimator, out_file="titanic_tree.dot", feature_names=transfer.get_feature_names_out())

2.?集成學習方法之隨機森林

????????機器學習中有一種大類叫集成學習(Ensemble Learning),集成學習的基本思想就是將多個分類器組合,從而實現一個預測效果更好的集成分類器。集成算法可以說從一方面驗證了中國的一句老話:三個臭皮匠,賽過諸葛亮。集成算法大致可以分為:Bagging,Boosting 和 Stacking 三大類型。

(1)每次有放回地從訓練集中取出 n 個訓練樣本,組成新的訓練集;

(2)利用新的訓練集,訓練得到M個子模型;

(3)對于分類問題,采用投票的方法,得票最多子模型的分類類別為最終的類別;

????????隨機森林就屬于集成學習,是通過構建一個包含多個決策樹(通常稱為基學習器或弱學習器)的森林,每棵樹都在不同的數據子集和特征子集上進行訓練,最終通過投票或平均預測結果來產生更準確和穩健的預測。這種方法不僅提高了預測精度,也降低了過擬合風險,并且能夠處理高維度和大規模數據集。

2.1?算法原理

  • 隨機: 特征隨機,訓練集隨機

    • 樣本:對于一個總體訓練集T,T中共有N個樣本,每次有放回地隨機選擇n個樣本。用這n個樣本來訓練一個決策樹。

    • 特征:假設訓練集的特征個數為d,每次僅選擇k(k<d)個來構建決策樹。

  • 森林: 多個決策樹分類器構成的分類器, 因為隨機,所以可以生成多個決策樹

  • 處理具有高維特征的輸入樣本,而且不需要降維

  • 使用平均或者投票來提高預測精度和控制過擬合

2.2 API 介紹

class sklearn.ensemble.RandomForestClassifier參數:
n_estimators	int, default=100
森林中樹木的數量。(決策樹個數)criterion	{“gini”, “entropy”}, default=”gini” 決策樹屬性劃分算法選擇當criterion取值為“gini”時采用 基尼不純度(Gini impurity)算法構造決策樹,當criterion取值為 “entropy” 時采用信息增益( information gain)算法構造決策樹.max_depth	int, default=None 樹的最大深度。 

? ? ? ? 示例:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import  export_graphviz
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV# 1、獲取數據
titanic = pd.read_csv("src/titanic/titanic.csv")
titanic.head()
# 篩選特征值和目標值
x = titanic[["pclass", "age", "sex"]]
y = titanic["survived"]#2、數據處理
# 1)缺失值處理
x["age"].fillna(x["age"].mean(), inplace=True)
# 2) 轉換成字典
x = x.to_dict(orient="records")
# 3)、數據集劃分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
# 4)、字典特征抽取
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)'''
#3 預估: 不加網格搜索與交叉驗證的代碼
estimator = RandomForestClassifier(n_estimators=120, max_depth=5)
# 訓練
estimator.fit(x_train, y_train)
'''#3 預估: 加網格搜索與交叉驗證的代碼
estimator = RandomForestClassifier()
# 參數準備  n_estimators樹的數量, max_depth樹的最大深度
param_dict = {"n_estimators": [120,200,300,500,800,1200], "max_depth": [5,8,15,25,30]}
# 加入網格搜索與交叉驗證, cv=3表示3次交叉驗證
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
# 訓練
estimator.fit(x_train, y_train)# 5)模型評估
# 方法1:直接比對真實值和預測值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比對真實值和預測值:\n", y_test == y_predict)# 方法2:計算準確率
score = estimator.score(x_test, y_test)
print("準確率為:\n", score)'''
加網格搜索與交叉驗證的代碼
print("最佳參數:\n", estimator.best_params_)
print("最佳結果:\n", estimator.best_score_)
print("最佳估計器:\n", estimator.best_estimator_)
print("交叉驗證結果:\n", estimator.cv_results_)
'''
#估計運行花1min

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75928.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75928.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75928.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ Primer (第五版)-第十三章 拷貝控制

文章目錄 概述13.1拷貝、賦值與銷毀合成拷貝構造函數拷貝初始化參數和返回值拷貝初始化的限制編譯器可以繞過拷貝構造函數拷貝運算符析構函數三/五原則使用default阻止拷貝合成的拷貝控制成員可能是刪除的 private拷貝控制拷貝控制和資源管理行為像值的類類值拷貝賦值運算符定義…

Vue el-from的el-form-item v-for循環表單如何校驗rules(一)

實際業務需求場景&#xff1a; 新增或編輯頁面&#xff08;基礎信息表單&#xff0c;一個數據列表的表單&#xff09;&#xff0c;數據列表里面的表單數是動態添加的。數據可新增、可刪除&#xff0c;在表單保存前&#xff0c;常常需要做表單必填項的校驗&#xff0c;校驗通過以…

測試100問:http和https的區別是什么?

哈嘍&#xff0c;大家好&#xff0c;我是十二&#xff0c;今天給大家分享的問題是&#xff1a;http和https的區別是什么&#xff1f; 首先我們要知道 HTTP 協議傳播的數據都是未加密的&#xff0c;也就是明文的&#xff0c;因此呢使用 http協議傳輸一些隱私信息也就非常不安全&…

YOLOv3超詳細解讀(三):源碼解析:數據處理模塊

一、概述 YOLOv3&#xff08;You Only Look Once v3&#xff09;是一種高效的目標檢測算法&#xff0c;其數據處理模塊是訓練和推理流程的核心部分。本文將深入分析Ultralytics團隊基于PyTorch實現的YOLOv3源碼中的數據處理模塊&#xff0c;重點探討數據加載、預處理和數據增強…

每日算法(雙指針算法)(Day 1)

雙指針算法 1.算法題目&#xff08;移動零&#xff09;2.講解算法原理3.編寫代碼 1.算法題目&#xff08;移動零&#xff09; 2.講解算法原理 數組劃分&#xff0c;數組分塊&#xff08;快排里面最核心的一步&#xff09;只需把0改為tmp 雙指針算法&#xff1a;利用數組下標來…

2025藍橋杯python A組省賽 題解

真捐款去了&#xff0c;好長時間沒練了&#xff0c;感覺腦子和手都不轉悠了。 B F BF BF 賽時都寫假了&#xff0c; G G G 也只寫了爆搜。 題解其實隊友都寫好了&#xff0c;我就粘一下自己的代碼&#xff0c;稍微提點個人的理解水一篇題解 隊友題解 2025藍橋杯C A組省賽 題…

測試基礎筆記第四天(html)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 html介紹1. 介紹2.骨架標簽3.常用標簽標題標簽段落標簽超鏈接標簽圖片標簽換行和空格標簽布局標簽input標簽&#xff08;變形金剛&#xff09;form標簽列表標簽 htm…

10 穴 汽車連接器的15個設計特點

汽車行業嚴重依賴卓越的電氣系統來確保功能和可靠性。這些系統的關鍵組件是 10 腔連接器&#xff0c;它為布線和信號傳輸提供解決方案。制造商和工程師必須仔細評估這些連接器的設計特性&#xff0c;以優化性能和安全性。 本博客研究了汽車 10 腔連接器的 15 個設計特征&#…

Summary

一、數據結構 1.1 哈希 主要是HashMap和HashSet&#xff1b;其中HashSet底層是一個HashMap屬性。 // 獲取HashMap元素,HashSet均不支持 map.keySet (); // Set<k> map.values (; // Collection<V> map.entrySet();//Set<Map.Entry<K,V>> for (Map.E…

【Leetcode-Hot100】最小覆蓋子串

題目 解答 想到使用雙指針哈希表來實現&#xff0c;雙指針的left和right控制實現可滿足字符串。 class Solution(object):def minWindow(self, s, t):""":type s: str:type t: str:rtype: str"""len_s, len_t len(s), len(t)hash_map {}for…

Flutter 播放利器:`media_kit` 的詳細介紹與使用指南

在 Flutter 項目中實現音視頻播放&#xff0c;開發者過去主要依賴如 video_player、just_audio 等第三方庫&#xff0c;但這些庫或多或少存在一些局限性&#xff0c;比如平臺兼容性差、定制能力不足、播放格式有限等問題。 而 media_kit 是近年崛起的一款全平臺音視頻播放解決…

4.14【Q】pc homework3

我正在學習并行計算&#xff0c;解決這個問題&#xff1f;詳細解釋&#xff0c;越細節越好 我正在學習并行計算&#xff0c;“首次允許在 taskloop 構造中使用 reduction 子句&#xff0c;并引入了 task_reduction&#xff08;用于 taskgroup 構造&#xff09;和 in_reduction&…

ArrayList vs LinkedList,HashMap vs TreeMap:如何選擇最適合的集合類?

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 在 Java 開發中&#xff0c;集合類的選擇直接影響程序的性能和代碼的可維護性。不同的數據結構適用于不同的場景&#xff0c;盲目使用可能導致內存浪費、性能…

大模型訓練顯存壓縮實戰:ZeRO-3 vs 梯度累積 vs 量化混合策略

一、顯存瓶頸的本質與挑戰 大模型訓練面臨的核心矛盾是模型參數量指數級增長與GPU顯存容量線性提升之間的鴻溝。以175B參數模型為例&#xff0c;其顯存消耗主要來自三個方面&#xff1a; 參數存儲?&#xff1a;FP32精度下需700GB顯存?梯度緩存?&#xff1a;反向傳播產生的…

邊緣計算與隱私計算的融合:構建數據經濟的“隱形護盾“

在數據成為核心生產要素的今天&#xff0c;邊緣計算與隱私計算的交匯正在重塑技術生態。這并非簡單的技術疊加&#xff0c;而是一場關于數據主權、算力分配與信任機制的深度博弈。本文將從"數據流動的拓撲學"視角&#xff0c;探討二者融合如何重構數字社會的基礎設施…

Obsidian 文件夾體系構建 -INKA

Obsidian 文件夾體系構建 -INKA 本篇文章主要分享一下自己折騰學習實踐過的 INKA 框架方法。原地址&#xff1a;Obsidian文件夾體系構建–INKA。 文章目錄 Obsidian 文件夾體系構建 -INKA前言INKA簡介INKA 理論最佳實踐實際應用 反思 前言 上文 Obsidian文件夾體系構建-ACCES…

ocr-不動產權識別

目錄 一、在阿里云申請ocr識別服務 二、創建springboot項目 三、后續 一、在阿里云申請ocr識別服務 在線體驗&#xff1a;房產證圖片上傳 [阿里官方]不動產權證OCR文字識別_API專區_云市場-阿里云 (aliyun.com) 可以選擇一毛500次這個 當然也可以白嫖100 下面有個在線調試…

LeetCode算法題(Go語言實現)_47

題目 給你一個 m x n 的迷宮矩陣 maze &#xff08;下標從 0 開始&#xff09;&#xff0c;矩陣中有空格子&#xff08;用 ‘.’ 表示&#xff09;和墻&#xff08;用 ‘’ 表示&#xff09;。同時給你迷宮的入口 entrance &#xff0c;用 entrance [entrancerow, entrancecol…

The Strict Teacher (Hard Version) 去除無效的干擾!巧妙轉化

文章目錄 The Strict Teacher (Hard Version) 思考問題&#xff01;那么多個人抓一個人&#xff0c;是否是每一個人都是對于最優策略的答案是有貢獻的&#xff1f;答案是否定的&#xff0c;其實問題可以簡化為三種情況&#xff1a; 所有的老師都在大衛的右邊&#xff0c;…

《 Reinforcement Learning for Education: Opportunities and Challenges》全文閱讀

Reinforcement Learning for Education: Opportunities and Challenges 面向教育的強化學習&#xff1a;機遇與挑戰 摘要 本綜述文章源自作者在 Educational Data Mining (EDM) 2021 會議期間組織的 RL4ED 研討會。我們組織了這一研討會&#xff0c;作為一項社區建設工作的組…