国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

機器學(xué)習——boosting之提升樹

這篇具有很好參考價值的文章主要介紹了機器學(xué)習——boosting之提升樹。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

提升樹和adaboost基本流程是相似的

我看到提升樹的時候,懵了
這…跟adaboost有啥區(qū)別???
直到看到有個up主說了,我才稍微懂

機器學(xué)習——boosting之提升樹,機器學(xué)習基礎(chǔ),算法,統(tǒng)計學(xué)習,機器學(xué)習,boosting,人工智能
相當于,我在adaboost里的弱分類器,換成CART決策樹就好了唄?

書上也沒有明說,唉。。。

還好,有大神提升樹的具體講解

看出來了,提升樹主要是做二叉樹分類和回歸的:

  • 如果是處理分類問題,弱分類器用CART決策樹,就是adaboost了
  • 如果是處理回歸問題,弱分類器也是用CART決策樹
    • 每個新的弱分類器都是降低殘差

1. 推導(dǎo)過程

  1. 建立提升樹的加法模型

    • 假設(shè)構(gòu)成第i個弱分類器的參數(shù)為 θ i θ_i θi?,第i個弱分類器則表示為 T ( x , θ i ) T(x,θ_i) T(x,θi?)
    • 當前弱分類器若表示為 T ( x , θ m ) T(x,θ_m) T(x,θm?),強分類器則表示為: f m ( x ) = f m ? 1 ( x ) + T ( x , θ m ) f_m(x) = f_{m-1}(x)+T(x,θ_m) fm?(x)=fm?1?(x)+T(x,θm?)
    • 預(yù)測結(jié)果為 y p r e = f m ( x ) = f m ? 1 ( x ) + T ( x , θ m ) y_{pre}=f_m(x)=f_{m-1}(x)+T(x,θ_m) ypre?=fm?(x)=fm?1?(x)+T(x,θm?)
  2. 損失函數(shù)Loss采用平方誤差損失函數(shù)

    • 使用CART回歸樹作為弱分類器,那么每次選取的特征及特征值,都會使平方誤差損失函數(shù)達到最低
    • 但弱分類器是不需要完全CART回歸樹一次性就把所有特征及特征值都遍歷訓(xùn)練完成的,只需要挑選平方損失函數(shù)最低的那個特征及特征值
      弱分類器,只進行一個樹杈的劃分
    • 弱分類器內(nèi)部的平方損失函數(shù),是取二分樹杈的左右兩個數(shù)據(jù)集的平方損失之和最小
      L o s s t r e e = ∑ ( y i l e f t ? y ˉ l e f t ) 2 + ∑ ( y j r i g h t ? y ˉ r i g h t ) 2 Loss_{tree} = ∑(y_i^{left}-\bar{y}_{left})^2+ ∑(y_j^{right}-\bar{y}_{right})^2 Losstree?=(yileft??yˉ?left?)2+(yjright??yˉ?right?)2
    • 強分類器的平方損失函數(shù),是取所有樣本的預(yù)測值與真實值的平方損失之和最小
      L o s s = ∑ ( y i ? y i p r e ) 2 Loss = ∑(y_i-y_i^{pre})^2 Loss=(yi??yipre?)2, y i y_i yi?表示真實值, y i p r e y_i^{pre} yipre?表示預(yù)測值

    用來選取弱分類器的特征及特征值,進而將所有樣本數(shù)據(jù)劃分成兩個子集
    每個子集的預(yù)測值,是子集的均值

    • 根據(jù) y p r e = f m ( x ) = f m ? 1 ( x ) + T ( x , θ m ) y_{pre}=f_m(x)=f_{m-1}(x)+T(x,θ_m) ypre?=fm?(x)=fm?1?(x)+T(x,θm?),可得
      • L o s s = ∑ ( y i ? f m ? 1 ( x ) ? T ( x , θ m ) ) 2 Loss=∑(y_i-f_{m-1}(x)-T(x,θ_m))^2 Loss=(yi??fm?1?(x)?T(x,θm?))2
      • 其中 y i ? f m ? 1 ( x ) y_i-f_{m-1}(x) yi??fm?1?(x)表示上次強分類器的預(yù)測值與實際值的差,一般叫做殘差(殘留的差值)
      • 我們可以設(shè)為 r i = y i ? f m ? 1 ( x ) r_i = y_i-f_{m-1}(x) ri?=yi??fm?1?(x),表示殘差
      • 那么 要使Loss達到最小,只需要當前的弱分類器,盡可能地擬合殘差即可, L o s s = ∑ ( r i ? T ( x , θ m ) ) 2 Loss=∑(r_i-T(x,θ_m))^2 Loss=(ri??T(x,θm?))2
      • 那么我們無需求出當前弱分類器的參數(shù) θ,只要計算出每次的強分類器后的殘差,再新增一個弱分類器,對殘差進行CART回歸樹的擬合即可
  3. 每次只對殘差擬合,直到Loss函數(shù)達到某個極小的閾值、特征及特征值已完全分完了,或達到迭代次數(shù)即可

2. 程序推演

設(shè)置閾值
獲取所有特征及特征值
第一輪:

  1. 更改CART決策樹,讓它只每次只選擇一個特征及特征值,劃分數(shù)據(jù)集
  2. 每次劃分后,計算出當前弱分類器的預(yù)測值 T m ( x , θ ) T_m(x,θ) Tm?(x,θ)——對樣本的數(shù)值預(yù)測
  3. 計算出強分類器的預(yù)測值 f m = f m ? 1 + T ( x , θ ) f_m=f_{m-1}+T(x,θ) fm?=fm?1?+T(x,θ)
  4. 再計算所有樣本的殘差(預(yù)測值-真實值)
  5. 計算強分類器的平方損失函數(shù)Loss,判斷是否低于閾值,若低于閾值,停止程序

第二輪:

  1. 根據(jù)殘差,再用CART決策樹,選擇一個特征及特征值,劃分數(shù)據(jù)集
  2. 每次劃分后,計算出當前弱分類器的預(yù)測值 T m ( x , θ ) T_m(x,θ) Tm?(x,θ)——對樣本更新后的殘差預(yù)測
  3. 計算出強分類器的預(yù)測值 f m = f m ? 1 + T ( x , θ ) f_m=f_{m-1}+T(x,θ) fm?=fm?1?+T(x,θ)
  4. 再計算所有樣本殘差的殘差(預(yù)測值-殘差值)
  5. 計算強分類器的平方損失函數(shù)Loss,判斷是否低于閾值,若低于閾值,停止程序

第三輪同第二輪…

perfect!

二叉回歸樹代碼

確實,預(yù)測值的還不錯的感覺,但不知道會不會過擬合,還沒用測試數(shù)據(jù)去試。。。大概率是會過擬合的吧。。。
最終預(yù)測值和原值的殘差,呈正態(tài)分布,且大多數(shù)聚集在0附近,本來想做個配對樣本T檢驗的。。。但好像均值差距太小,搞不起來
機器學(xué)習——boosting之提升樹,機器學(xué)習基礎(chǔ),算法,統(tǒng)計學(xué)習,機器學(xué)習,boosting,人工智能

機器學(xué)習——boosting之提升樹,機器學(xué)習基礎(chǔ),算法,統(tǒng)計學(xué)習,機器學(xué)習,boosting,人工智能文章來源地址http://www.zghlxwxcb.cn/news/detail-703925.html

import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
pd.options.display.max_columns = None
pd.options.display.max_rows = None
# 獲取所需數(shù)據(jù):'推薦分值', '專業(yè)度','回復(fù)速度','服務(wù)態(tài)度','推薦類型'
datas = pd.read_excel('./datas4.xlsx')
important_features = ['專業(yè)度','回復(fù)速度','服務(wù)態(tài)度','推薦分值'] #

datas_1 = datas[important_features]
Y = datas_1['推薦分值']
X = datas_1.drop('推薦分值',axis=1)
X_features = X.columns
Y_features = '推薦分值'


# 設(shè)置閾值
# 獲取所有特征及特征值
# 單次:
# 1. 更改CART決策樹,讓它只每次只選擇一個特征及特征值,劃分數(shù)據(jù)集
# 2. 每次劃分后,計算出當前弱分類器的預(yù)測值$T_m(x,θ)$
# 3. 計算出強分類器的預(yù)測值$f_m=f_{m-1}+T(x,θ)$
# 4.  **再計算并更新所有樣本的殘差(預(yù)測值-真實值)**
# 5. 計算強分類器的平方損失函數(shù)Loss,判斷是否低于閾值,若低于閾值,停止程序
class CartRegTree:
    def __init__(self,datas,Y_feat,X_feat):
        self.tree_num = 0
        self.datas = datas
        self.Y_feat = Y_feat
        self.X_feat = X_feat
        self.all_feat_and_point = self.get_feat_and_point()
        self.T = {} # 用于存儲所有弱分類器
        self.last_Loss = 0
    # 獲取所有特征及特征值
    def get_feat_and_point(self):
        all_feat_and_point = {}
        for i in self.X_feat:
            divide_points = self.datas[i].unique()
            points = [j for j in divide_points]
            all_feat_and_point[i]=points
        return all_feat_and_point
    def get_tree_name(self):
        self.tree_num += 1
        return 'T'+str(self.tree_num)
    def get_subtree(self,datas):
        # 1. 選擇最優(yōu)的特征及特征值,劃分數(shù)據(jù)集
        min_Loss = None
        feat_and_point = None
        for feat,points in self.all_feat_and_point.items():
            for point in points:
                temp_Loss = self.get_Loss_tree(datas,feat,point)
                if min_Loss == None or temp_Loss<min_Loss:
                    min_Loss = temp_Loss
                    feat_and_point = (feat,point)

        left_datas = datas[datas[feat_and_point[0]]<=feat_and_point[1]]
        right_datas = datas[datas[feat_and_point[0]] > feat_and_point[1]]
        # 2.計算出當前弱分類器的預(yù)測值,存儲左右子樹的預(yù)測值
        left_Y = left_datas[self.Y_feat].mean()
        right_Y = right_datas[self.Y_feat].mean()
        T_name = self.get_tree_name()
        self.T[T_name]={'feat':feat_and_point[0],
                        'point':feat_and_point[1],
                        'left_Y':left_Y,
                        'right_Y':right_Y}
        # 3. 計算并更新所有樣本的殘差,
        datas['Tm'] = np.where(datas[feat_and_point[0]]<=feat_and_point[1],left_Y,right_Y)
        datas[self.Y_feat] = datas[self.Y_feat]-datas['Tm']
        # 4. 計算殘差平方和,判斷是否停止
        Loss = round((datas[self.Y_feat]**2).sum(),2)
        if Loss==self.last_Loss or self.tree_num>10**3:
            return self.T
        else:
            self.last_Loss = Loss
            self.get_subtree(datas)

    def get_Loss_tree(self,datas,feat,point):
        left_datas = datas[datas[feat]<=point]
        right_datas = datas[datas[feat]>point]
        # 求左右兩邊的平方損失和
        left_mean = left_datas[self.Y_feat].mean()
        right_mean = right_datas[self.Y_feat].mean()
        left_r = left_datas[self.Y_feat]-left_mean
        right_r = right_datas[self.Y_feat]-right_mean
        left_loss = (left_r**2).sum()
        right_loss = (right_r**2).sum()
        Loss = left_loss+right_loss
        return Loss
    def predict_one(self,data):
        Y_temp = 0
        for tree_key,tree_value in self.T.items():
            feat = tree_value['feat']
            point = tree_value['point']
            left_Y = tree_value['left_Y']
            right_Y = tree_value['right_Y']
            if data[feat]<=point:
                Y_temp += left_Y
            else:
                Y_temp += right_Y
        return Y_temp
    def predict(self,datas):
        Y_pre_all = datas.apply(self.predict_one,axis=1)
        return Y_pre_all
# 應(yīng)用了pandas中的apply函數(shù),將每行數(shù)據(jù)都進行predict運算預(yù)測
tree = CartRegTree(datas_1,Y_features,X_features)
tree.get_subtree(datas_1)
Y_hat = tree.predict(datas_1)
lenth = len(Y_hat)
result = pd.DataFrame([[i[0],i[1],i[2]] for i in zip(Y,Y_hat,Y-Y_hat)])
# result = pd.DataFrame([list(Y),list(Y_hat),list(Y-Y_hat)])
print(result)
# print(f"{Y},{Y_hat},殘差:{Y-Y_hat}")

writer = pd.ExcelWriter('datas_reg_result.xlsx')
# 獲取所需數(shù)據(jù)
result.to_excel(writer,"result")
writer._save()

到了這里,關(guān)于機器學(xué)習——boosting之提升樹的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 解密人工智能:KNN | K-均值 | 降維算法 | 梯度Boosting算法 | AdaBoosting算法

    解密人工智能:KNN | K-均值 | 降維算法 | 梯度Boosting算法 | AdaBoosting算法

    機器學(xué)習算法是一種基于數(shù)據(jù)和經(jīng)驗的算法,通過對大量數(shù)據(jù)的學(xué)習和分析,自動發(fā)現(xiàn)數(shù)據(jù)中的模式、規(guī)律和關(guān)聯(lián),并利用這些模式和規(guī)律來進行預(yù)測、分類或優(yōu)化等任務(wù)。機器學(xué)習算法的目標是從數(shù)據(jù)中提取有用的信息和知識,并將其應(yīng)用于新的未知數(shù)據(jù)中。 機器學(xué)習算法

    2024年01月22日
    瀏覽(16)
  • 【人工智能】機器學(xué)習算法綜述及常見算法詳解

    【人工智能】機器學(xué)習算法綜述及常見算法詳解

    目錄 推薦 1、機器學(xué)習算法簡介 1.1 機器學(xué)習算法包含的兩個步驟 1.2 機器學(xué)習算法的分類 2、線性回歸算法 2.1 線性回歸的假設(shè)是什么? 2.2 如何確定線性回歸模型的擬合優(yōu)度? 2.3 如何處理線性回歸中的異常值? 3、邏輯回歸算法 3.1 什么是邏輯函數(shù)? 3.2 邏輯回歸可以用于多類

    2024年04月22日
    瀏覽(33)
  • 人工智能技術(shù)基礎(chǔ)系列之:機器學(xué)習基礎(chǔ)

    作者:禪與計算機程序設(shè)計藝術(shù) 在互聯(lián)網(wǎng)的飛速發(fā)展和計算機的高計算性能的驅(qū)動下,人工智能迎來了新的時代。機器學(xué)習作為人工智能領(lǐng)域的一個重要分支,是實現(xiàn)這一目標的一種方法。本文將從機器學(xué)習的基本概念出發(fā),介紹機器學(xué)習的一些基本術(shù)語、概率論基礎(chǔ)、算法

    2024年02月07日
    瀏覽(96)
  • 人工智能-機器學(xué)習-深度學(xué)習-分類與算法梳理

    人工智能-機器學(xué)習-深度學(xué)習-分類與算法梳理

    目前人工智能的概念層出不窮,容易搞混,理清脈絡(luò),有益新知識入腦。 為便于梳理,本文只有提綱,且筆者準備倉促,敬請勘誤,不甚感激。 符號主義(Symbolists) 基于邏輯推理的智能模擬方法。最喜歡的算法是:規(guī)則和決策樹。符號主義的代表性成果有啟發(fā)式程序、專家系

    2024年02月03日
    瀏覽(31)
  • 人工智能-10種機器學(xué)習常見算法

    人工智能-10種機器學(xué)習常見算法

    機器學(xué)習是目前行業(yè)的一個創(chuàng)新且重要的領(lǐng)域。今天,給大家介紹機器學(xué)習中的10種常見的算法,希望可以幫助大家適應(yīng)機器學(xué)習的世界。 線性回歸(Linear Regression)是目前機器學(xué)習算法中最流行的一種,線性回歸算法就是要找一條直線,并且讓這條直線盡可能地擬合散點圖中的

    2023年04月08日
    瀏覽(89)
  • 《人工智能-機器學(xué)習》數(shù)據(jù)預(yù)處理和機器學(xué)習算法(以企鵝penguins數(shù)據(jù)集為例)

    《人工智能-機器學(xué)習》數(shù)據(jù)預(yù)處理和機器學(xué)習算法(以企鵝penguins數(shù)據(jù)集為例)

    本項目使用到的數(shù)據(jù)集鏈接: https://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/6tree/penguins_raw.csv 加載給定或者自行選定的數(shù)據(jù)集,對數(shù)據(jù)進行查看和理解,例如樣本數(shù)量,各特征數(shù)據(jù)類型、分布、特征和標簽所表達的含義等,然后對其進行數(shù)據(jù)預(yù)處理工作,包括但不限于對敏感數(shù)據(jù)

    2024年02月10日
    瀏覽(25)
  • MATLAB算法實戰(zhàn)應(yīng)用案例精講-【人工智能】ROS機器人(基礎(chǔ)篇)(二)

    目錄 算法原理 跨不同ROS系統(tǒng)的通信 實現(xiàn)步驟 ROS2 robot-localization配置 使用方式 配置robot-localization

    2024年02月22日
    瀏覽(28)
  • 人工智能|機器學(xué)習——DBSCAN聚類算法(密度聚類)

    人工智能|機器學(xué)習——DBSCAN聚類算法(密度聚類)

    DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一種基于密度的聚類算法,簇集的劃定完全由樣本的聚集程度決定。聚集程度不足以構(gòu)成簇落的那些樣本視為噪聲點,因此DBSCAN聚類的方式也可以用于異常點的檢測。 算法的關(guān)鍵在于樣本的‘聚集程度’,這個程度的刻畫

    2024年04月10日
    瀏覽(22)
  • 人工智能基礎(chǔ)_機器學(xué)習006_有監(jiān)督機器學(xué)習_正規(guī)方程的公式推導(dǎo)_最小二乘法_凸函數(shù)的判定---人工智能工作筆記0046

    人工智能基礎(chǔ)_機器學(xué)習006_有監(jiān)督機器學(xué)習_正規(guī)方程的公式推導(dǎo)_最小二乘法_凸函數(shù)的判定---人工智能工作筆記0046

    我們來看一下公式的推導(dǎo)這部分比較難一些, 首先要記住公式,這個公式,不用自己理解,知道怎么用就行, 比如這個(mA)T 這個轉(zhuǎn)置的關(guān)系要知道 然后我們看這個符號就是求X的導(dǎo)數(shù),X導(dǎo)數(shù)的轉(zhuǎn)置除以X的導(dǎo)數(shù),就得到單位矩陣, 可以看到下面也是,各種X的導(dǎo)數(shù),然后計算,得到對應(yīng)的矩陣

    2024年02月08日
    瀏覽(98)
  • 【人工智能的數(shù)學(xué)基礎(chǔ)】瑞利商在機器學(xué)習中的應(yīng)用

    Rayleigh Quotient and Generalized Rayleigh Quotient. 瑞利商的定義 瑞利商的性質(zhì) 廣義瑞利商 瑞利商在機器學(xué)習中的應(yīng)用 對于一個 Hermitan 矩陣

    2024年02月07日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包