機器學習通關秘籍|Day 03:決策樹、隨機森林與線性回歸

目錄

一、決策樹

1、概念

2、基于信息增益的決策樹的建立

(1)信息熵

(2)信息增益

(3)信息增益決策樹建立步驟

3、基于基尼指數的決策樹的建立

4、API

二、隨機森林

1、算法原理

2、API

三、線性回歸

1、回歸

2、線性回歸

3、損失函數

4、多參數回歸

5、最小二乘法

6、API

四、總結


一、決策樹

1、概念

????????決策樹是一種常用的機器學習算法,用于解決 分類和回歸問題。它通過遞歸地將數據集劃分為子集,構建一棵樹形結構,每個節點代表一個特征或屬性的判斷條件,葉子節點表示最終的分類結果。

2、基于信息增益的決策樹的建立

????????決策樹的核心思想是通過選擇最優的特征進行劃分,從而減少數據的不確定性。以下是基于信息增益的決策樹建立步驟:

(1)信息熵

信息熵描述的是 不確定性。信息熵越大,不確定性越大。信息熵的值越小,則X的純度越高。

信息熵是衡量數據集純度的一個指標,公式如下:

示例: 假設一個數據集中有 10 個樣本,其中 6 個屬于類別 A,4 個屬于類別 B,則信息熵為:

(2)信息增益

????????信息增益(Information Gain)是決策樹中用于選擇最優分裂特征的核心指標。它的基本思想是:選擇能夠最大程度降低數據不確定性的特征進行劃分。不確定性由信息熵衡量,信息增益越大,說明使用該特征劃分后,數據變得更“純凈”,分類效果更好。???????

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

(3)信息增益決策樹建立步驟

????????下面我們通過一個具體例子來詳細計算信息增益:

假設我們有一個數據集共 10 個樣本,目標是預測用戶是否會購買某產品(類別 A:購買,類別 B:不購買)。我們考慮使用“天氣”這一特征進行劃分,其分布如下:

天氣樣本數購買不購買

晴天

6

5

1

雨天

4

1

3

總計

10

6

4

我們的目標是計算使用“天氣”作為分裂特征時的信息增益。

第一步:計算原始數據集的信息熵 H(X)

原始數據集中:

信息熵為:

計算對數值(可使用計算器):

代入:

第二步:計算每個子集的信息熵 H(Xv?)
(a) 晴天子集(6 個樣本)

(b) 雨天子集(4 個樣本)

第三步:計算加權平均熵


第四步:計算信息增益

信息增益與決策判斷的關系

  • 信息增益越大,說明該特征對分類的幫助越大。在這個例子中,“天氣”帶來了 0.256 的信息增益,意味著通過“天氣”劃分后,整體數據的不確定性顯著下降。

  • 在構建決策樹時,我們會比較所有特征的信息增益,選擇增益最大的特征作為當前節點的分裂依據。

  • 例如,如果另一個特征“溫度”的信息增益是 0.32,大于“天氣”的 0.256,那么我們就會優先選擇“溫度”進行分裂。

  • 這體現了決策樹的貪心策略:每一步都選擇當前最優的特征,逐步構建一棵高效的分類樹。

3、基于基尼指數的決策樹的建立

基尼指數是另一種衡量數據集純度的指標,公式如下:

基尼指數越小,數據集的純度越高。

4、API

代碼示例:

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.model_selection import train_test_split
x, y = load_iris(return_X_y=True)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)
# 創建決策樹模型
model = DecisionTreeClassifier()
model.fit(x_train, y_train)
print(model.score(x_test, y_test))y_pred = model.predict([[4.3, 2.6, 1.5, 1.3]])
print(y_pred)
# 導出已經構建的據冊數
export_graphviz(model, out_file='../src/tree.txt', feature_names=['花萼長度', '花萼寬度', '花瓣長度', '花瓣寬度'])

結果展示:


二、隨機森林

? ? ? ? 森林,顧名思義,就是有很多棵樹。

1、算法原理

????????隨機森林是一種基于決策樹的集成學習方法,通過構建多棵決策樹并結合它們的預測結果來提高模型的泛化能力。其核心思想包括:

  • Bootstrap 抽樣:從原始數據集中有放回地抽取多個子集,每棵樹使用不同的子集進行訓練。

  • 隨機特征選擇:在每個節點分裂時,只考慮一部分隨機選擇的特征,而不是全部特征。

  • 投票機制:對于分類任務,最終預測結果是所有樹的多數投票結果;對于回歸任務,最終預測結果是所有樹的平均值。

2、API

RandomForestClassifier ( n_estimators=100,? max_depth=5,? criterion='entropy' )

n_estimators: 樹的數量,????????????????

max_depth: 樹的最大深度,

criterion: 評價標準(entropy: 熵, gini: 基尼系數)

代碼示例:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
# 加載數據集
x, y = load_iris(return_X_y=True)
# 數據集劃分
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)
# 標準化
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)
# 創建隨機森林模型 n_estimators: 樹的數量, max_depth: 樹的最大深度, criterion: 評價標準(entropy: 熵, gini: 基尼系數)
model = RandomForestClassifier(n_estimators=100, max_depth=5, criterion='entropy')
model.fit(x_train, y_train)
score = model.score(x_test, y_test)
print(score)
# 預測新數據
y = model.predict([[1.3,2.5,1.1,0.5]])
print(y)

結果展示:


三、線性回歸

1、回歸

????????回歸的目的是預測數值型的目標值y。最直接的辦法是依據輸入x寫出一個目標值y的計算公式。假如你想預測某人的體重(因變量),根據他的身高(自變量)。通過收集一些人的身高和體重數據,我們可以找到它們之間的關系。

張三的體重? ? =? ? 0.86? ? *? ? 張三的身高? ? -? ? ? 0.5? ? ?*? ? ? ?張三的運動時間

這就是所謂的回歸方程(regression equation),其中的? 0.86 和 0.5? 稱為回歸系數(regression weights),求這些回歸系數的過程就是回歸。一旦有了這些回歸系數,再給定輸入,做預測就非常容易了。具體的做法是用回歸系數乘以輸入值,再將結果全部加在一起,就得到了預測值。

2、線性回歸

  • 概念:線性回歸是回歸的一種,它假設因變量與自變量之間存在線性關系。也就是說,可以用一條直線來近似描述它們的關系。

  • 例子:如果身高和體重的關系是線性的,那么我們可以畫一條直線,這條直線可以表示為:

    其中,“斜率”表示身高每增加1單位,體重平均增加多少;“截距”表示當身高為0時的體重值(雖然實際中身高不可能為0,但這是數學上的起點)。

3、損失函數

(1)線性方程

? ? ? ? 我們為了讓我們得到的 方程 (模型)更加地貼近真實值,盡可能地提高準確率,由此提出了損失函數。

我們假設 這個最優的方程是:

這樣的直線隨著w和b的取值不同 可以畫出無數條

(2)為了求解最優值,我們引入損失函數

在這無數條中,哪一條是比較好的呢?

我們有很多方式認為某條直線是最優的,其中一種方式:均方差

就是每個點到線的豎直方向的距離平方 求和 在平均 最小時 這條直接就是最優直線

????????可能很多讀者會疑惑一個問題:為什么我們要取豎直方向上的差值?而不是對于這一點向直線做垂線求距離呢?

????????我們只需要搞清楚,直線上的點 代表著 預測值 ,而 樣本點的 y 值代表了真實值,所以豎直距離上的差值,就是 誤差

然后計算 表示第一個點的真實值和計算值的差值 ,然后把第二個點,第三個點...最后一個點的差值全部算出來

有的點在上面有點在下面,如果直接相加有負數和正數會抵消,體現不出來總誤差,平方后就不會有這個問題了

所以最后:

總誤差(也就是傳說中的? 損失? ):

平均誤差(總誤差會受到樣本點的個數的影響,樣本點越多,該值就越大,所以我們可以對其平均化,求得平均值,這樣就能解決樣本點個數不同帶來的影響)

這樣就得到了傳說中的損失函數:

(此處的 x值 任取,只是舉個例子)

怎么樣讓這個損失函數的值最小呢?

(3)利用初中拋物線的知識或者高中的求導知識求得最低點

我們先假設b=0

然后就簡單了 ,算 w 在什么情況下損失函數的值最小(?初中的拋物線求頂點?的橫坐標,?高中求導數為0時)

求得w=0.795時損失函數取得最小值

那我們最終那個真理函數(最優解)就得到了

注意:

  1. 實際數據中 x 和 y 組成的點 不一定是全部落在一條直線上
  2. 我們假設有這么一條直線 y=wx+b 是最符合描述這些點的
  3. 最符合的條件就是這個方程帶入所有x計算出的所有y與真實的y值做 均方差計算
  4. 找到均方差最小的那個w
  5. 這樣就求出了最優解的函數(前提條件是假設b=0)

4、多參數回歸

  • 概念:多參數回歸是指自變量不止一個的情況。例如,除了身高外,還可能考慮年齡、性別等因素來預測體重。

  • 例子:如果我們不僅用身高預測體重,還加入年齡作為另一個自變量,那么線性回歸的公式就變成了:

    這里有兩個斜率,分別表示身高和年齡對體重的影響。

5、最小二乘法

  • 概念:最小二乘法是一種優化方法,用于求解線性回歸中的參數(如斜率和截距),使得損失函數(通常是均方誤差)最小化。

  • 目標:找到一組參數,使得損失函數最小。

  • 求解方法:可以通過解析法(如正規方程)或數值優化方法(如梯度下降)來求解最小化問題。

    • 正規方程(適用于小規模數據):

      其中:

    • 梯度下降(適用于大規模數據):

      其中:

  • 例子:假設我們有幾組身高和體重的數據,最小二乘法會調整直線的位置(即調整斜率和截距),使得所有數據點到直線的距離平方和最小。這樣得到的直線就是最佳擬合直線。

6、API

代碼示例:

from sklearn.linear_model import LinearRegression
import numpy as np
# 創建具有8個特征和1個目標值的數據集
data=np.array([[0,14,8,0,5,-2,9,-3,399],[-4,10,6,4,-14,-2,-14,8,-144],[-1,-6,5,-12,3,-3,2,-2,30],[5,-2,3,10,5,11,4,-8,126],[-15,-15,-8,-15,7,-4,-12,2,-395],[11,-10,-2,4,3,-9,-6,7,-87],[-14,0,4,-3,5,10,13,7,422],[-3,-7,-2,-8,0,-6,-5,-9,-309]])
# 取全部行,除了最后一列的全部列,也就是八個特征
x = data[:, :-1]
# 取全部行,最后一列,也就是目標值
y = data[:, -1]
print(x)
print(y)
# 創建線性回歸模型
model = LinearRegression()
# 訓練
model.fit(x, y)
# 權重
print("w:",model.coef_)
# 偏置
print("b:", model.intercept_)
# 預測新數據
y_pred = model.predict([[-4,10,6,4,-14,-2,-14,8]])
print(y_pred)

結果展示:


四、總結

  • 決策樹 是一種基于樹形結構的分類和回歸算法,通過信息增益或基尼指數進行特征選擇。

  • 隨機森林 是基于決策樹的集成學習方法,通過 Bootstrap 抽樣和隨機特征選擇提高模型的泛化能力。

  • 線性回歸 是一種簡單的回歸模型,通過最小二乘法或梯度下降等方法求解權重參數。

希望這篇博客對你有所幫助!如果有任何問題,歡迎進一步討論。

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

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

相關文章

C++進階—C++的類型轉換

第一章:C語言中的類型轉換在C語言中,如果賦值運算符左右兩側類型不同,或者形參與實參類型不匹配,或者返回值類型與接收返回值類型不一致時,就需要發生類型轉化,C語言中總共有兩種形式的類型轉換&#xff1a…

基于Flask的微博話題多標簽情感分析系統設計

基于Flask的微博話題情感分析系統設計與實現 一、項目概述 本項目是一個輕量化的微博話題情感分析系統,通過Flask框架整合情感分析模型,實現對微博話題及評論的情感標簽識別與結果展示。系統面向普通用戶和研究者,提供簡單易用的操作界面&…

TDengine 中 TDgpt 的模型評估工具

模型評估工具 TDgpt 在企業版中提供預測分析模型和異常檢測模型有效性評估工具 analytics_compare,該工具能夠使用 TDengine 中的時序數據作為 回測依據,評估不同預測模型或訓練模型的有效性。該工具在開源版本中不可用使用評估工具,需要在其…

【DL學習筆記】DataLoader類功能和參數說明

文章目錄一、Dataset 與 DataLoader 功能介紹抽象類Dataset的作用DataLoader 作用兩者關系二、torch.utils.data.DataLoader代碼示例常用參數圖示num_workers設置多少合適數據加載子進程如何并行的pin_memorysampler兩種sampler順序采樣 SequentialSampler隨機采樣 RandomSampl…

JVM中年輕代、老年代、永久代(或元空間)、Eden區和Survivor區概念介紹

在Java虛擬機(JVM)中,內存管理是自動化的,這主要通過垃圾回收機制實現。JVM將堆內存劃分為不同的區域,以便更高效地管理和回收對象。以下是關于年輕代、老年代、永久代(或元空間)、Eden區和Surv…

譯 | BBC Studios團隊:貝葉斯合成控制方法SCM的應用案例

來自上傳文件中的文章《Using Causal Inference for Measuring Marketing Impact: How BBC Studios Utilises Geo Holdouts and CausalPy》 本篇介紹了在傳統A/B測試不適用時,如何利用貝葉斯合成控制方法和地理區域保留來評估營銷活動效果。其亮點在于通過構建“反事…

Web開發-PHP應用TP框架MVC模型路由訪問模版渲染安全寫法版本漏洞

我們先使用/index.php/index/index/test,就是圖中的test()方法 /index.php/index/index/index,這個回顯就是111 http://127.0.0.1:83/index.php/index/index/test2?x123456 public function test2() {$x$_GET[x];return $x; } 這里再做一個案例更詳細一…

FreeRTOS列表系統深度解析

FreeRTOS列表系統深度解析 一、核心數據結構 1. 列表控制塊 (List_t) typedef struct xLIST {volatile UBaseType_t uxNumberOfItems; // 當前列表項數量ListItem_t * pxIndex; // 遍歷指針(用于輪詢調度)MiniListItem_t xListEnd; …

《Linux編譯器:gcc/g++食用指南》

堅持用 清晰易懂的圖解 代碼語言,讓每個知識點變得簡單! 🚀呆頭個人主頁詳情 🌱 呆頭個人Gitee代碼倉庫 📌 呆頭詳細專欄系列 座右銘: “不患無位,患所以立。” 《Linux編譯器:GCC…

SparkKV轉換算子實戰解析

目錄 KV算子 parallelizePairs mapToPair mapValues groupByKey reduceByKey sortByKey 算子應用理解 reduceByKey和groupByKey的區別 groupByKeymapValues實現KV數據的V的操作 改進用reduceByKey groupby通過K和通過V分組的模板代碼 問題集錦 寶貴的經驗 這里會…

深度解析 TCP 三次握手與四次揮手:從原理到 HTTP/HTTPS 的應用

TCP 的三次握手和四次揮手是網絡通信的基石,無論是 HTTP 還是 HTTPS,它們都依賴 TCP 提供可靠的傳輸層服務。本文將用萬字篇幅,結合 Mermaid 圖表和代碼示例,深入講解 TCP 三次握手、四次揮手的原理、過程、狀態變化,以…

Hyper-V + Centos stream 9 搭建K8s集群(一)

一、創建虛擬機一臺32G內存,16核心的Win11,已經安裝了Hyper-V 管理器。然后也下載了CentOS-Stream-9-latest-x86_64-dvd1.iso的鏡像文件。這里Hyper-V創建虛擬機的過程就不贅述了,如果出現虛擬機加載不到鏡像的問題,先把這個使用安…

Pygame如何制作小游戲

以下是 Pygame 的詳細使用指南,從安裝到開發完整游戲的步驟說明,包含代碼示例和最佳實踐: 一、安裝與環境配置 1. 安裝 Pygame pip install pygame2. 驗證安裝 import pygame pygame.init() print(pygame.version.ver) # 應輸出版本號&am…

@【JCIDS】【需求論證】聯合能力集成與開發系統知識圖譜

JCIDS(聯合能力集成與開發系統)知識圖譜 1. JCIDS概述 2. JCIDS的提出背景 3. JCIDS核心流程 4. JCIDS分析方法 5. JCIDS優勢 6. JCIDS與采辦系統的關系 7. JCIDS知識圖譜結構 8. 對我的啟示 9.JCIDS(聯合能力集成與開發系統)相關術語列表 10. 參考文獻 1. JCIDS概述 定義:…

每天學一個Linux命令(38):vi/vim

每天學一個 Linux 命令(38):vi/vim vi 和 vim(Vi IMproved)是 Linux 和 Unix 系統中功能強大的文本編輯器。vim 是 vi 的增強版,提供語法高亮、多級撤銷、插件支持等更多功能。掌握 vi/vim 是 Linux 系統管理員的必備技能之一。 1. 命令簡介 vi:經典的文本編輯器,幾乎…

【PZ-ZU49DR-KFB】:璞致電子 UltraScale+ RFSoC 架構下的軟件無線電旗艦開發平臺

璞致電子 PZ-ZU49DR-KFB 開發板基于 Xilinx ZYNQ UltraScale RFSoC XCZU49DR 主控制器,以 "ARMFPGA 異構架構" 為核心,融合高帶寬信號采集、高速數據處理與靈活擴展能力,專為專業工程師打造的軟件無線電(SDR&#xff09…

力扣106:從中序與后序遍歷序列構造二叉樹

力扣106:從中序與后序遍歷序列構造二叉樹題目思路代碼題目 給定兩個整數數組 inorder 和 postorder ,其中 inorder 是二叉樹的中序遍歷, postorder 是同一棵樹的后序遍歷,請你構造并返回這顆 二叉樹 。 思路 我們首先要知道中序遍歷和后序…

IDEA JAVA工程入門

Maven配置: IDEA -> settings -> Build, Execution, Deployment -> Build Tools -> MavenMaven home pathUser setting file : 特定倉庫下載依賴包,自動下載(界面右邊M圖標點開,)local repository (本地倉庫&#xff…

Spring依賴注入:從原理到實踐的自學指南

Spring依賴注入:從原理到實踐的自學指南 一、什么是依賴注入? 依賴注入(Dependency Injection, DI)是Spring框架實現控制反轉(IoC)的核心手段。其核心思想是:對象不再自己創建依賴項&#xff…

3_軟件重構_組件化開發實例方法論

1、上期回顧上次內容核心的地方有兩個,①是C多態基類的指針指向派生類,用于初始化各個插件。②是使用C語言的dlopen函數“動態加載”各個插件,實現用戶根據契約接口自定義開發插件,極大程度地實現了軟件上的解耦。③再進一步&…