基于pyspark的波士顿房价预测案例

目录

一、问题描述:

二、机器学习预测模型概述:

 三、数据获取

四、数据预处理 

五、模型训练

 六、模型评估


本实验包含线性回归模型、梯度上升回归、决策树、随机森林、梯度回归树五种模型的创建和比较以及加载! 

一、问题描述:

本次实验休士顿房价数据集是一个回归问题,共有506个样本,13个输入变量和1个输出变量。数据集中的每一行数据都是对休士顿周边或城镇房价的情况描述,下面对数据集变量说明下,方便理解数据集变量代表的意义。

数据集各特征介绍:

• CRIM:城镇人均犯罪率。

• ZN:住宅用地超过 25000 sq.ft. 的比例。

• INDUS:城镇非零售商用土地的比例。

• CHAS:查理斯河空变量(如果边界是河流,则为1;否则为0)。

• NOX:一氧化氮浓度。

• RM:住宅平均房间数。

• AGE:1940 年之前建成的自用房屋比例。

• DIS:到波士顿五个中心区域的加权距离。

• RAD:辐射性公路的接近指数。

• TAX:每 10000 美元的全值财产税率。

• PTRATIO:城镇师生比例。

• B:1000(Bk-0.63)^ 2,其中 Bk 指代城镇中黑人的比例。

• LSTAT:人口中地位低下者的比例。

• price:自住房的平均房价,以千美元计。

二、机器学习预测模型概述:

1、线性回归分析中,如果只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。

2、随机森林回归模型

随机森林回归模型为一种集成学习算法。通过在数据上构建多个模型,集成所有模型的建模结果。大概流程如下:

  • 从样本集中使用Bootstrap采样选出n个样本。        
  • 从所有属性中随机选择k个属性,之后再使用信息增益、基尼指数方法不断找到最佳分割属性建立CART决策树(也可以是svm、LR等),这里的k控制了随机性的引入程度。        
  • 重复以上过程建立m个分类器,使用这些树形成随机森林,通过求均值来得到预测结果

3、GBR梯度上升回归模型:

本质上就是集思广益,集成一堆较差的学习算法进行学习。每个学习算法准备率都不高,但是它们集成起来可以获得很好的准确率

4、
决策树:

决策树是一个由根到叶的递归过程,在每一个中间结点寻找划分属性,递归重要的是设置停止条件:

(1)当前结点包含的样本属于同一类别,无需划分;

(2)当前属性集为空,或是所有样本在所有属性上取值相同无法划分,简单理解就是当分到这一节点时,所有的属性特征都用完了,没有特征可用了,就根据label数量多的给这一节点打标签使其变成叶节点(其实是在用样本出现的后验概率做先验概率);

(3)当前结点包含的样本集合为空,不能划分。这种情况出现是因为该样本数据缺少这个属性取值,根据父结点的label情况为该结点打标记(其实是在用父结点出现的后验概率做该结点的先验概率)。

5、梯度回归树(GBDT)

GBDT以及其他类型的提升树模型都是基于前向分步算法的(Forward stagewise algorithm)。

优点:预测精度高、适合低维数据、能处理非线性数据与各种类型数据(离散(one_hot) or 连续)

 三、数据获取

data = spark.read.format('CSV').option('header','true').load('D:/code/JupyterNotebookSpace/pypspark/data/data_house/boston.csv',schema=schema)
data.show(10) # 展示前十条数据data.describe().toPandas().transpose()

四、数据预处理 

 4、构建特征集和标签列

# 数据转换,spark监督学习模型需要两栏数据,分别是特征集和标签列
va = VectorAssembler(inputCols=['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','B','LSTAT'],outputCol='features')
df = va.transform(data).select(['features','price'])
df.show(10)

五、模型训练

 1、线性回归

# 训练模型
# 使用pyspark.ml.regression模块构建线性回归模型
from pyspark.ml.regression import LinearRegression   # 导入线性回归库
lr = LinearRegression(featuresCol = 'selectedFeatures', labelCol='price', maxIter=10, regParam=0.3, elasticNetParam=0.8)
lr_model = lr.fit(train)
# 打印各项系数和截距
str(lr_model.coefficients),str(lr_model.intercept)# 线性回归模型对测试集进行预测
predict_lr = lr_model.transform(test)
predict_result_lr = predict_lr.select('prediction','price','selectedFeatures')
predict_result_lr.show(10)

 

2、决策树回归

from pyspark.ml.regression import DecisionTreeRegressor
dt = DecisionTreeRegressor(featuresCol ='selectedFeatures', labelCol = 'price')
dt_model = dt.fit(train)# 使用决策树回归进行预测
predict_dt = dt_model.transform(test)
predict_result_dt = predict_dt.select('prediction', 'price', 'selectedFeatures')
predict_result_dt.show(10)

3、梯度回归树(GBDT)

from pyspark.ml.regression import GBTRegressor
gbt = GBTRegressor(featuresCol = 'selectedFeatures', labelCol = 'price', maxIter=10)
gbt_model = gbt.fit(train)# 使用梯度回归树(GBDT)进行预测
predict_gbt = gbt_model.transform(test)
predict_result_gbt = predict_gbt.select('prediction','price','selectedFeatures')
predict_result_gbt.show(10)

 六、模型评估

# 选用均方根误差评估模型准确率
from pyspark.ml.evaluation import RegressionEvaluator
eva_lr = RegressionEvaluator(predictionCol='prediction',labelCol='price',metricName='rmse').evaluate(predict_result_lr)
eva_dt = RegressionEvaluator(predictionCol='prediction',labelCol='price',metricName='rmse').evaluate(predict_result_dt)
eva_gbt = RegressionEvaluator(predictionCol='prediction',labelCol='price',metricName='rmse').evaluate(predict_result_gbt)
print("线性回归模型均方根误差为{}".format(eva_lr))
print("决策树回归模型均方根误差为{}".format(eva_dt))
print("梯度回归树回归模型均方根误差为{}".format(eva_gbt))

总结: 实验采用了相关系数和平方差两种手段去评判预测结果的好坏。相关系数越接近说明选用的模型回归的效果越好,预测的结果也就越优,在实际解决问题时,应该测试多个模型选用最优的模型进行预测。

由于模型操作较多 在此便不一一详细说明,具体其他模型的详细操作代码包括文档可查看资源,亦可私信我,开源发送,希望可以帮助到大家!

代码资源:

(1条消息) 波士顿房价预测代码pyspark-python-sklearn_波士顿房价预测python代码,波士顿房价预测python-机器学习文档类资源-CSDN文库

数据集:(1条消息) 波士顿房价预测数据集boston.csv_波士顿房价参考文献,波士顿房价预测数据集-机器学习文档类资源-CSDN文库 

本文链接:https://my.lmcjl.com/post/12873.html

展开阅读全文

4 评论

留下您的评论.