加利福尼亚房价预测实验

一、实验目的

1. 掌握使用python进行数据清洗、数据规约、数据规范化和数据离散化。

2. 回顾线性回归用于预测任务。

二、实验内容

1. 加利福尼亚房价预测实验

(1)明确数据集中每个属性的含义;

(2)选择合适的方法处理数据集中的缺失值;

(3)判断哪些属性需要规范化,选择合适的方法对这些属性进行数据规范化;

(4)判断哪些属性可以离散化,选择合适的方法对这些属性进行数据离散化;

(5)将数据集的前70%作为训练集,剩余的30%作为测试集(去掉包含缺失值的样本)。对训练集分别随机抽取10%,30%,50%和80%的样本作为训练子集,利用训练子集训练线性回归模型,然后在测试集上预测房价属性。以MSE(均方误差)作为评估指标,观察不同采样率下模型性能的变化;

(6)结合数据集的现实背景,思考能否优化以上步骤,使这些步骤更符合实际情况?

三、实验报告评分标准

1. 完成实验(1)(5分)

2. 完成实验(2)(10分)

3. 完成实验(3)(10分)

4. 完成实验(4)(15分)

5. 完成实验(5)(30分)

6. 实验过程与实验结论的记录完整(10分)

7. 表述逻辑清晰(10分)

8. 排版工整自洽,图表标题准确(10分)

四、实验过程

4.1明确数据集中每个属性的含义;

Longitude               经度

latitude                纬度

housing_median_age      房龄中位数

total_rooms             总房间数(规范)

total_bedrooms           总卧室数(规范)

population               人口

households               住户数

median_income           年收入中位数

median_house_value      房屋价格中位数(标签)

ocean_proximity         距离海洋的距离

1)使用data.info()查看数据及信息

图 1 data.info()

2)发现只有ocean_proximity属性是object类型,其他都是数值属性,使用value_counts()函数查看其分布

图 2 ocean_proximity属性值分布

4.2选择合适的方法处理数据集中的缺失值;

1)发现只有“total_bedrooms”属性有缺失值,选择删除对象的方法解决缺失值问题

图 3 缺失值

2)我认为本数据集中经纬度对房价的影响,仅在于是否靠海边,而属性“距离海洋的距离”已经能直观反映,所以认为经纬度属于冗余属性,可以删除。

3)“人口”和“住户数”属性呈线性相关关系,保留一个特征即可,这里我选择保留住户特征

图 4 人口和住户特征二维散点图

4)处理完的数据集如下

4.3判断哪些属性需要规范化,选择合适的方法对这些属性进行数据规范化;

因为要使用线性回归模型预测房价,在训练模型时若不同特征尺度不同,则会导致收敛速度慢所以数值属性housing_median_age,total_rooms total_bedrooms, households, median_income都需要按比例缩放规范化,同时将离散属性one-hot编码

  1. data = pd.get_dummies(data, columns=['ocean_proximity'])  

  1. #  Z-score标准化  
  2. scaler = StandardScaler()  
  3. X_train_scaled = scaler.fit_transform(X_train)  
  4. X_test_scaled = scaler.transform(X_test)  

4.4判断哪些属性可以离散化,选择合适的方法对这些属性进行数据离散化;

     属性是否需要离散化要根据数据挖掘方法来定,此次作业使用线性回归模型,需要连续值属性,并不做离散化处理

4.5将数据集的前70%作为训练集,剩余的30%作为测试集(去掉包含缺失值的样本)。对训练集分别随机抽取10%,30%,50%和80%的样本作为训练子集,利用训练子集训练线性回归模型,然后在测试集上预测房价属性。以MSE(均方误差)作为评估指标,观察不同采样率下模型性能的变化;

  1. subset = [0.1, 0.3, 0.5, 0.8]  
  2.   
  3. for rat in subset:  
  4.     计算要选择的样本数  
  5.     num_samples = int(len(X_train) * rat)  
  6.   
  7.     随机选择样本  
  8.     subset_train_data = X_train.sample(n=num_samples, random_state=42)  
  9.     subset_train_label = y_train.sample(n=num_samples, random_state=42)  
  10.   
  11.   
  12.     训练线性回归模型  
  13.     model = LinearRegression()  
  14.     model.fit(subset_train_data, subset_train_label)  
  15.   
  16.     y_pred = model.predict(X_test)  
  17.   
  18.     计算MSE  
  19.     mse = mean_squared_error(y_test, y_pred)  
  20.   
  21.     print(f"训练子集比例 {rat}: MSE = {mse}")  

五、实验结论

1)

2)属性的离散化不是必须的,离散化是否有必要要看数据挖掘方法是否需要离散化。

其实从数据库的角度来说,数据离散化也可以实现概念分层,比如用到的数据集中有经纬度属性,每个经纬度表示一个街区的真实地理位置,如果有辅助数据的话,我们可以合并邻近的街区为社区,这样经纬度属性就会变为社区属性,还可以将社区进一步合并为城市,这样经纬度属性就生成了城市名称属性。这样,看似无用的经纬度信息通过离散化就变成了可能影响房价的因素。(问老师离散化必要性得到的解答)

  • 26
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值