spark机器学习库对休斯顿房价数据建立机器学习模型并实现预测
时间: 2023-12-22 15:05:04 浏览: 51
好的,下面是使用Spark机器学习库对休斯顿房价数据建立机器学习模型并实现预测的具体步骤:
1. 加载数据集
首先,我们需要从CSV文件中加载休斯顿房价数据集。可以使用SparkSession中的read方法读取CSV文件,然后使用DataFrame API将其转换为DataFrame对象。代码如下:
```python
# 导入必要的库
from pyspark.sql import SparkSession
# 创建SparkSession
spark = SparkSession.builder.appName('Houston_Housing_Prices').getOrCreate()
# 读取CSV文件
data = spark.read.csv('path/to/houston_housing_data.csv', header=True, inferSchema=True)
# 将DataFrame缓存,以便加快后续计算速度
data.cache()
```
2. 数据清洗和特征工程
接下来,我们需要对数据进行清洗和特征工程,以便构建一个高效的机器学习模型。这里我们可以使用Spark的DataFrame API进行数据处理。
假设我们的数据集包含以下特征:
- CRIM:城镇人均犯罪率。
- ZN:占地面积超过2.5万平方英尺的住宅用地比例。
- INDUS:每个城镇的非零售业务英亩比例。
- CHAS:查尔斯河虚拟变量(如果河流边界为1,则为1;否则为0)。
- NOX:一氧化氮浓度(每千万份)。
- RM:每个住宅的平均房间数。
- AGE:1940年以前建造的自住房屋的比例。
- DIS:到五个波士顿就业中心的加权距离。
- RAD:径向公路通达性指标。
- TAX:每10,000美元的全值财产税率。
- PTRATIO:每个城镇的学生与教师比例。
- B:1000(Bk - 0.63)^ 2其中Bk是每个城镇黑人的比例。
- LSTAT:低地位人口百分比。
我们可以对数据集进行以下处理:
- 移除无用的特征,如ID等。
- 处理缺失值。
- 对标签进行归一化。
- 使用OneHotEncoder将类别变量转换为数值变量。
- 使用VectorAssembler将所有特征组合成一个特征向量。
代码如下:
```python
from pyspark.ml.feature import OneHotEncoder, VectorAssembler
from pyspark.ml import Pipeline
from pyspark.ml.feature import Imputer
from pyspark.ml.feature import MinMaxScaler
# 移除无用的特征
data = data.drop('ID')
# 处理缺失值
imputer = Imputer(strategy='mean', inputCols=['CRIM', 'ZN', 'INDUS', 'NOX',
'RM', 'AGE', 'DIS', 'RAD', 'TAX',
'PTRATIO', 'B', 'LSTAT'],
outputCols=['{}_imputed'.format(col) for col in ['CRIM', 'ZN', 'INDUS', 'NOX',
'RM', 'AGE', 'DIS', 'RAD', 'TAX',
'PTRATIO', 'B', 'LSTAT']])
data = imputer.fit(data).transform(data)
# 对标签进行归一化
data = data.withColumn('MEDV', data['MEDV'] / 100000)
# 使用OneHotEncoder将类别变量转换为数值变量
categorical_cols = ['CHAS']
stages = []
for col in categorical_cols:
encoder = OneHotEncoder(inputCols=[col], outputCols=["{}_encoded".format(col)])
stages += [encoder]
pipeline = Pipeline(stages=stages)
data = pipeline.fit(data).transform(data)
# 使用VectorAssembler将所有特征组合成一个特征向量
assembler = VectorAssembler(inputCols=['CRIM_imputed', 'ZN_imputed', 'INDUS_imputed',
'NOX_imputed', 'RM_imputed', 'AGE_imputed',
'DIS_imputed', 'RAD_imputed', 'TAX_imputed',
'PTRATIO_imputed', 'B_imputed', 'LSTAT_imputed',
'CHAS_encoded'],
outputCol='features')
data = assembler.transform(data)
# 对特征向量进行归一化
scaler = MinMaxScaler(inputCol='features', outputCol='scaled_features')
data = scaler.fit(data).transform(data)
# 选择带有标签和特征向量的列
data = data.select(['MEDV', 'scaled_features'])
```
3. 拆分数据集
现在,我们需要将数据集拆分为训练集和测试集。可以使用`randomSplit`方法来完成,代码如下:
```python
train_data, test_data = data.randomSplit([0.7, 0.3], seed=12345)
```
4. 建立模型并训练
接下来,我们可以使用Spark的机器学习库建立一个线性回归模型,并使用训练集来训练模型。代码如下:
```python
from pyspark.ml.regression import LinearRegression
# 建立线性回归模型
lr = LinearRegression(featuresCol='scaled_features', labelCol='MEDV')
# 训练模型
lr_model = lr.fit(train_data)
```
5. 模型评估
在训练模型后,我们需要评估模型的性能。可以使用Spark的回归评估器来计算模型的RMSE。代码如下:
```python
from pyspark.ml.evaluation import RegressionEvaluator
# 使用测试集评估模型
predictions = lr_model.transform(test_data)
evaluator = RegressionEvaluator(labelCol='MEDV', predictionCol='prediction', metricName='rmse')
rmse = evaluator.evaluate(predictions)
print('Root Mean Squared Error (RMSE) on test data: {:.2f}'.format(rmse))
```
6. 使用模型进行预测
最后,我们可以使用训练好的模型来预测新的数据。假设我们有一个新的房屋信息,我们可以将其转换为特征向量并使用模型进行预测。代码如下:
```python
# 假设我们有一个新的房屋信息
new_house = [0.00632, 18.0, 2.31, 0.538, 6.575, 65.2, 4.0900, 1.0, 296.0, 15.3, 396.90, 4.98, 1.0]
# 将新房屋信息转换为特征向量
new_house_df = spark.createDataFrame([new_house], schema=data.columns[1:])
new_house_df = assembler.transform(new_house_df)
new_house_df = scaler.transform(new_house_df)
# 使用模型进行预测
pred = lr_model.transform(new_house_df).head()[0]
print('Predicted Houston house price: ${:.2f}'.format(pred * 100000))
```
这样,我们就成功地使用Spark机器学习库对休斯顿房价数据建立了机器学习模型,并且实现了预测。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_lunwen.png)
![-](https://csdnimg.cn/download_wenku/file_type_lunwen.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_lunwen.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)