kaggle房价预测问题
发布日期:2021-07-01 02:13:11 浏览次数:2 分类:技术文章

本文共 6471 字,大约阅读时间需要 21 分钟。

参考:

sklean的线性模型完成kaggle房价预测问题

赛题给我们79个描述房屋的特征,要求我们据此预测房屋的最终售价,即对于测试集中每个房屋的ID给出对于的SalePrice字段的预测值,主要考察我们数据清洗、特征工程、模型搭建及调优等方面的技巧。本赛题是典型的回归类问题,评估指标选用的是均方根误差(RMSE),为了使得价格的高低对结果的评估有均等的影响,赛题均方根误差基于预测值和实际值分别取对数对数来计算。特征初步分析:1. SalePrice 房屋售价,我们要预测的label,类型:数值型,单位:美元2. MSSubClass: 建筑的等级,类型:类别型MSZoning: 区域分类,类型:类别型LotFrontage: 距离街道的直线距离,类型:数值型,单位:英尺LotArea: 地皮面积,类型:数值型,单位:平方英尺Street: 街道类型,类型:类别型Alley: 巷子类型,类型:类别型LotShape: 房子整体形状,类型:类别型LandContour: 平整度级别,类型:类别型Utilities: 公共设施类型,类型:类别型LotConfig: 房屋配置,类型:类别型LandSlope: 倾斜度,类型:类别型Neighborhood: 市区物理位置,类型:类别型Condition1: 主干道或者铁路便利程度,类型:类别型Condition2: 主干道或者铁路便利程度,类型:类别型BldgType: 住宅类型,类型:类别型HouseStyle: 住宅风格,类型:类别型OverallQual: 整体材料和饰面质量,类型:数值型OverallCond: 总体状况评价,类型:数值型YearBuilt: 建筑年份,类型:数值型YearRemodAdd: 改建年份,类型:数值型RoofStyle: 屋顶类型,类型:类别型RoofMatl: 屋顶材料,类型:类别型Exterior1st: 住宅外墙,类型:类别型Exterior2nd: 住宅外墙,类型:类别型MasVnrType: 砌体饰面类型,类型:类别型MasVnrArea: 砌体饰面面积,类型:数值型,单位:平方英尺ExterQual: 外部材料质量,类型:类别型ExterCond: 外部材料的现状,类型:类别型Foundation: 地基类型,类型:类别型BsmtQual: 地下室高度,类型:类别型BsmtCond: 地下室概况,类型:类别型BsmtExposure: 花园地下室墙,类型:类别型BsmtFinType1: 地下室装饰质量,类型:类别型BsmtFinSF1: 地下室装饰面积,类型:类别型BsmtFinType2: 地下室装饰质量,类型:类别型BsmtFinSF2: 地下室装饰面积,类型:类别型BsmtUnfSF: 未装饰的地下室面积,类型:数值型,单位:平方英尺TotalBsmtSF: 地下室总面积,类型:数值型,单位:平方英尺Heating: 供暖类型,类型:类别型HeatingQC: 供暖质量和条件,类型:类别型CentralAir: 中央空调状况,类型:类别型Electrical: 电力系统,类型:类别型1stFlrSF: 首层面积,类型:数值型,单位:平方英尺2ndFlrSF: 二层面积,类型:数值型,单位:平方英尺LowQualFinSF: 低质装饰面积,类型:数值型,单位:平方英尺GrLivArea: 地面以上居住面积,类型:数值型,单位:平方英尺BsmtFullBath: 地下室全浴室,类型:数值BsmtHalfBath: 地下室半浴室,类型:数值FullBath: 高档全浴室,类型:数值HalfBath: 高档半浴室,类型:数值BedroomAbvGr: 地下室以上的卧室数量,类型:数值KitchenAbvGr: 厨房数量,类型:数值KitchenQual: 厨房质量,类型:类别型TotRmsAbvGrd: 地上除卧室以外的房间数,类型:数值Functional: 房屋功用性评级,类型:类别型Fireplaces: 壁炉数量,类型:数值FireplaceQu: 壁炉质量,类型:类别型GarageType: 车库位置,类型:类别型GarageYrBlt: 车库建造年份,类别:数值型GarageFinish: 车库内饰,类型:类别型GarageCars: 车库车容量大小,类别:数值型GarageArea: 车库面积,类别:数值型,单位:平方英尺GarageQual: 车库质量,类型:类别型GarageCond: 车库条件,类型:类别型PavedDrive: 铺的车道情况,类型:类别型WoodDeckSF: 木地板面积,类型:数值型,单位:平方英尺OpenPorchSF: 开放式门廊区面积,类型:数值型,单位:平方英尺EnclosedPorch: 封闭式门廊区面积,类型:数值型,单位:平方英尺3SsnPorch: 三个季节门廊面积,类型:数值型,单位:平方英尺ScreenPorch: 纱门门廊面积,类型:数值型,单位:平方英尺PoolArea: 泳池面积,类型:数值型,单位:平方英尺PoolQC:泳池质量,类型:类别型Fence: 围墙质量,类型:类别型MiscFeature: 其他特征,类型:类别型MiscVal: 其他杂项特征值,类型:类别型MoSold: 卖出月份,类别:数值型YrSold: 卖出年份,类别:数值型SaleType: 交易类型,类型:类别型SaleCondition: 交易条件,类型:类别型

在这里插入图片描述

在这里插入图片描述

import pandas as pdimport numpy as npimport seaborn as snsimport matplotlibimport matplotlib.pyplot as pltfrom scipy.stats import skewfrom scipy.stats.stats import pearsonr%config InlineBackend.figure_format = 'retina' #set 'png' here when working on notebook%matplotlib inline
train = pd.read_csv("train.csv")test = pd.read_csv("test.csv")
train.head()
Id MSSubClass MSZoning LotFrontage LotArea Street Alley LotShape LandContour Utilities ... PoolArea PoolQC Fence MiscFeature MiscVal MoSold YrSold SaleType SaleCondition SalePrice
0 1 60 RL 65.0 8450 Pave NaN Reg Lvl AllPub ... 0 NaN NaN NaN 0 2 2008 WD Normal 208500
1 2 20 RL 80.0 9600 Pave NaN Reg Lvl AllPub ... 0 NaN NaN NaN 0 5 2007 WD Normal 181500
2 3 60 RL 68.0 11250 Pave NaN IR1 Lvl AllPub ... 0 NaN NaN NaN 0 9 2008 WD Normal 223500
3 4 70 RL 60.0 9550 Pave NaN IR1 Lvl AllPub ... 0 NaN NaN NaN 0 2 2006 WD Abnorml 140000
4 5 60 RL 84.0 14260 Pave NaN IR1 Lvl AllPub ... 0 NaN NaN NaN 0 12 2008 WD Normal 250000

5 rows × 81 columns

all_data = pd.concat((train.loc[:,'MSSubClass':'SaleCondition'],                      test.loc[:,'MSSubClass':'SaleCondition']))

数据预处理:

我们不会在这里做任何花哨的事情:

首先,我将通过记录(feature+1)来转换倾斜的数字特性-这将使特性更加正常

为分类特征创建虚拟变量

将数字缺失值(NaN)替换为其各自列的平均值

matplotlib.rcParams['figure.figsize'] = (12.0, 6.0)prices = pd.DataFrame({
"price":train["SalePrice"], "log(price + 1)":np.log1p(train["SalePrice"])})prices.hist()
array([[
,
]], dtype=object)

在这里插入图片描述

#log transform the target:train["SalePrice"] = np.log1p(train["SalePrice"])#log transform skewed numeric features:numeric_feats = all_data.dtypes[all_data.dtypes != "object"].indexskewed_feats = train[numeric_feats].apply(lambda x: skew(x.dropna())) #compute skewnessskewed_feats = skewed_feats[skewed_feats > 0.75]skewed_feats = skewed_feats.indexall_data[skewed_feats] = np.log1p(all_data[skewed_feats])
all_data = pd.get_dummies(all_data)
#用列的平均值填充na's:all_data = all_data.fillna(all_data.mean())
#为sklearn创建矩阵:X_train = all_data[:train.shape[0]]X_test = all_data[train.shape[0]:]y = train.SalePrice

模型

现在我们将使用SciKit学习模块中的正则化线性回归模型。我将尝试l_1(套索)和l_2(岭)的正规化。我还将定义一个返回交叉验证RMSE错误的函数,这样我们就可以评估模型并选择最佳的调优参数。

from sklearn.linear_model import Ridge, RidgeCV, ElasticNet, LassoCV, LassoLarsCVfrom sklearn.model_selection import cross_val_scoredef rmse_cv(model):    rmse= np.sqrt(-cross_val_score(model, X_train, y, scoring="neg_mean_squared_error", cv = 5))    return(rmse)
model_ridge = Ridge()

岭模型的主要调整参数是alpha——一个测量模型灵活性的正则化参数。正则化程度越高,模型越不容易过度拟合。但是,它也会失去灵活性,可能无法捕获数据中的所有信号。

alphas = [0.05, 0.1, 0.3, 1, 3, 5, 10, 15, 30, 50, 75]cv_ridge = [rmse_cv(Ridge(alpha = alpha)).mean()             for alpha in alphas]
cv_ridge = pd.Series(cv_ridge, index = alphas)cv_ridge.plot(title = "Validation - Just Do It")plt.xlabel("alpha")plt.ylabel("rmse")
Text(0,0.5,'rmse')

在这里插入图片描述

注意上面的U形曲线。当alpha太大时,正则化太强,模型无法捕获数据中的所有复杂性。然而,如果我们让模型过于灵活(alpha小),模型就会开始过度拟合。根据上面的图,alpha=10的值大约是右的。

cv_ridge.min()
0.1273373466867077

所以对于岭回归,我们得到了大约0.127的rmsle。

让我们试试套索模型。我们将在这里做一个稍微不同的方法,并使用内置的lasso cv为我们找出最好的alpha。出于某种原因,拉索cv中的alphas实际上是反向的,或者脊中的alphas。

model_lasso = LassoCV(alphas = [1, 0.1, 0.001, 0.0005]).fit(X_train, y)
rmse_cv(model_lasso).mean()
0.12314421090977452

好极了!套索的性能更好,所以我们只需要用这个来预测测试集。关于套索的另一个好处是它为你做了特征选择——设置了它认为不重要的特征系数为零。让我们来看看系数:

coef = pd.Series(model_lasso.coef_, index = X_train.columns)
print("Lasso picked " + str(sum(coef != 0)) + " variables and eliminated the other " +  str(sum(coef == 0)) + " variables")
Lasso picked 110 variables and eliminated the other 178 variables

做得好套索。然而,这里需要注意的一点是,所选的特性不一定是“正确的”特性,特别是因为在这个数据集中有很多共线特性。在这里尝试的一个想法是在增强的样本上运行lasso几次,看看特性选择有多稳定。

我们还可以直接看看最重要的系数是什么:

imp_coef = pd.concat([coef.sort_values().head(10),                     coef.sort_values().tail(10)])
matplotlib.rcParams['figure.figsize'] = (8.0, 10.0)imp_coef.plot(kind = "barh")plt.title("Coefficients in the Lasso Model")
Text(0.5,1,'Coefficients in the Lasso Model')

在这里插入图片描述

#let's look at the residuals as well:matplotlib.rcParams['figure.figsize'] = (6.0, 6.0)preds = pd.DataFrame({
"preds":model_lasso.predict(X_train), "true":y})preds["residuals"] = preds["true"] - preds["preds"]preds.plot(x = "preds", y = "residuals",kind = "scatter")

在这里插入图片描述

转载地址:https://maoli.blog.csdn.net/article/details/89441530 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:三十九、Scrapy-redis框架分布式部署
下一篇:回归:预测燃油效率

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月18日 06时22分13秒