《機器學習實戰》學習筆記-[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...