随机森林算法 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_bostonboston = load_boston()df = pd.DataFrame(boston.data, columns=boston.feature_names)df['PRICE'] = boston.targetdf.insert(0, "Index", df.index+1)print(df.head(10).to_string(index=False))
随机森林预测波士顿房价的操作步骤:
首先导入了需要的库和数据集;然后将数据集拆分为训练集和测试集;接下来,创建一个包含10个决策树的随机森林分类器n_estimators=10
,并使用训练集拟合模型;需要注意的是,因为波士顿房价数据是一个线性回归数据,并非分类数据,所以要使用RandomForestRegressor
;然后使用测试集预测结果,并计算模型的均方误差。
from sklearn.ensemble import RandomForestRegressorfrom sklearn.datasets import load_bostonfrom sklearn.model_selection import train_test_splitfrom 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)