偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

梯度提升算法決策過程的逐步可視化

人工智能 機(jī)器學(xué)習(xí)
梯度提升算法是最常用的集成機(jī)器學(xué)習(xí)技術(shù)之一,該模型使用弱決策樹序列來(lái)構(gòu)建強(qiáng)學(xué)習(xí)器。這也是XGBoost和LightGBM模型的理論基礎(chǔ),所以在這篇文章中,我們將從頭開始構(gòu)建一個(gè)梯度增強(qiáng)模型并將其可視化。

梯度提升算法是最常用的集成機(jī)器學(xué)習(xí)技術(shù)之一,該模型使用弱決策樹序列來(lái)構(gòu)建強(qiáng)學(xué)習(xí)器。這也是XGBoost和LightGBM模型的理論基礎(chǔ),所以在這篇文章中,我們將從頭開始構(gòu)建一個(gè)梯度增強(qiáng)模型并將其可視化。

梯度提升算法介紹

梯度提升算法(Gradient Boosting)是一種集成學(xué)習(xí)算法,它通過構(gòu)建多個(gè)弱分類器,然后將它們組合成一個(gè)強(qiáng)分類器來(lái)提高模型的預(yù)測(cè)準(zhǔn)確率。

梯度提升算法的原理可以分為以下幾個(gè)步驟:

  1. 初始化模型:一般來(lái)說(shuō),我們可以使用一個(gè)簡(jiǎn)單的模型(比如說(shuō)決策樹)作為初始的分類器。
  2. 計(jì)算損失函數(shù)的負(fù)梯度:計(jì)算出每個(gè)樣本點(diǎn)在當(dāng)前模型下的損失函數(shù)的負(fù)梯度。這相當(dāng)于是讓新的分類器去擬合當(dāng)前模型下的誤差。
  3. 訓(xùn)練新的分類器:用這些負(fù)梯度作為目標(biāo)變量,訓(xùn)練一個(gè)新的弱分類器。這個(gè)弱分類器可以是任意的分類器,比如說(shuō)決策樹、線性模型等。
  4. 更新模型:將新的分類器加入到原來(lái)的模型中,可以用加權(quán)平均或者其他方法將它們組合起來(lái)。
  5. 重復(fù)迭代:重復(fù)上述步驟,直到達(dá)到預(yù)設(shè)的迭代次數(shù)或者達(dá)到預(yù)設(shè)的準(zhǔn)確率。

由于梯度提升算法是一種串行算法,所以它的訓(xùn)練速度可能會(huì)比較慢,我們以一個(gè)實(shí)際的例子來(lái)介紹:

假設(shè)我們有一個(gè)特征集Xi和值Yi,要計(jì)算y的最佳估計(jì)

圖片

我們從y的平均值開始

圖片

每一步我們都想讓F_m(x)更接近y|x。

圖片

在每一步中,我們都想要F_m(x)一個(gè)更好的y給定x的近似。

首先,我們定義一個(gè)損失函數(shù)

然后,我們向損失函數(shù)相對(duì)于學(xué)習(xí)者Fm下降最快的方向前進(jìn):

因?yàn)槲覀儾荒転槊總€(gè)x計(jì)算y,所以不知道這個(gè)梯度的確切值,但是對(duì)于訓(xùn)練數(shù)據(jù)中的每一個(gè)x_i,梯度完全等于步驟m的殘差:r_i!

所以我們可以用弱回歸樹h_m來(lái)近似梯度函數(shù)g_m,對(duì)殘差進(jìn)行訓(xùn)練:

然后,我們更新學(xué)習(xí)器

這就是梯度提升,我們不是使用損失函數(shù)相對(duì)于當(dāng)前學(xué)習(xí)器的真實(shí)梯度g_m來(lái)更新當(dāng)前學(xué)習(xí)器F_{m},而是使用弱回歸樹h_m來(lái)更新它。

圖片

也就是重復(fù)下面的步驟

1、計(jì)算殘差:

圖片

2、將回歸樹h_m擬合到訓(xùn)練樣本及其殘差(x_i, r_i)上

3、用步長(zhǎng)\alpha更新模型

圖片

看著很復(fù)雜對(duì)吧,下面我們可視化一下這個(gè)過程就會(huì)變得非常清晰了

決策過程可視化

這里我們使用sklearn的moons 數(shù)據(jù)集,因?yàn)檫@是一個(gè)經(jīng)典的非線性分類數(shù)據(jù)

import numpy as np
import sklearn.datasets as ds
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl

from sklearn import tree
from itertools import product,islice
import seaborn as snsmoonDS = ds.make_moons(200, noise = 0.15, random_state=16)
moon = moonDS[0]
color = -1*(moonDS[1]*2-1)

df =pd.DataFrame(moon, columns = ['x','y'])
df['z'] = color
df['f0'] =df.y.mean()
df['r0'] = df['z'] - df['f0']
df.head(10)

讓我們可視化數(shù)據(jù):

下圖可以看到,該數(shù)據(jù)集是可以明顯的區(qū)分出分類的邊界的,但是因?yàn)樗欠蔷€性的,所以使用線性算法進(jìn)行分類時(shí)會(huì)遇到很大的困難。

那么我們先編寫一個(gè)簡(jiǎn)單的梯度增強(qiáng)模型:

def makeiteration(i:int):
"""Takes the dataframe ith f_i and r_i and approximated r_i from the features, then computes f_i+1 and r_i+1"""
clf = tree.DecisionTreeRegressor(max_depth=1)
clf.fit(X=df[['x','y']].values, y = df[f'r{i-1}'])
df[f'r{i-1}hat'] = clf.predict(df[['x','y']].values)

eta = 0.9
df[f'f{i}'] = df[f'f{i-1}'] + eta*df[f'r{i-1}hat']
df[f'r{i}'] = df['z'] - df[f'f{i}']
rmse = (df[f'r{i}']**2).sum()
clfs.append(clf)
rmses.append(rmse)

上面代碼執(zhí)行3個(gè)簡(jiǎn)單步驟:

將決策樹與殘差進(jìn)行擬合:

clf.fit(X=df[['x','y']].values, y = df[f'r{i-1}'])
df[f'r{i-1}hat'] = clf.predict(df[['x','y']].values)

然后,我們將這個(gè)近似的梯度與之前的學(xué)習(xí)器相加:

df[f'f{i}'] = df[f'f{i-1}'] + eta*df[f'r{i-1}hat']

最后重新計(jì)算殘差:

df[f'r{i}'] = df['z'] - df[f'f{i}']

步驟就是這樣簡(jiǎn)單,下面我們來(lái)一步一步執(zhí)行這個(gè)過程。

第1次決策

圖片

Tree Split for 0 and level 1.563690960407257

圖片

第2次決策

Tree Split for 1 and level 0.5143677890300751

第3次決策

Tree Split for 0 and level -0.6523728966712952

圖片

第4次決策

圖片

Tree Split for 0 and level 0.3370491564273834

圖片

第5次決策

圖片

Tree Split for 0 and level 0.3370491564273834

圖片

第6次決策

圖片

Tree Split for 1 and level 0.022058885544538498

圖片

第7次決策

圖片

Tree Split for 0 and level -0.3030575215816498

圖片

第8次決策

圖片

Tree Split for 0 and level 0.6119407713413239

圖片

第9次決策

圖片

可以看到通過9次的計(jì)算,基本上已經(jīng)把上面的分類進(jìn)行了區(qū)分

圖片

我們這里的學(xué)習(xí)器都是非常簡(jiǎn)單的決策樹,只沿著一個(gè)特征分裂!但整體模型在每次決策后邊的越來(lái)越復(fù)雜,并且整體誤差逐漸減小。

plt.plot(rmses)

圖片

這也就是上圖中我們看到的能夠正確區(qū)分出了大部分的分類

如果你感興趣可以使用下面代碼自行實(shí)驗(yàn):

??https://github.com/trenaudie/GradientBoostingVisualized/blob/main/fromScratch.ipynb??


責(zé)任編輯:華軒 來(lái)源: DeepHub IMBA
相關(guān)推薦

2017-09-11 13:33:44

大數(shù)據(jù)數(shù)據(jù)可視化決策樹

2016-09-30 16:12:47

GBDT算法決策樹

2020-03-11 14:39:26

數(shù)據(jù)可視化地圖可視化地理信息

2020-11-02 13:54:41

Python可視化決策樹

2018-07-13 15:53:26

大數(shù)據(jù)

2017-09-15 10:23:06

可視化Bug數(shù)據(jù)分析

2017-10-14 13:54:26

數(shù)據(jù)可視化數(shù)據(jù)信息可視化

2009-04-21 14:26:41

可視化監(jiān)控IT管理摩卡

2022-08-26 09:15:58

Python可視化plotly

2018-07-05 11:47:49

施耐德

2017-11-21 13:00:20

機(jī)器學(xué)習(xí)決策樹可視化

2018-10-17 12:03:45

可視化設(shè)計(jì)圖表

2011-10-21 09:50:03

NHibernate

2024-08-20 14:31:16

2015-08-20 10:06:36

可視化

2022-09-08 11:19:53

Vue可視化插件

2020-04-10 14:20:47

算法可視化Github

2010-06-09 15:09:57

IP網(wǎng)絡(luò)

2017-02-23 09:42:53

大數(shù)據(jù)數(shù)據(jù)可視化技術(shù)誤區(qū)

2022-03-01 10:29:44

Kubernetes容器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)