[Machine Learning] decision tree 決策樹

(為了節約時間,后面關于機器學習和有關內容哦就是用中文進行書寫了,如果有需要的話,我在目前手頭項目交工以后,用英文重寫一遍)

(祝,本文同時用于比賽學習筆記和機器學習基礎課程)

俺前兩天參加了一個ai類的比賽,其中用到了一種名為baseline的模型來進行一些數據的識別。而這個識別的底層原理就是決策樹。正好原本的學習進度剛剛完成這部分,所以集成一個筆記了,本文中所有的截圖絕大多數來自吳恩達老師的公開課程,為了方便理解,把相關的圖片搬過來了)

決策樹是什么

決策樹是一種機器學習算法,在一個類似二叉樹的結構上實現的分支判斷算法。每個節點都視為一個“判斷語句”,將一批數據劃分成不同的部分。節點上(除了葉子)都要判斷“是”/“否”。

?一個具體化以后的模型差不多長這樣子:給出一堆寵物的數據,根據不同的特征(耳朵,臉型什么的),我們判斷輸入案例是狗還是貓貓。

如果還是不好理解,那么想象一下我們平時在寫代碼時候大量if else嵌套,展開以后也是一模一樣的結構。去別在于可能if構成的判斷樹的后代可能多于決策樹,決策樹只能是二叉樹,輸出“是”“不是”這種問題,當面對多個離散的特征值的時候,我們還有別的技術可以使用.

簡而言之,決策樹是一種區別于神經網絡的另一種判斷算法,在一些數據的處理上可能比神經網絡更快更有效,由于其結構類似二叉樹,所以稱之為決策樹(decision tree).決策樹的生成是要根據已經給出的數據案例創建的,數據有多少特征用于區分,就會有多少個節點進行分裂(split).

具體的訓練過程和訓練中遇到的問題會在下面解釋

在訓練之前要接觸的一些名詞

純凈(purity)/雜質(impurity):純度和不純是根據某個節點來說的,例如我們輸入一堆寵物的數據(包括耳朵形狀,毛發長度,臉型這些特征),在判斷某個屬性的節點上,我們會根據"符合"/"不符合"把已有的數據劃分為兩撥.比如這樣子

?原型的部分中,有四個是貓貓,三個是狗子.對于這個節點來說,我們可以認為這個節點的純度是(4/7)

同理,另一個節點的純度視為(1/3)

(純度是一個相對的概念,如果你判斷的是狗子,那么純度就要變了)

:這個熵不是化學中的概念,而是代表混亂程度,當純度和為0.5的時候,代表兩種東西對半開,也就是最混亂的情況.根據純度,我們有相關的公式可以計算出純度對應熵的大小(假設純度為p)

H(p)=-p\log _{2}(p)-(1-p)\log _{2}(1-p)

整個函數的圖像大概就是這樣子

信息增益:信息增益也是根據某一個點來說的,這個數值是訓練時候的重要依據,信息增益越大,代表整個節點進行的劃分越有效,信息增益的計算方式為

Information\: gain=H(0.5)-W_ {left}H(p_{left})-W_ {right}H(p_{right})

0.5對應的熵,減去左側的熵和右側的熵的加權平均和即可.比如上面的圖,我們可以計算為

H(0.5)-(\frac{7}{10}p_{left}+\frac{3}{10}p_{right})

決策樹如何進行訓練

決策樹底層的訓練原理其實很簡單,首先我們需要給定一個數據集合,這個數據集合中的每個事物都有一些共同的特征,類似這樣,通常我們可以把有效的特征組合起來形成一個表格.

?前面的特征為輸入,而cat一列作為輸出,決定這個寵物到底是不是貓,由此構成一系列符合監督學習要求的訓練數據集合.

然后會從這些信息中,選擇分裂時產生更小熵的特征,算法會基于某種標準(例如信息增益、基尼不純度等)來評估每個可能的劃分,并選擇最優的劃分特征。這些標準用于衡量數據的不純度和分割后的純度。這里我們使用上面講到的信息增益來判斷這個劃分成都

?由此可見,以耳朵形狀作為劃分所產生的分裂節點,信息增益更大,純度也更好.

接下來再根據其他的特征進行劃分即可,當遇到以下幾種情況的時候,我們可以認為這個節點不用再繼續分裂了

  • 樹的高度達到某些限制
  • 純度已經是100%
  • 數據全部低于閾值
  • ........

?兩個特殊情況

(1)分裂時候的數據不是二元的離散數值,而是一個連續的情況

這個很簡單,設置一個閾值,比如0.5,0,7,....反正到最后還是二元的

(2)分裂的時候,可能數據是多元的離散數值,比如毛發可能是長發,短發,卷發這三種.我們總不能搞出三叉樹來,所以這里我們把"是什么"轉變為"是不是"的問題.比如這樣一個特征,我們可以劃分為"是不是長發,是不是短發,是不是卷毛"三個二元的特征

隨機森林算法

給定一個數據集合,我們可以計算出一個決策樹來進行一些判斷,給定一個動物,決策樹最紅會給出我們這個是不是貓貓的答案.但是這有兩個問題,節點不一定是純凈的(雖然大多數情況下,只要不超過我們的限定高度,是可以把一個決策樹修煉到高度純凈的),造成判斷結果不一定準確.

另一個問題就是,一些數據發生擾動以后,可能會影響決策樹這個依托信息增益產生的精密系統.

最簡單粗暴的方法就是,訓練多個樹,形成一個森林.但是一個數據集合練出來的樹是一樣的,沒啥必要,所以我們產生了隨機森林算法.

sampling with replacement(放回抽樣)這東西我們在高中就學過,所以這里不加簡述了.我們要做的就是確定一個規模,比如10,每次從原始數據集中抽取10個案例,然后用來訓練一棵樹.

如此循環多次,我們就能得到多個決策樹,組成一個森林,這其中難免會有一些決策樹是一樣的,我們忽視掉它

這樣我們計算結果的時候,要考慮到整個森林所有樹木的輸出效果,然后綜合考慮我們怎樣確定輸出效果?

XGBoost算法和使用

在眾多隨機森林算法中,XGBoost是一種使用很廣泛的隨機森林算法,并且XGBoost也是一個開源庫(不是放在tf或者pytorch的庫中的).XGBoost非常像我們之前聊過的增強算法(啥,哦博客還沒寫出來,8好意思,盡快補上)

XGBoost算法和普通決策樹的區別在于放回抽樣的不瘋魔,傳統的決策樹是平等地抽取,xgb算法則是會根據上一次,估計錯了哪些數值,在本次抽取中優先提取上一次參與訓練并且估計失敗的數值案例.

比如

?構建某一次決策樹的時候,2,6,8號數據估計錯誤,則下一次會優先提取出這些作為訓練案例之一.

當然這些主要是底層實現了(注意對應的函數從xgboost包中導入,這個包需要提前下載)

下面來看一下具體的使用案例.

pip3 install xgboost
#xgboost算法 這里沒有使用訓練集合什么de
# 定義特征矩陣和標簽
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 0, 1, 1])# 創建并訓練模型
model = XGBClassifier()
model.fit(X, y)# 預測一個數據
data_to_predict = np.array([[2, 3]])
prediction = model.predict(data_to_predict)print(f"預測結果: {prediction}")#xgboost算法 這里沒有使用訓練集合什么de
# 定義特征矩陣和標簽
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 0, 1, 1])# 創建并訓練模型
model = XGBClassifier()
model.fit(X, y)# 預測一個數據
data_to_predict = np.array([[2, 3]])
prediction = model.predict(data_to_predict)print(f"預測結果: {prediction}")

和神經網絡有什么區別捏?

相比于神經網絡來說,決策樹和隨機森林算法更適合一些有固定相似數據結構的數據集合.換句話說,更容易處理那種可以形成表格的數據.

而神經網絡則用來處理一些非相似結構的數據,這一點就是他們的主要區別

決策樹同樣是一種很重要的監督學習算法.

關于baseline(未完待續)

baseline是一種基于決策樹的大模型,適用于多重二元分析等操作,在競賽和論文中應用很廣泛.

(至少與我們之前用到tensorflow要廣泛.....tf都快開擺了)

不過這個模型我現在也不是很熟悉,僅僅是停留在"用過"這個層面上,后面有機會我會繼續在這里補充這個模型的使用和優缺點,

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

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

相關文章

【算法學習】兩數之和II - 輸入有序數組

題目描述 原題鏈接 給你一個下標從 1 開始的整數數組 numbers &#xff0c;該數組已按 非遞減順序排列 &#xff0c;請你從數組中找出滿足相加之和等于目標數 target 的兩個數。如果設這兩個數分別是 numbers[index1] 和 numbers[index2] &#xff0c;則 1 < index1 < …

Springboot MultipartFile文件上傳與下載

yml文件配置是否可以上傳及上傳附件大小 servlet:multipart:# 允許文件上傳enabled: true# 單個文件大小max-file-size: 20MB# 設置總上傳的文件大小max-request-size: 50MB /*** param files* param request* Description 上傳文件* Throws* Return java.util.List* Date 202…

南大通用數據庫(Gbase 8s) 創建UDR外部函數

一、在使用 date_format、from_unixtime、to_days、yearweek 函數時&#xff0c;Gbase 8s 數據庫不支持&#xff0c;可以使用創建 UDR 外部函數來實現 二、登錄命令控制臺或者使用 navicat 連接 Gbase 數據庫 這里使用 navicat &#xff0c;點擊新增連接選擇 PostGreSql 驅動…

動手學深度學習—卷積神經網絡LeNet(代碼詳解)

1. LeNet LeNet由兩個部分組成&#xff1a; 卷積編碼器&#xff1a;由兩個卷積層組成&#xff1b;全連接層密集塊&#xff1a;由三個全連接層組成。 每個卷積塊中的基本單元是一個卷積層、一個sigmoid激活函數和平均匯聚層&#xff1b;每個卷積層使用55卷積核和一個sigmoid激…

LeetCode--HOT100題(35)

目錄 題目描述&#xff1a;23. 合并 K 個升序鏈表&#xff08;困難&#xff09;題目接口解題思路1代碼解題思路2代碼 PS: 題目描述&#xff1a;23. 合并 K 個升序鏈表&#xff08;困難&#xff09; 給你一個鏈表數組&#xff0c;每個鏈表都已經按升序排列。 請你將所有鏈表合…

UDP 的報文結構以及注意事項

UDP協議 1.UDP協議端格式 1.圖中的16位UDP長度,表示整個數據報(UDP首部UDP數據)的最大長度 2.若校驗和出錯,會直接丟棄 2.UDP的報文結構 UDP報文主體分為兩個部分:UDP報頭(占8個字節)UDP載荷/UDP數據 1.源端口號 16位,2個字節 2.目的端口號 16位,2個字節 3.包長度 指示了…

sd-webui安裝comfyui擴展

文章目錄 導讀ComfyUI 環境安裝1. 安裝相關組件2. 啟動sd-webui3. 訪問sd-webui 錯誤信息以及解決辦法 導讀 這篇文章主要給大家介紹如何在sd-webui中來安裝ComfyUI插件 ComfyUI ComfyUI是一個基于節點流程式的stable diffusion的繪圖工具&#xff0c;它集成了stable diffus…

兩個list如何根據一個list中的屬性去過濾掉另一個list中不包含這部分的屬性,用流實現

你可以使用Java 8的流來實現這個功能。假設你有兩個包含對象的List&#xff0c;每個對象有一個屬性&#xff0c;你想根據一個List中的屬性值來過濾掉另一個List中不包含這個屬性值的對象。下面是一種使用流的方式來實現這個功能 import java.util.ArrayList; import java.util…

什么是閉包(closure)?為什么它在JavaScript中很有用?

聚沙成塔每天進步一點點 ? 專欄簡介? 閉包&#xff08;Closure&#xff09;是什么&#xff1f;? 閉包的用處? 寫在最后 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來到前端入門之旅&…

IO流面試題

題目一&#xff1a; 在磁盤中新建一個文件(如果目錄結構不存在&#xff0c;則創建目錄) 文件名&#xff1a;data.txt 文件日錄&#xff1a;C:\demo\test\files (盤符不限) linux目錄~/demo/test/files 題二 在新建的data.txt中添加如下內容&#xff1a; 張三,測試,2019-02-18 …

windows10 安裝WSL2, Ubuntu,docker

AI- 通過docker開發調試部署ChatLLM 閱讀時長&#xff1a;10分鐘 本文內容&#xff1a; window上安裝ubuntu虛擬機&#xff0c;并在虛擬機中安裝docker&#xff0c;通過docker部署數字人模型&#xff0c;通過vscode鏈接到虛擬機進行開發調試.調試完成后&#xff0c;直接部署在云…

優漫動游零基礎如何學習好UI設計

智能時代的來臨&#xff0c;很多企業都越來越注重用戶體驗這一塊&#xff0c;想要有一個吸引用戶的好頁面&#xff0c;UI設計師崗位不可或缺&#xff0c;如今越來越多的人想要學習UI設計技術&#xff0c;那么對于零基礎小白如何學習好UI設計呢? 零基礎小白如何學習好UI設計…

變更通知在開源SpringBoot/SpringCloud微服務中的最佳實踐

目錄導讀 變更通知在開源SpringBoot/SpringCloud微服務中的最佳實踐1. 什么是變更通知2. 變更通知的場景分析3. 變更通知的技術方案3.1 變更通知的技術實現方案 4. 變更通知的最佳實踐總結5. 參考資料 變更通知在開源SpringBoot/SpringCloud微服務中的最佳實踐 1. 什么是變更通…

Ubuntu在自己的項目中使用pcl

1、建立一個文件夾&#xff0c;如pcl_demos&#xff0c;里面建立一個.cpp文件和一個cmake文件 2、打開終端并進入該文件夾下&#xff0c;建立一個build文件夾存放編譯的結果并進入該文件夾 3、對上一級進行編譯 cmake .. 4、生成可執行文件 make 5、運行該可執行文件 6、可視…

最強自動化測試框架Playwright(30)-JS句柄

在 Playwright 中&#xff0c;JSHandle 是一個表示瀏覽器中 JavaScript 對象的類。它提供了與網頁中的 JavaScript 對象進行交互和操作的方法。 可以通過調用 Playwright中的 evaluateHandle 或 evaluate 方法來獲取 JSHandle from playwright.sync_api import sync_playwrig…

微服務中間件-分布式緩存Redis

分布式緩存 a.Redis持久化1) RDB持久化1.a) RDB持久化-原理 2) AOF持久化3) 兩者對比 b.Redis主從1) 搭建主從架構2) 數據同步原理&#xff08;全量同步&#xff09;3) 數據同步原理&#xff08;增量同步&#xff09; c.Redis哨兵1) 哨兵的作用2) 搭建Redis哨兵集群3) RedisTem…

金融語言模型:FinGPT

項目簡介 FinGPT是一個開源的金融語言模型&#xff08;LLMs&#xff09;&#xff0c;由FinNLP項目提供。這個項目讓對金融領域的自然語言處理&#xff08;NLP&#xff09;感興趣的人們有了一個可以自由嘗試的平臺&#xff0c;并提供了一個與專有模型相比更容易獲取的金融數據。…

Java根據List集合中的一個字段對集合進行去重

利用HashSet 創建了一個HashSet用于存儲唯一的字段值&#xff0c;并創建了一個新的列表uniqueList用于存儲去重后的對象。遍歷原始列表時&#xff0c;如果字段值未在HashSet中出現過&#xff0c;則將其添加到HashSet和uniqueList中。 List<Person> originalList new Ar…

VS2015項目中,MFC內存中調用DLL函數(VC6生成的示例DLL)

本例主要講一下&#xff0c;用VC6如何生成DLL&#xff0c;用工具WinHex取得DLL全部內容&#xff0c;VC2015項目加載內存中的DLL函數&#xff0c;并調用函數的示例。 本例中的示例代碼下載&#xff0c;點擊可以下載 一、VC6.0生成示例DLL項目 1.新建項目&#xff0c;…

mysql中的is null和空字符串

相比于oracle&#xff0c;mysql中的is null 和空坑就沒那么多&#xff0c;直接寫就行。 不為空 and (username is not null and username !)注&#xff1a; 不為空中間用的是and。 為空 and (username is null or username !)注&#xff1a; 為空中間用的是or。