[kaggle]房屋价格:先进的回归技术 预测
比赛描述
地址:https://www.kaggle.com/c/house-prices-advanced-regression-techniques
了解背景:
- 当购房者描述他们的梦想中的房子,他们可不会从地下室天花板的高度或与东西方铁路的距离开始描述。比赛的数据集证明,与价格的影响相比,卧室或白色栅栏的数量更具影响力。
这里有79个解释变量(几乎)描述了爱荷华州埃姆斯市住宅的方方面面。
预测指标:
- 预测1459个房屋的最终价格。
- 分数:均方根误差
- 含有 Id ,SalePrice的数据。该文件应具有标题行。
预览数据:
数据预处理
导入库:
import warnings
import pandas as pd
import pandas_profiling
import numpy as np
import seaborn as sns
from scipy import stats
from scipy.stats import skew
from scipy.stats import norm
import matplotlib
import matplotlib.pyplot as plt
warnings.filterwarnings('ignore')
观察数据:
# 导入数据
train_data = pd.read_csv('../house-prices-advanced-regression-techniques/train.csv')
test_data = pd.read_csv('../house-prices-advanced-regression-techniques/test.csv')
train_data.info()
train_data.describe()
##固定模块可视化数值间的关系
pandas_profiling.ProfileReport(train_data).to_file('./example.html')
!!!!!!!!!!!!!!!!
去除异常/无关的值————————————————
# 装修质量,居住面积,建造年限,地下室面积与售价关系
sns.pairplot(x_vars=['OverallQual', 'GrLivArea', 'YearBuilt', 'TotalBsmtSF'], y_vars=['SalePrice'], data=train_data,
dropna=True)
# 去除离群点,异常点
train_data.drop(train_data[(train_data['OverallQual'] < 5) & (train_data['SalePrice'] > 200000)].index, inplace=True)
train_data.drop(train_data[(train_data['GrLivArea'] > 4000) & (train_data['SalePrice'] < 300000)].index, inplace=True)
train_data.reset_index(drop=True, inplace=True) # 引索重制
查看目标变量SalePrice模型:skewness=1.56
# log正态
train_data['SalePrice'] = np.log(train_data['SalePrice'])
sns.distplot(train_data['SalePrice'][train_data['SalePrice'].notnull()],
label='skewness:%.2f' % (train_data['SalePrice'].skew())).legend(loc='best')
# 合并训练数据,测试数据
df = train_data.append(test_data, ignore_index=True)
## 删除Id,SalePrice列
df.drop(['Id'], axis=1, inplace=True)
df.drop(['SalePrice'], axis=1, inplace=True)
df.describe()
df.shape
缺失值处理————————————————
# 查看缺失值
df.isnull().sum().sort_values(ascending=False)
# 影响较小且缺失数量多的,None填充
cols1 = ['PoolQC', 'MiscFeature', 'Alley', 'Fence', 'FireplaceQu', 'GarageQual', 'GarageCond', 'GarageFinish',
'GarageYrBlt', 'GarageType', 'BsmtExposure', 'BsmtCond', 'BsmtQual', 'BsmtFinType2', 'BsmtFinType1',
'MasVnrType']
for col in cols1:
df[col].fillna('None', inplace=True)
# 房屋无配置物品,用0填充
cols2 = ['BsmtUnfSF', 'TotalBsmtSF', 'BsmtFinSF2', 'BsmtFinSF1', 'BsmtFullBath', 'BsmtHalfBath', \
'MasVnrArea', 'GarageCars', 'GarageArea', 'GarageYrBlt']
for col in cols2:
df[col].fillna(0, inplace=True)
# 缺失值的数量较少,用众数填充
cols3 = ['MSZoning', 'BsmtFullBath', 'BsmtHalfBath', 'Utilities', 'Functional', 'Electrical', 'KitchenQual', 'SaleType',
'Exterior1st', '