决策树和随机森林回归

决策树和随机森林回归

决策树

https://www.jianshu.com/p/fcbbd8f2acd5

首先我们来了解一下CART(Classification And Regression Tree) 的定义。它被分为两类:分类决策树(Classification Trees) 和 回归决策树 (Regression Trees). 这也是我们要用决策树解决的两类问题:分类问题和回归问题。

对于分类决策树,一般来说用于一些分类离散的数据,比如说人的性别是男或者女,水果的种类有苹果梨子等等都是离散的。反之回归决策树,那么对应的场景就是连续的数据,比如人的年龄或者室外的温度。当我们进行分类问题时,分类的组之间是无序的。这里首先介绍下什么是有序,可以举个例子比如年龄,又年龄大或者年龄小。那么对于性别问题,男或女,它是没有顺序的

对于下面这幅散点图,我们要通过其来预测一个第三个维度的独立变量y,我们在二维平面中没有办法看到

如果将其放到一个三维空间里,那么我们就可以将这个y变量显示出来。

当我们运行回归树/决策树模型的时候,上面的散点图就会被分成几个部分,就向下图一样。算法会计算信息熵并决定在那里执行划分,将这些散点分组。那么怎么停止呢?比如说当算法增加一个splits,有一个组(leaves)中的数据低于所有数据的5%,那么这个splits就不会被划分。

现在我们还原创建决策树的过程:

  • 首先在 $x_1 = 20$ 处画一条分割线,那么决策树的第一个分支就是判断 $x_1$ 是否小于20,并分成2类。

  • 然后我们在$x_2=170,x_1>20$ 处画一条分割线,那么决策树在右孩子会生成第二个分支,判断 $x_2$ 是否大于170

  • 接着我们在 $x_2=200,x_1<20$ 画一条 分割线

  • 最后我们在$x_1=40,x_2<170$ 出画一条分割线,我们可以继续拓展一个分支。

现在,我们分隔好了区域,我们怎么对一个新的数据进行预测呢?

其实很简单,我们把每个区域每一个散点的y值加起来求平均后,再赋值给新的、需要被预测的值。

现在我们已经求出了各个区域中y的平均值,现在来一个点(30,50) ,我们可以看到这个点落在中下区域,这个区域的平均值是 -64.1 那么这个我们预测(30,50) 这一个点的y值就是 -64.1

最后我们补全我们的决策树:

代码

首先还是进行数据集导入、分割

1
2
3
4
5
6
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
dataset = pd.read_csv('Position_Salaries.csv')
X = dataset.iloc[:, 1:-1].values
y = dataset.iloc[:, -1].values

然后我们训练决策树模型:

对于决策树模型的参数选择和设置,先不要过于纠结。对所有的机器学习模型有了一个认知和比较之后我们再来谈论参数。在这里我们设置 random_state 参数= 0。这个问题是因为,学习一个最优决策树是一个NP问题。 所以实际应用中,生成决策树是基于启发式算法的,比如贪婪算法,贪婪算法可以在每个节点进行局部最优点求解,但它无法保证返回全局最优解。不论是random forest还是decision tree,贪婪算法会随机且多次抽取部分特征和样本,这个随机抽取过程可以通过random_state来决定。让他等于零的意思是让每次建立出来的决策树都是一样的。

1
2
3
from sklearn.tree import DecisionTreeRegressor
regressor = DecisionTreeRegressor(random_state = 0)
regressor.fit(X, y)

我们可以用训练出来的模型预测新的数据

1
regressor.predict([[6.5]])

打印得到: array([150000.])

如果我们要预测两个数据,我们可以这样写:

1
regressor.predict([[1],[2]])

我们可以这样理解,6.5经过了层层决策最后落到了一个区域,这个区域只有 Level=6这一个数据,那么这个数据的平均值 150000 就赋值给了6.5

最后进行一个可视化操作:

1
2
3
4
5
6
7
8
X_grid = np.arange(min(X), max(X), 0.01)
X_grid = X_grid.reshape((len(X_grid), 1))
plt.scatter(X, y, color = 'red')
plt.plot(X_grid, regressor.predict(X_grid), color = 'blue')
plt.title('Truth or Bluff (Decision Tree Regression)')
plt.xlabel('Position level')
plt.ylabel('Salary')
plt.show()

我们看到这个模型被训练成随机森林之后,因为数据量不足够,所以回归曲线呈现阶梯状。也就是说在一定范围内的所有的数都会被预测成相同的值。

随机森林

我们首先来了解一下 Ensemble Learning (集成学习)的概念。 Ensemble Learning 通俗的来说就是用多种算法或者一种算法运行多次来解决一个问题

那么随机森林的步骤可以概括如下:

  • STEP1: Pick at random K data points from the Training set

  • SETP2: Build the Decision Tree associated to these K data points

    • 和决策树不同,决策树将所有的数据拿来建树而随机森林是从中选取K个数据来建树
  • STEP3: Choose the number Ntree of trees you want to build and repeat STEPs 1&2

    • 然后我们只要选择要建的树,重复步骤1和2就可以了
  • STEP4: For a new data point,make each one of your Ntree trees predict the value of Y to for the data point in question,and assign the new data point the average across all of the predicted Y values
    • 对于预测的新数据,我们将其放到每一棵树里面去,分别对其预测,最后对这些预测值取平均,就得到了最终的预测值

这也是随机森林之所以叫做森林的原因了,因为我们创建了很多很多树。和决策树相比,随机森林模型会增加预测的准确性,因为我们对所有的预测值取了一个平均数。

此外,随机森林相对于决策树更加稳定,因为他是一个集成算法

代码

代码和决策树的差不多,但是实际效果要比决策树更好一些

前期准备是一模一样的

1
2
3
4
5
6
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
dataset = pd.read_csv('Position_Salaries.csv')
X = dataset.iloc[:, 1:-1].values
y = dataset.iloc[:, -1].values

然后 我们从 sklearn.ensemble 中导入 RandomForestRegressor 这个类

n_estimators 就代表我要建几棵树

1
2
3
from sklearn.ensemble import RandomForestRegressor
regressor = RandomForestRegressor(n_estimators = 10, random_state = 0)
regressor.fit(X, y)

最后我们讲建立好的模型贴出,我们可以对比一下随机森林和决策树有哪些不同

明显可以看到随机森林相对于决策树来说更准确,阶梯更多了

我们现在的重点是了解概念和初步时间,像这样一个简单的预测虽然在现实生活中是几乎不可能遇到的,但是能让我们更好的了解一些模型和对应建立模型的步骤。

-------------本文结束,感谢您的阅读-------------