一、实验目的
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编码
- data = pd.get_dummies(data, columns=['ocean_proximity'])
- # Z-score标准化
- scaler = StandardScaler()
- X_train_scaled = scaler.fit_transform(X_train)
- X_test_scaled = scaler.transform(X_test)
4.4判断哪些属性可以离散化,选择合适的方法对这些属性进行数据离散化;
属性是否需要离散化要根据数据挖掘方法来定,此次作业使用线性回归模型,需要连续值属性,并不做离散化处理
4.5将数据集的前70%作为训练集,剩余的30%作为测试集(去掉包含缺失值的样本)。对训练集分别随机抽取10%,30%,50%和80%的样本作为训练子集,利用训练子集训练线性回归模型,然后在测试集上预测房价属性。以MSE(均方误差)作为评估指标,观察不同采样率下模型性能的变化;
- subset = [0.1, 0.3, 0.5, 0.8]
- for rat in subset:
- # 计算要选择的样本数
- num_samples = int(len(X_train) * rat)
- # 随机选择样本
- subset_train_data = X_train.sample(n=num_samples, random_state=42)
- subset_train_label = y_train.sample(n=num_samples, random_state=42)
- # 训练线性回归模型
- model = LinearRegression()
- model.fit(subset_train_data, subset_train_label)
- y_pred = model.predict(X_test)
- # 计算MSE
- mse = mean_squared_error(y_test, y_pred)
- print(f"训练子集比例 {rat}: MSE = {mse}")
五、实验结论
1)
2)属性的离散化不是必须的,离散化是否有必要要看数据挖掘方法是否需要离散化。
其实从数据库的角度来说,数据离散化也可以实现概念分层,比如用到的数据集中有经纬度属性,每个经纬度表示一个街区的真实地理位置,如果有辅助数据的话,我们可以合并邻近的街区为社区,这样经纬度属性就会变为社区属性,还可以将社区进一步合并为城市,这样经纬度属性就生成了城市名称属性。这样,看似无用的经纬度信息通过离散化就变成了可能影响房价的因素。(问老师离散化必要性得到的解答)