随机森林算法 Random Forest Algorithm
- 随机森林算法
- 随机森林算法实现波士顿房价预测
随机森林算法
随机森林(Random Forest)算法 是一种 集成学习(Ensemble Learning)方法,它由多个决策树组成,是一种分类、回归和特征选择的机器学习算法。
在随机森林中,每个决策树都是独立地训练的,每棵树的建立都是基于随机选取的 特征子集 和随机选取的 训练样本集。
- 在分类问题中,随机森林采用投票的方式来决定最终分类结果;
- 在回归问题中,随机森林采用平均值的方式来预测结果。
对于随机森林算法,必须知道的几个概念包括:
- 怎样选取的特征子集以及训练样本集;
- 我们很清楚决策树如何对分类值做出分类处理,然而决策树如何对连续值做出的分类处理?
对于第一个问题,很好回答和理解,所谓特征子集以及训练样本集,其实就是为了防止森林中所有的决策树的训练集一样,因为如果决策树的所有训练集一样,那就没有意义建造森林了。而抽取的方法有很多,最简单就像从口袋中抽球一样,随机抽出放回;将抽出的球构成训练样本集。
而对于第二个问题,就需要深思熟虑一下,首先需要理解的是:
-
对于全都是数字的训练集数据特征值,决策树在选取划分特征时通常会采用方差(Variance)或均方差(Mean Squared Error)来衡量特征的重要性,以找到能够最大化减少样本方差划分特征。
-
对于全都是分类的训练集数据特征,决策树在选取划分特征时通常会采用信息增益(Information Gain)来衡量特征的重要性,所谓最大信息增益,即最大化减少熵的选择。
其次,对于连续型特征,如体重、身高等等,采用二分法进行划分。具体来说,通过在特征值中选择一个分裂点,即可以将整个特征值数组分为两类的点,通常分裂点的选择有两种策略:
- 选择中位数:一种常见的选择分裂点的方法是选择特征值的中位数作为分裂点。具体来说,可以按照该特征值从小到大进行排序,然后选择中间位置上的值作为分裂点。
- 选择平均值:另一种选择分裂点的方法是选择特征值的平均值作为分裂点。具体来说,可以计算该特征值的平均值,并将其作为分裂点。
然后计算每个属性分裂后的哪个的方差减少值最大,即选择其作为分类选择。
下述内容将围绕随机森林算法实现一个著名的连续值分类问题:即波士顿房价预测。而实现分类问题,即通过随机森林算法预测“鸢尾花”在【机器学习】P24 随机森林算法(1) 实现 “鸢尾花” 预测 中呈现;
随机森林算法实现波士顿房价预测
波士顿房价数据与特征:
波士顿房价数据集是一个经典的回归问题数据集,包含了波士顿地区不同城镇的房屋价格及其相关的属性数据。该数据集共有506个样本,每个样本有13个属性,分别是:
- CRIM:城镇人均犯罪率
- ZN:占地面积超过2.5万平方英尺的住宅用地比例
- INDUS:城镇中非零售营业面积的比例
- CHAS:查尔斯河虚拟变量(如果是河流,则为1;否则为0)
- NOX:一氧化氮浓度(每千万分之一)
- RM:每个住宅的平均房间数
- AGE:1940年以前建造的自有住房的比例
- DIS:到波士顿五个就业中心的加权距离
- RAD:径向公路的可达性指数
- TAX:每10,000美元的全值财产税率
- PTRATIO:城镇中的学生与教师比例
- B:黑人的比例(1000(Bk - 0.63)^ 2),其中Bk是城镇中黑人的比例
- LSTAT:人口中地位低下者的比例
下面是通过pandas展示前十条数据的代码示例:
import pandas as pd
# 加载波士顿房价数据集
from sklearn.datasets import load_boston
boston = load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)
df['PRICE'] = boston.target
df.insert(0, "Index", df.index+1)
print(df.head(10).to_string(index=False))
随机森林预测波士顿房价的操作步骤:
- 首先导入了需要的库和数据集;
- 然后将数据集拆分为训练集和测试集;
- 接下来,创建一个包含10个决策树的随机森林分类器
n_estimators=10
,并使用训练集拟合模型; - 需要注意的是,因为波士顿房价数据是一个线性回归数据,并非分类数据,所以要使用
RandomForestRegressor
; - 然后使用测试集预测结果,并计算模型的均方误差。
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 加载 boston 数据集
boston = load_boston()
X, y = boston.data, boston.target
# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
# 创建随机森林回归器
rf = RandomForestRegressor(n_estimators=10, random_state=42)
# 使用训练集拟合模型
rf.fit(X_train, y_train)
# # # 获取每个决策树的预测结果
tree_predictions = []
for tree in rf.estimators_:
tree_predictions.append(tree.predict(X_test))
# 预测测试集
y_pred = rf.predict(X_test)
# # # 打印每个决策树的前十个测试案例的预测结果
for i, tree_prediction in enumerate(tree_predictions):
print(f"Tree {i} predictions:", tree_prediction[:10])
# # # 打印随机森林的前十个测试案例的预测结果
print("预测结果为:", y_pred[:10])
print("实际结果为:", y_test[:10])
# 计算模型的均方误差
mse = mean_squared_error(y_test, y_pred)
print("MSE:", mse)
当然,最后可通过输入十三个属性来获取预测的房价:
# 预测房价
new_data = [[0.03, 18, 2.31, 0, 0.54, 6.57, 89.8, 2.5052, 1, 296, 15.3, 394.72, 8.23]] # 新样本的特征值
predicted_price = rf.predict(new_data)
print("Predicted price:", predicted_price)