目录
本文部分图文借鉴自《老饼讲解-机器学习》
一、决策树是分类还是回归
如果直接问决策树是分类还是回归,那么决策树既可以做分类,也可以做回归,
但这样的问答是不准确的,因为决策树有很多种
决策树从技术主线上来分,有两类:CART决策树、ID3系列决策树
其中ID3系列都是用于做分类的,只有CART之下的有关于做回归的回归树,也称为CART回归树
所以,准确来说,决策树有做分类的,也有做回归的,做分类的叫分类树,做回归的叫回归树
关于ID3和CART的区别可以参考:
老饼讲解|【决策树】决策树ID3算法https://www.bbbdata.com/text/ml/186?f=wjx
二、CART回归树和CART分类树的区别
2.1 CART分类树
CART的分类树模型如下:
决策树是以树形结构表示的模型,其中每个内部节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。决策树模型具有计算复杂度不高、输出结果易于理解、对中间值的缺失不敏感、可以处理多种数据类型等优点。
2.2 CART回归树
而对于CART回归树,则主要是把分类节点上的样本Y值取平均值,作为叶子的回归值。
当样本落在叶子上时,回归值就是样本的预测值。
也就是说,CART回归树虽然是做回归,但它的输出不是连续的,而是枚举的。
三、CART分类树与回归树的实现
3.1 sklearn实现分类树
现已采集150组 鸢尾花数据,包括鸢尾花的四个特征与鸢尾花的类别。数据如下(即sk-learn中的iris数据):
花萼长度 sepal length (cm) 、花萼宽度 sepal width (cm)
花瓣长度 petal length (cm) 、花瓣宽度 petal width (cm)
山鸢尾:0,杂色鸢尾:1,弗吉尼亚鸢尾:2
下面我们用鸢尾花的特征来预测鸢尾花的类别
在sklearn中代码实现如下:
from sklearn.datasets import load_iris
from sklearn import tree
#----------------数据准备----------------------------
iris = load_iris() # 加载数据
#---------------模型训练----------------------------------
clf = tree.DecisionTreeClassifier() # sk-learn的决策树模型
clf = clf.fit(iris.data, iris.target) # 用数据训练树模型构建()
r = tree.export_text(clf, feature_names=iris['feature_names'])
#---------------模型预测结果------------------------
text_x = iris.data[[0,1,50,51,100,101], :]
pred_target_prob = clf.predict_proba(text_x) # 预测类别概率
pred_target = clf.predict(text_x) # 预测类别
#---------------打印结果---------------------------
print("\n===模型======")
print(r)
print("\n===测试数据:=====")
print(text_x)
print("\n===预测所属类别概率:=====")
print(pred_target_prob)
print("\n===预测所属类别:======")
print(pred_target)
运行结果如下:
3.2 sklearn实现回归树
下面我们再根据花萼长度、花萼宽度、花瓣长度来可以预测花瓣宽度。由于花瓣宽度是数值,所以需要使用回归树。
在sklearn中实现回归树的代码如下:
from sklearn.datasets import load_iris
from sklearn import tree
import pandas as pd
#----------------数据准备----------------------------
iris = load_iris() # 加载数据
x = iris.data[:,0:3]
y = iris.data[:,3]
feature_names = iris['feature_names'][0:3]
target_name = iris['feature_names'][3]
#---------------模型训练----------------------------------
clf = tree.DecisionTreeRegressor() # sk-learn的决策树模型
clf = clf.fit(x, y) # 用数据训练树模型构建()
r = tree.export_text(clf, feature_names=feature_names)
#---------------模型预测结果------------------------
text_x = x[[0,1,50,51,100,101], :]
test_y = y[[0,1,50,51,100,101]]
pred_target = clf.predict(text_x) # 预测类别
df = pd.DataFrame()
df["原y"] = test_y
df["预测y"] = pred_target
#---------------打印结果---------------------------
print("\n===模型======")
print(r)
print("\n===预测结果======")
print(df)
运行结果如下:
如果觉得本文有帮助,点个赞吧!