《機器學習實戰》學習筆記 12 回歸 樹回歸

2021-08-04 14:31:14 字數 4267 閱讀 1687

《機器學習實戰》學習筆記-[12]-回歸-樹回歸

分類與回歸樹(classification and regression trees, cart)是由四人幫leo breiman, jerome friedman, richard olshen與charles stone於2023年提出,既可用於分類也可用於回歸:

下面以平方誤差最小準則回歸為例簡要介紹下cart

(1)基於平方誤差最小準則(最小二乘回歸樹準則)下的回歸演算法

對於j個特徵(每個特徵的取數設為s個)分別計算,每個特徵的每個取數作為切分點的平方誤差,選擇最小誤差時的特徵及其取值作為切分點,二分構建二叉樹。在特定止步條件下迴圈遞迴構建回歸樹。

(2)關於最佳切分點查詢函式的止步條件

回歸樹構建的createtree()偽**如下

createtree()

找到最佳的待切分特徵:

若該節點不能再切分,將該節點作為葉子返回

執行二元切分

在右子樹呼叫createtree()

在左子樹呼叫createtree()

from numpy import *

def loaddataset(filename):

datamat = ;

fr = open(filename)

for line in fr.readlines():

curline = line.strip().split('\t')

fltline = list(map(float, curline)) # 轉為浮點數儲存

return datamat

# 根據特徵及其取值二分資料集

# dataset = array ([[1,0,2,0],[0,0,2,0],[1,0,2,0]])

# a= nonzero(dataset[:,0] > 0.5)

# print(a)

# #(array([0, 2]),)

# a= nonzero(dataset[:,0] > 0.5)[0]

# print(a)

# # [0 2]

def binsplitdataset(dataset, feature, value):

val1 = nonzero(dataset[:, feature] > value)[0]

val2 = nonzero(dataset[:, feature] <= value)[0]

mat0 = dataset[nonzero(dataset[:,feature] > value)[0],:]

mat1 = dataset[nonzero(dataset[:,feature] <= value)[0],:]

return mat0,mat1

# 葉子節點的值(採用均值)

def regleaf(dataset):

return mean(dataset[:, -1])

# 誤差函式(總方差)

def regerr(dataset):

return var(dataset[:, -1]) * shape(dataset)[0]

# 最佳切分點查詢函式

# 返回切分點特質值及其最佳取值

# 這裡設定乙個停止條件ops(tols和toln)

# 分別代表容許的誤差下降值和切分樣本的最小樣本數

def choosebestsplit(dataset, leaftype=regleaf, errtype=regerr, ops=(1, 4)):

tols = ops[0];

toln = ops[1]

if len(set(dataset[:, -1].t.tolist()[0])) == 1:

return none, leaftype(dataset)

m, n = shape(dataset)

s = errtype(dataset) # 初識化誤差

bests = inf;

bestindex = 0;

bestvalue = 0 # 不斷用最小誤差更新

for featureindex in range(n - 1): # 遍歷個特徵

for splitvaule in set((dataset[:, featureindex].t.a.tolist())[0]): # 遍歷各個特徵的各個值

mat0, mat1 = binsplitdataset(dataset, featureindex, splitvaule)

if (shape(mat0)[0] < toln) or (shape(mat1)[0] < toln):

continue

news = errtype(mat0) + errtype(mat1)

if news < bests:

bestindex = featureindex

bestvalue = splitvaule

bests = news

if (s - bests) < tols:

return none, leaftype(dataset)

mat0, mat1 = binsplitdataset(dataset, bestindex, bestvalue)

if (shape(mat0)[0] < toln) or (shape(mat1)[0] < toln):

return none, leaftype(dataset)

return bestindex, bestvalue

# createtree()

# 找到最佳的待切分特徵:

# 若該節點不能再切分,將該節點作為葉子返回

# 執行二元切分

# 在右子樹呼叫createtree()

# 在左子樹呼叫createtree()

def createtree(dataset, leaftype=regleaf, errtype=regerr, ops=(1, 4)):

feat, val = choosebestsplit(dataset, leaftype, errtype, ops)

if feat == none: return val # 切分完畢

# 構建樹

rettree = {}

rettree['spind'] = feat

rettree['spval'] = val

lset, rset = binsplitdataset(dataset, feat, val)

rettree['left'] = createtree(lset, leaftype, errtype, ops)

rettree['right'] = createtree(rset, leaftype, errtype, ops)

return rettree

測試

import os

from numpy import *

from ml_learn.com.ml.regression.regres_regtree import regtrees

testmat = mat(eye(4))

mat0, mat1 = regtrees.binsplitdataset(testmat, 1, 0.5) #

print (testmat)

print ("mat0:\n" ,mat0 )

print ("mat1:\n" , mat1)

#匯入訓練資料集

inputdata = regtrees.loaddataset(os.getcwd() + '/resource/ex00.txt')

inputmat = mat(inputdata)

rettree = regtrees.createtree(inputmat)

print(rettree)

輸出: [[ 1.  0.  0.  0.]

[ 0.  1.  0.  0.]

[ 0.  0.  1.  0.]

[ 0.  0.  0.  1.]]

mat0:

[[ 0.  1.  0.  0.]]

mat1:

[[ 1.  0.  0.  0.]

[ 0.  0.  1.  0.]

[ 0.  0.  0.  1.]]

《機器學習實戰》學習筆記 10 回歸 嶺回歸

機器學習實戰 學習筆記 10 回歸 嶺回歸 縮減方法可以去除不重要的引數 備註 同樣,為使用嶺回歸和縮減技術,首先需要對特徵做標準化處理,標準化使得每維度下的特徵有相同的重要性,具體 所有特徵減去各自的均值並除以方差 機器學習實戰 回歸 from numpy import def loaddatas...

機器學習8回歸問題

對於之前在分類問題中有邏輯回歸,而對於這個線性回歸以前一般是先講述,將線性回歸的結果通過函式對映到 0,1 區間,再以0.5作為區分形成分類問題。具體的計算方法,在以前的blogs提到過,參考 下面就直接實戰 跟之前一樣,第一步匯入資料。def loaddataset filename numfea...

(機器學習筆記一)回歸分析

訓練集 x 表示輸入值 y 表示輸出值 i 表示訓練集中的樣本索引。學習結果 函式 h x y 使得 h x 能夠很好的 y 由於歷史原因 h被稱作假設 hypothesis 如果目標變數是連續的值,我們稱這個學習問題是乙個回歸問題。如果目標變數是很少的幾個離散的值,我們稱它為分類問題。形如關於 x...