Python机器学习▶线性回归——基于sklearn建立房价预测模型!
1. 数据理解
此次建模预测的数据集来源于Data Castle上的“美国King County房价预测训练赛”,链接如下:
数据特征描述如下:
测试集主要包括3000条记录,13个字段,跟训练集的不同是测试集并不包括房屋销售价格,通过由训练集所建立的模型以及所给的测试集,得出测试集相应的房屋销售价格预测值。
2.数据准备
环境:win7+Anaconda+Jupyter notebook
- 导入数据
import pandas as pd import numpy as np #导入训练集 train=pd.read_csv(r"F:\Sets\KingCounty\train.csv") train.head()
发现第一条记录变成了列名,下面进行调整:
#给训练集的列进行赋名 trainNames = ["salesTime","salePrice","bedroomsNum","bathroomNum","housingArea", "parkingArea","floorsNum","housingScore","coveredArea", "basementArea","buildingTime","repairYear","latitude","longitude"] train=pd.read_csv(r"F:\Sets\KingCounty\train.csv",names=trainNames) train.head()
- 查看训练集的形状
训练集中共10000条记录、14条字段
- 查看训练集的数据类型
3.数据清洗
数据清洗的目的
数据清洗主要包括缺失值检查、重复值检查、数据类型转换、剔除异常值。
- 缺失值检查
训练集不存在缺失值
- 重复值检查
训练集不存在重复值
- 数据类型转换
#转换数据类型train["salesTime"] =train["salesTime"].astype(str)train["buildingTime"] =train["buildingTime"].astype(str)train["repairYear"] =train["repairYear"].astype(str)train.info()
- 剔除异常值
将13个自变量分别与因变量["salePrice"]建造散点图:
#1.销售日期与销售价格 import matplotlib.pyplot as plt x1=train["salesTime"] y0=train["salePrice"] plt.scatter(x1,y0) plt.xlabel("salesTime") plt.ylabel("salePrice") plt.show()
......
#13.经度与销售价格
其中,房屋面积与销售价格、建筑面积与销售价格有明显的线性趋势,且都有明显的离群值。
房屋面积与销售价格
建筑面积与销售价格
#开始剔除异常值
# 再次绘图
4. 建立模型
- 查看因变量数据分布
建立线性回归模型,首先需要查看一下因变量["salePrice"]是否服从正态分布:
#检查数据偏斜度print("Skew is:",train["salePrice"].skew())plt.hist(train["salePrice"],color="orange")plt.show()
因变量很明显是正偏,需要进行对数处理:
target=np.log(train["salePrice"]) print("Skew is:",target.skew()) plt.hist(target,color="orange") plt.show()
对因变量["salePrice"]进行对数处理后再次建图会发现这次基本符合正态分布,可以进行线性回归建模。
- 特征工程,筛选变量
#各变量和因变量之间的相关性 corr=train.corr() print(corr["salePrice"].sort_values(ascending=False)) corr["salePrice"].plot(kind="bar",color="b",alpha=0.6) plt.ylabel("Relevance") plt.yticks([0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]) plt.xticks(rotation=65) plt.show()
可发现,经度["longitude"]与销售价格的相关性仅有约0.029,可以剔除。
- 构建线性回归模型
#拆分训练集与验证集 from sklearn.model_selection import train_test_split x_train,x_test,y_train,y_test = train_test_split(x,y, random_state=10, test_size=0.2)
使用R^2(拟合优度)指标来评估模型的性能,它的取值在0到1之间,较高的R平方值代表着更好的拟合。
得到的R^2结果可说明筛选的特征变量能解释目标变量中约74%的差异。一般来说拟合优度在0.7以上,我们就认为模型是可靠的。
至此,预测模型建立完成。
接下来,将测试集数据带入预测模型,生成预测结果。
5.数据预测
- 导入测试集
#转换数据类型 test["salesTime"] =test["salesTime"].astype(str) test["buildingTime"] =test["buildingTime"].astype(str) test["repairYear"] =test["repairYear"].astype(str) test.info()
- 生成预测
#测试集特征变量 features2=test[["bedroomsNum","salesTime","bathroomNum", "housingArea","parkingArea","floorsNum", "housingScore","coveredArea","basementArea", "buildingTime","repairYear","latitude"]] features2.head()
把预测值转换为正确的形式,反向使用log(),执行exp()。因此,用np.exp()来做预测,因为之前已经取了对数。
#最终预测 final_prediction = np.exp(model.predict(features2)) final_prediction
最终预测结果
将预测结果数据写入文件:
#将预测结果导出为CSV文件 test.to_csv(r"C:\Users\Administrator\Desktop\price.csv")
- 官网提交结果
仍可通过部分参数的调整改进预测模型,提升预测效果。进入Data Castle页面按照要求格式提交结果。
源码获取私信小编01哦!