
簡單易學(xué)的機(jī)器學(xué)習(xí)算法—分類回歸樹CART
分類回歸樹(Classification and Regression Tree,CART)是一種典型的決策樹算法,CART算法不僅可以應(yīng)用于分類問題,而且可以用于回歸問題。
一、樹回歸的概念
對于一般的線性回歸,其擬合的模型是基于全部的數(shù)據(jù)集。這種全局的數(shù)據(jù)建模對于一些復(fù)雜的數(shù)據(jù)來說,其建模的難度也會很大。其后,我們有了局部加權(quán)線性回歸,其只利用數(shù)據(jù)點周圍的局部數(shù)據(jù)進(jìn)行建模,這樣就簡化了建模的難度,提高了模型的準(zhǔn)確性。樹回歸也是一種局部建模的方法,其通過構(gòu)建決策點將數(shù)據(jù)切分,在切分后的局部數(shù)據(jù)集上做回歸操作。
在博文“簡單易學(xué)的機(jī)器學(xué)習(xí)算法——決策樹之ID3算法”中介紹了ID3算法的思想,ID3算法主要是用來處理離散性的問題,然而對于連續(xù)型的問題,ID3算法就無能無力了。其次ID3算法的分支也屬于多分支,即通過一個特征可以分出很多的子數(shù)據(jù)集。分類回歸樹(Classification and Regression Tree, CART)是一種樹構(gòu)建算法,這種算法既可以處理離散型的問題,也可以處理連續(xù)型的問題。在處理連續(xù)型問題時,主要通過使用二元切分來處理連續(xù)型變量,即特征值大于某個給定的值就走左子樹,或者就走右子樹。
二、回歸樹的分類
在構(gòu)建回歸樹時,主要有兩種不同的樹:
回歸樹(Regression Tree),其每個葉節(jié)點是單個值
模型樹(Model Tree),其每個葉節(jié)點是一個線性方程
三、基于CART算法的回歸樹
在進(jìn)行樹的左右子樹劃分時,有一個很重要的量,即給定的值,特征值大于這個給定的值的屬于一個子樹,小于這個給定的值的屬于另一個子樹。這個給定的值的選取的原則是使得劃分后的子樹中的“混亂程度”降低。如何定義這個混亂程度是設(shè)計CART算法的一個關(guān)鍵的地方。在ID3算法中我們使用的信息熵和信息增益的概念。信息熵就代表了數(shù)據(jù)集的紊亂程度。對于連續(xù)型的問題,我們可以使用方差的概念來表達(dá)混亂程度,方差越大,越紊亂。所以我們要找到使得切分之后的方差最小的劃分方式。數(shù)據(jù)分析師培訓(xùn)
四、實驗仿真
對于數(shù)據(jù)集1,數(shù)據(jù)集2,我們分別使用CART算法構(gòu)建回歸樹
(數(shù)據(jù)集1)
(數(shù)據(jù)集2)
從圖上我們可以看出可以將數(shù)據(jù)集劃分成兩個子樹,即左右子樹,并分別在左右子樹上做線性回歸。同樣的道理,下圖可以劃分為5個子樹。
結(jié)果為:
(數(shù)據(jù)集1的結(jié)果)
(數(shù)據(jù)集2的結(jié)果)
MATLAB代碼:
主程序
[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
%% CART
clear all
clc
% 導(dǎo)入數(shù)據(jù)集
%dataSet = load('ex00.txt');
dataSet = load('ex0.txt');
% 畫圖1
% plot(dataSet(:,1),dataSet(:,2),'.');
% axis([-0.2,1.2,-1.0,2.0]);
% 畫圖2
% plot(dataSet(:,2),dataSet(:,3),'.');
% axis([-0.2,1.2,-1.0,5.0]);
createTree(dataSet,1,4);
構(gòu)建子樹
[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
function [ retTree ] = createTree( dataSet,tolS,tolN )
[feat,val] = chooseBestSplit(dataSet, tolS, tolN);
disp(['feat:', num2str(feat)]);
disp(['value:', num2str(val)]);
if feat == 0
return;
end
[lSet,rSet] = binSplitDataSet(dataSet, feat, val);
disp('left:');
createTree( lSet,tolS,tolN );
disp('right:');
createTree( rSet,tolS,tolN );
end
最佳劃分
[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
function [ Index, Value ] = chooseBestSplit( dataSet, tolS, tolN )
% 參數(shù)中tolS是容許的誤差下降值,tolN是切分的最小樣本數(shù)
m = size(dataSet);%數(shù)據(jù)集的大小
if length(unique(dataSet(:,m(:,2)))) == 1%僅剩下一種時
Index = 0;
Value = regLeaf(dataSet(:,m(:,2)));
return;
end
S = regErr(dataSet);%誤差
bestS = inf;%初始化,無窮大
bestIndex = 0;
bestValue = 0;
%找到最佳的位置和最優(yōu)的值
for j = 1:(m(:,2)-1)%得到列
b = unique(dataSet(:,j));%得到特征所在的列
lenCharacter = length(b);
for i = 1:lenCharacter
temp = b(i,:);
[mat0,mat1] = binSplitDataSet(dataSet, j ,temp);
m0 = size(mat0);
m1 = size(mat1);
if m0(:,1) < tolN || m1(:,1) < tolN
continue;
end
newS = regErr(mat0) + regErr(mat1);
if newS < bestS
bestS = newS;
bestIndex = j;
bestValue = temp;
end
end
end
if (S-bestS) < tolS
Index = 0;
Value = regLeaf(dataSet(:,m(:,2)));
return;
end
%劃分
[mat0, mat1] = binSplitDataSet(dataSet, bestIndex ,bestValue);
m0 = size(mat0);
m1 = size(mat1);
if m0(:,1) < tolN || m1(:,1) < tolN
Index = 0;
Value = regLeaf(dataSet(:,m(:,2)));
return;
end
Index = bestIndex;
Value = bestValue;
end
劃分
[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
%% 將數(shù)據(jù)集劃分為兩個部分
function [ dataSet_1, dataSet_2 ] = binSplitDataSet( dataSet, feature, value )
[m,n] = size(dataSet);%計算數(shù)據(jù)集的大小
DataTemp = dataSet(:,feature)';%變成行
%計算行中標(biāo)簽列的元素大于value的行
index_1 = [];%空的矩陣
index_2 = [];
for i = 1:m
if DataTemp(1,i) > value
index_1 = [index_1,i];
else
index_2 = [index_2,i];
end
end
[m_1,n_1] = size(index_1);%這里要取列數(shù)
[m_2,n_2] = size(index_2);
if n_1>0 && n_2>0
for j = 1:n_1
dataSet_1(j,:) = dataSet(index_1(1,j),:);
end
for j = 1:n_2
dataSet_2(j,:) = dataSet(index_2(1,j),:);
end
elseif n_1 == 0
dataSet_1 = [];
dataSet_2 = dataSet;
elseif n_2 == 0
dataSet_2 = [];
dataSet_1 = dataSet;
end
end
%% 將數(shù)據(jù)集劃分為兩個部分
function [ dataSet_1, dataSet_2 ] = binSplitDataSet( dataSet, feature, value )
[m,n] = size(dataSet);%計算數(shù)據(jù)集的大小
DataTemp = dataSet(:,feature)';%變成行
%計算行中標(biāo)簽列的元素大于value的行
index_1 = [];%空的矩陣
index_2 = [];
for i = 1:m
if DataTemp(1,i) > value
index_1 = [index_1,i];
else
index_2 = [index_2,i];
end
end
[m_1,n_1] = size(index_1);%這里要取列數(shù)
[m_2,n_2] = size(index_2);
if n_1>0 && n_2>0
for j = 1:n_1
dataSet_1(j,:) = dataSet(index_1(1,j),:);
end
for j = 1:n_2
dataSet_2(j,:) = dataSet(index_2(1,j),:);
end
elseif n_1 == 0
dataSet_1 = [];
dataSet_2 = dataSet;
elseif n_2 == 0
dataSet_2 = [];
dataSet_1 = dataSet;
end
end
偏差
[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
function [ error ] = regErr( dataSet )
m = size(dataSet);%求得dataSet的大小
dataVar = var(dataSet(:,m(:,2)));
error = dataVar * (m(:,1)-1);
end
葉節(jié)點
[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
function [ leaf ] = regLeaf( dataSet )
m = size(dataSet);
leaf = mean(dataSet(:,m(:,2)));
end
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計學(xué)領(lǐng)域,假設(shè)檢驗是驗證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學(xué)計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學(xué)計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務(wù)價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導(dǎo)向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10