目录
一、问题描述:
二、机器学习预测模型概述:
三、数据获取
四、数据预处理
五、模型训练
六、模型评估
本实验包含线性回归模型、梯度上升回归、决策树、随机森林、梯度回归树五种模型的创建和比较以及加载!
一、问题描述:
本次实验休士顿房价数据集是一个回归问题,共有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梯度上升回归模型:
本质上就是集思广益,集成一堆较差的学习算法进行学习。每个学习算法准备率都不高,但是它们集成起来可以获得很好的准确率
决策树是一个由根到叶的递归过程,在每一个中间结点寻找划分属性,递归重要的是设置停止条件:
(1)当前结点包含的样本属于同一类别,无需划分;
(2)当前属性集为空,或是所有样本在所有属性上取值相同无法划分,简单理解就是当分到这一节点时,所有的属性特征都用完了,没有特征可用了,就根据label数量多的给这一节点打标签使其变成叶节点(其实是在用样本出现的后验概率做先验概率);
(3)当前结点包含的样本集合为空,不能划分。这种情况出现是因为该样本数据缺少这个属性取值,根据父结点的label情况为该结点打标记(其实是在用父结点出现的后验概率做该结点的先验概率)。
5、梯度回归树(GBDT)
GBDT以及其他类型的提升树模型都是基于前向分步算法的(Forward stagewise algorithm)。
优点:预测精度高、适合低维数据、能处理非线性数据与各种类型数据(离散(one_hot) or 连续)
三、数据获取
1、获取数据集
from sklearn import datasets
import math
import matplotlib.pyplot as plt
house = datasets.load_boston() # 加载数据
x = house.data # 获取特征数据
y = house.target # 获取特征标签
nums = len(house.feature_names) # 获取特征数量
columns = 4 # 指定一行中图的个数
rows = math.ceil(nums / columns) # 根据特征数和列数计算行数
plt.figure(figsize=(10, 12)) # 设置图的大小
for i in range(nums): # 循环绘制每个特征与房价之间的关系图
plt.subplot(rows, columns, i + 1) # 指定图的位置
plt.plot(x[:, i], y, "b+") # 绘制相关点
plt.title(house.feature_names[i]) # 指定每个子图的标题
plt.subplots_adjust(hspace=0.8) # 调整图与图之间的边距
plt.show() # 显示图
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()
四、数据预处理
1、数据去重
data_dis = data.distinct()
data_dis.show()
print(data_dis.count())
2、将所有特征转化成向量型,考察特征间相关性
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.stat import Correlation
df_assembler = VectorAssembler(
inputCols=['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','B','LSTAT','price'],
outputCol='all_features')
data_view = df_assembler.transform(data).select('all_features')
data_view.show(10)
3、计算特征间相关性,默认计算的是皮尔逊相关系数
mat = Correlation.corr(data_view,'all_features')
#打印最后一行,查看各特征与售价之问的相关性
# 输出协方差矩阵
mat.head()[0].toArray()[-1,:]#可视化特征相关性
import seaborn as sns
sns.heatmap(mat.head()[0].toArray(),cmap="YlGnBu")
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)
5.利用卡方特征选择ChiSqSelector来选择部分特征,降低维度,减少计算开销
选用百分之九十的特征
from pyspark.ml.feature import ChiSqSelector
selector = ChiSqSelector(featuresCol='features',percentile=0.9, outputCol="selectedFeatures",labelCol='price')
model = selector.fit(df)
df_select = model.transform(df).select(["selectedFeatures","price"])
model.transform(df).show()
五、模型训练
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文库