房价预测_房价预测模型 - CSDN
精华内容
参与话题
  • python实现房价预测(一)

    万次阅读 多人点赞 2018-09-01 23:01:04
    这是一个预测房价的项目,项目来自kaggle的housing。 项目的目的是预测房价,需要从众多可能的影响因子中挑选出最能预测房价的因子来建立模型,用于预测房价。 分析步骤: 1. 理解项目目的,再围绕目的进行分析...

    这是一个预测房价的项目,项目来自kaggle的housing。

    项目的目的是预测房价,需要从众多可能的影响因子中挑选出最能预测房价的因子来建立模型,用于预测房价。

    分析步骤:

    1.  理解项目目的,再围绕目的进行分析。本项目的目的根据数据预测房价;

    2. 了解数据的分布特征,根据实际项目理解每列数据的意义。在数据分析时,最重要的是要熟悉业务,在业务基础上再分析,事半功倍;

    3. 挑选特征。刻画每个特征与目标变量之间的关系,找出最重要的特征;同时,为了避免多重共线性,需剔除掉一个特征与特征之间相关性非常大的特征;

    4. 应用交叉验证,对训练集进行建立合适的模型,再在测试集上测试;

    5. 最终建立预测房价的模型。

    下面是实践部分:

    1. 首先查看数据  

    Ask a home buyer to describe their dream house, and they probably won't begin with the height of the basement ceiling or the proximity to an east-west railroad. But this playground competition's dataset proves that much more influences price negotiations than the number of bedrooms or a white-picket fence.

    With 79 explanatory variables describing (almost) every aspect of residential homes in Ames, Iowa, this competition challenges you to predict the final price of each home.

    • SalePrice - the property's sale price in dollars. This is the target variable that you're trying to predict.
    • MSSubClass: The building class
    • MSZoning: The general zoning classification
    • LotFrontage: Linear feet of street connected to property
    • LotArea: Lot size in square feet
    • Street: Type of road access
    • Alley: Type of alley access
    • LotShape: General shape of property
    • LandContour: Flatness of the property
    • Utilities: Type of utilities available
    • LotConfig: Lot configuration
    • LandSlope: Slope of property
    • Neighborhood: Physical locations within Ames city limits
    • Condition1: Proximity to main road or railroad
    • Condition2: Proximity to main road or railroad (if a second is present)
    • BldgType: Type of dwelling
    • HouseStyle: Style of dwelling
    • OverallQual: Overall material and finish quality
    • OverallCond: Overall condition rating
    • YearBuilt: Original construction date
    • YearRemodAdd: Remodel date
    • RoofStyle: Type of roof
    • RoofMatl: Roof material
    • Exterior1st: Exterior covering on house
    • Exterior2nd: Exterior covering on house (if more than one material)
    • MasVnrType: Masonry veneer type
    • MasVnrArea: Masonry veneer area in square feet
    • ExterQual: Exterior material quality
    • ExterCond: Present condition of the material on the exterior
    • Foundation: Type of foundation
    • BsmtQual: Height of the basement
    • BsmtCond: General condition of the basement
    • BsmtExposure: Walkout or garden level basement walls
    • BsmtFinType1: Quality of basement finished area
    • BsmtFinSF1: Type 1 finished square feet
    • BsmtFinType2: Quality of second finished area (if present)
    • BsmtFinSF2: Type 2 finished square feet
    • BsmtUnfSF: Unfinished square feet of basement area
    • TotalBsmtSF: Total square feet of basement area
    • Heating: Type of heating
    • HeatingQC: Heating quality and condition
    • CentralAir: Central air conditioning
    • Electrical: Electrical system
    • 1stFlrSF: First Floor square feet
    • 2ndFlrSF: Second floor square feet
    • LowQualFinSF: Low quality finished square feet (all floors)
    • GrLivArea: Above grade (ground) living area square feet
    • BsmtFullBath: Basement full bathrooms
    • BsmtHalfBath: Basement half bathrooms
    • FullBath: Full bathrooms above grade
    • HalfBath: Half baths above grade
    • Bedroom: Number of bedrooms above basement level
    • Kitchen: Number of kitchens
    • KitchenQual: Kitchen quality
    • TotRmsAbvGrd: Total rooms above grade (does not include bathrooms)
    • Functional: Home functionality rating
    • Fireplaces: Number of fireplaces
    • FireplaceQu: Fireplace quality
    • GarageType: Garage location
    • GarageYrBlt: Year garage was built
    • GarageFinish: Interior finish of the garage
    • GarageCars: Size of garage in car capacity
    • GarageArea: Size of garage in square feet
    • GarageQual: Garage quality
    • GarageCond: Garage condition
    • PavedDrive: Paved driveway
    • WoodDeckSF: Wood deck area in square feet
    • OpenPorchSF: Open porch area in square feet
    • EnclosedPorch: Enclosed porch area in square feet
    • 3SsnPorch: Three season porch area in square feet
    • ScreenPorch: Screen porch area in square feet
    • PoolArea: Pool area in square feet
    • PoolQC: Pool quality
    • Fence: Fence quality
    • MiscFeature: Miscellaneous feature not covered in other categories
    • MiscVal: Value of miscellaneous feature
    • MoSold: Month Sold
    • YrSold: Year Sold
    • SaleType: Type of sale
    • SaleCondition: Condition of sale

    仔细观察每一列特征的含义,以上特征包含建造位置、面积、等级、质量、类型、配套设施、建造时间、出售时间等等。

    import numpy as np
    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    data = pd.read_csv('train.csv')
    # 查看数据
    data.head()
    # 查看数据集形状
    data.shape
    # 查看数据集数据类型
    data.dtypes
    
    
    
    

    展示部分数据类型,其中包含连续型和离散型数据。

    2. 分析目标变量

    在分析之前,首先要了解目标,查看目标类型、分布,有无异常值。根据不同的类型选择不同的模型。

    [in]: data['SalePrice'].describe()

    [out]:

    count      1460.000000
    mean     180921.195890
    std       79442.502883
    min       34900.000000
    25%      129975.000000
    50%      163000.000000
    75%      214000.000000
    max      755000.000000
    Name: SalePrice, dtype: float64

    目标变量为连续型,无特别异常值(0或者负数)

    再看看目标变量分布:

    [in]:sns.distplot(data['SalePrice'])

    3. 挑选最佳特征

    从80个特征中选出与目标变量SalePrice相关的特征。

    a. 针对连续型变量,可以使用“皮尔逊相关系数”找出与目标变量最相关的特征

    皮尔逊相关系数是描述两连续性变量线性相关程度的统计量,取值范围[-1,+1],符号代表相关性正负,数值代表相关性强弱。r=Sxy/(SxSy)

    1) 一楼面积

    sns.jointplot(x='1stFlrSF',y='SalePrice',data=data)

    皮尔逊相关系数0.61,中度正相关

    2)房屋面积

    sns.jointplot(x='GrLivArea',y='SalePrice',data=data)

    皮尔逊相关系数0.71,强正相关

    3)泳池面积

    sns.jointplot(x='PoolArea',y='SalePrice',data=data)

    皮尔逊相关系数0.092,不相关

    通过以上数据可以看到,建造面积与销售价格有很强的相关性,而一楼面积相关性相对较低,泳池面积几乎无相关性。

    相关性越高代表该特征变化能够带来目标变量的变化,需要注意的是相关性并不代表因果关系,只能说特征对目标的影响较大。

    此外,还可以用seaborn里面的线型回归查看拟合直线

    sns.lmplot(x='GrLivArea',y='SalePrice',data=data)

    b. 针对分类变量,无法使用皮尔逊相关系数,可以通过观察每个分类值上目标变量的变化程度来查看相关性,通常来说,在不同值上数据范围变化较大,两变量相关性较大

    盒须图

    1) 房屋材料与质量

    sns.boxplot(x='OverallQual',y='SalePrice',data=data)

    房屋质量越好,总体来说价格越贵

    2)建造年代

    sns.boxplot(x='YearBuilt',y='SalePrice',data=data)

    房屋建造年代与价格没有明显的相关性

    柱状图

    使用groupby将价格按照特征分类,再去平均值,使用柱状图展示

    grouped = data.groupby('OverallQual')
    g1 = grouped['SalePrice'].mean().reset_index('OverallQual')
    sns.barplot(x='OverallQual',y='SalePrice',data=g1)

    c. 以上两种分析都是针对单个特征与目标变量逐一分析,这种方法非常耗时繁琐,下面介绍一种系统性分析特征与目标变量相关性的方法,通过对数据集整体特征(数值型数据)进行分析,来找出最佳特征。

    热力图  sns.heatmap()

    首先用计算出两两之间的相关系数data.corr(),再利用热力图显示两两相关性。

    %pylab inline
    # 设置图幅大小
    pylab.rcParams['figure.figsize'] = (15, 10)
    # 计算相关系数
    corrmatrix = data.corr()
    # 绘制热力图,热力图横纵坐标分别是data的index/column,vmax/vmin设置热力图颜色标识上下限,center显示颜色标识中心位置,cmap颜色标识颜色设置
    sns.heatmap(corrmatrix,square=True,vmax=1,vmin=-1,center=0.0,cmap='coolwarm')

    热力图中,不仅可以看到与SalePrice相关性较大的特征,还可以看到与有两个区域相关性比较集中,一个是TotalBsmtSF与1stFlrSF相关性较高,对目标变量来说,这两个特征具有共线性,还有一个是GarageYrBit/GarageCars/GarageArea这三个特征,在建模时,只需去其中一个作为目标变量的特征即可。

    特征较多,且相关性不大的特征可以忽略,选取相关性排前十的特征:

    # 取相关性前10的特征
    k=10
    # data.nlargest(k, 'target')在data中取‘target'列值排前十的行
    # cols为排前十的行的index,在本例中即为与’SalePrice‘相关性最大的前十个特征名
    cols = corrmatrix.nlargest(k,'SalePrice')['SalePrice'].index
    cm = np.corrcoef(data[cols].values.T)
    #data[cols].values.T
    #设置坐标轴字体大小
    sns.set(font_scale=1.25)
    # sns.heatmap() cbar是否显示颜色条,默认是;cmap显示颜色;annot是否显示每个值,默认不显示;
    # square是否正方形方框,默认为False,fmt当显示annotate时annot的格式;annot_kws为annot设置格式
    # yticklabels为Y轴刻度标签值,xticklabels为X轴刻度标签值
    hm = sns.heatmap(cm,cmap='RdPu',annot=True,square=True,fmt='.2f',annot_kws={'size':10},yticklabels=cols.values,xticklabels=cols.values)
    
    
    # 上例提供了求相关系数另一种方法,也可以直接用data.corr(),更方便
    cm1 = data[cols].corr()
    hm2 = sns.heatmap(cm1,square=True,annot=True,cmap='RdPu',fmt='.2f',annot_kws={'size':10})
    

    由上图可以看出:

    1. 'OverallQual', 'GrLivArea'这两个变量与'SalePrice'有很强的线性关系;

    2. 'GarageCars', 'GarageArea'与'SalePrice'也有很强的线性关系,但'GarageCars', 'GarageArea'相关性0.88,有很强的共线性,只取其一即可,取与目标变量关系更强的'GarageCars';

    3. 同样地,'TotalBsmtSF', '1stFlrSF'也有很强的共线性,只取其一即可,取'TotalBsmtSF';

    4. 因此,选取的特征有:'OverallQual', 'GrLivArea', 'GarageCars', 'TotalBsmtSF', 'FullBath', 'TotRmsAbvGrd', 'YearBuilt'。

    sns.pairplot()

    cols1 = ['SalePrice', 'OverallQual', 'GrLivArea', 'GarageCars','TotalBsmtSF', 'FullBath', 'TotRmsAbvGrd', 'YearBuilt']
    sns.pairplot(data[cols1],size=2.5)

    不管是离散型还是连续型数据,只要是数值型数据,sns.heatmap()都能找出两两特征之间的相关性,但要说明的是,这里的离散型数值型特征在处理时被当成连续型特征计算,因此,离散型数值特征的排序会影响相关性结果。

    4. 数据处理

    a. Missing value

    # isnull() boolean, isnull().sum()统计所有缺失值的个数
    # isnull().count()统计所有项个数(包括缺失值和非缺失值),.count()统计所有非缺失值个数
    total = data.isnull().sum().sort_values(ascending=False)
    percent = (data.isnull().sum()/data.isnull().count()).sort_values(ascending=False)
    # pd.concat() axis=0 index,axis=1 column, keys列名
    missing_data = pd.concat([total,percent],axis=1,keys = ['Total','Percent'])
    missing_data.head(20)

    缺失值超过80%的有特征“PoolQC”, "MiscFeature", "Alley", "Fence",可以认定这些特征无效,可以剔除。

    # 处理缺失值,将含缺失值的整列剔除
    data1 = data.drop(missing_data[missing_data['Total']>1].index,axis=1)
    # 由于特征Electrical只有一个缺失值,故只需删除该行即可
    data2 = data1.drop(data1.loc[data1['Electrical'].isnull()].index)
    # 检查缺失值数量
    data2.isnull().sum().max()

    0

    5. 建立模型

    首先划分数据集,使用sklearn里面的train_test_split()可以将数据集划分为训练集和测试集。

    feature_data = data2.drop(['SalePrice'],axis=1)
    target_data = data2['SalePrice']
    
    # 将数据集划分为训练集和测试集
    from sklearn.model_selection import train_test_split
    X_train,X_test,y_train, y_test = train_test_split(feature_data, target_data, test_size=0.3)

    a. 线性回归模型

    线性回归模型是最简单的模型,实际应用中已经很少用到了,作为基础知识练习

    from statsmodels.formula.api import ols
    from statsmodels.sandbox.regression.predstd import wls_prediction_std
    
    df_train = pd.concat([X_train,y_train],axis=1)
    # ols("target~feature+C(feature)", data=data
    # C(feature)表示这个特征为分类特征category
    lr_model = ols("SalePrice~C(OverallQual)+GrLivArea+C(GarageCars)+TotalBsmtSF+C(FullBath)+YearBuilt",data=df_train).fit()
    print(lr_model.summary())
    
    # 预测测试集
    lr_model.predict(X_test)

    判定系数R2表示,房价“SalePrice”的变异性的79%,能用该多元线性回归方程解释;

    在该多元线性回归方程中,也有很多特征的P_value大于0.05,说明这些特征对y值影响非常小,可以剔除。

    # prstd为标准方差,iv_l为置信区间下限,iv_u为置信区间上限
    prstd, iv_l, iv_u = wls_prediction_std(lr_model, alpha = 0.05)
    # lr_model.predict()为训练集的预测值
    predict_low_upper = pd.DataFrame([lr_model.predict(),iv_l, iv_u],index=['PredictSalePrice','iv_l','iv_u']).T
    predict_low_upper.plot(kind='hist',alpha=0.4)

    除了得到模型外,还可以看看模型预测值是否在置信区间之内:wls_prediction_std(model, alpha=0.05)可以得到显著性水平为0.05的置信区间。由以上直方图可以看到预测值均在置信区间内。

    虽然线性回归模型能解释79%的房价,但仍然是比较简易基础的模型,接下来会使用更高级的模型对房价进行预测。

     

    展开全文
  • 房价预测(完整版)

    万次阅读 多人点赞 2018-06-04 15:01:57
    题目描述:依据一个房子的全方位信息,包括面积,地段,环境,等等预测出房子的价格 题目详情 题目解答: 首先进行数据的预处理; #数据的读取 import numpy as np import pandas as pd #一般来说源数据的index...
    • 题目描述:依据一个房子的全方位信息,包括面积,地段,环境,等等预测出房子的价格
      题目详情
    • 题目解答:
      首先进行数据的预处理;
    #数据的读取
    import numpy as np
    import pandas as pd
    #一般来说源数据的index那一栏没什么用,我们可以用来作为我们pandas dataframe的index。这样之后要是检索起来也省事儿。
    train_df = pd.read_csv('../input/train.csv', index_col=0)
    test_df = pd.read_csv('../input/test.csv', index_col=0)
    train_df.head()

    这里写图片描述

    结合数据描述以及以上输出结果可以大致得出哪些数据需要人为处理一下,题目分别给出了训练集和测试集,这里我们为了方便统一处理,先将二者数据合并,等所有的需要的预处理进行完之后,我们再把他们分隔开。需注意的是SalePrice作为我们的训练目标,只会出现在训练集中,不会在测试集中(要不然你测试什么?)。所以,我们先把SalePrice这一列给拿出来,不让它碍事儿。

    prices = pd.DataFrame({"price":train_df["SalePrice"], "log(price + 1)":np.log1p(train_df["SalePrice"])})
    prices.hist()

    这里写图片描述
    可见,price本身并不平滑。为了我们分类器的学习更加准确,我们会首先把price给“平滑化”(正态化)这里我们使用log1p, 也就是 log(x+1),避免了复值的问题。
    如果我们这里把数据都给平滑化了,那么最后算结果的时候,要记得把预测到的平滑数据给变回去。

    #将训练目标单独拿出
    #y_train则是SalePrice那一列
    y_train = np.log1p(train_df.pop('SalePrice'))
    #把剩下的部分合并起来
    all_df = pd.concat((train_df, test_df), axis=0)
    all_df.shape
    y_train.head()

    下面进行变量转化,把不方便处理或不一致的数据给统一了,首先,我们注意到,MSSubClass 的值其实应该是一个分类型的,但是Pandas是不会懂这些事儿的。使用时,这类数字符号会被默认记成数字。我们需要把它变回成string

    all_df['MSSubClass'].dtypes
    all_df['MSSubClass'] = all_df['MSSubClass'].astype(str)
    #变成str以后,做个统计
    all_df['MSSubClass'].value_counts()

    把分类变量转变成数值表达形式时,要注意,数字本身有大小的含义,所以乱用数字会给之后的模型学习带来麻烦。于是我们可以用One-Hot的方法来表达。
    pandas自带的get_dummies方法,可以帮你一键做到One-Hot(one-Hot讲解)。

    #MSSubClass被分成了12个column,每一个代表一个类。是就是1,不是就是0。
    pd.get_dummies(all_df['MSSubClass'], prefix='MSSubClass').head()

    这里写图片描述

    #同理,我们把所有的类数据,都给One-Hot了
    all_dummy_df = pd.get_dummies(all_df)
    all_dummy_df.head()

    这里写图片描述
    下面开始处理数值型变量,比如缺失值的处理等

    all_dummy_df.isnull().sum().sort_values(ascending=False).head(10)

    这里写图片描述
    可以看到,缺失最多的列是LotFrontage处理这些缺失的信息,得靠好好审题。一般来说,数据集的描述里会写的很清楚,这些缺失都代表着什么。在这里,我们用平均值来填满这些空缺。

    #计算平均值
    mean_cols = all_dummy_df.mean()
    mean_cols.head(10)

    这里写图片描述

    #用平均值填补缺失值
    all_dummy_df = all_dummy_df.fillna(mean_cols)
    #查看填补后是否还有缺失值
    all_dummy_df.isnull().sum()#.sum()

    接着标准化数值型数据,这一步并不是必要,但是得看你想要用的分类器是什么。一般来说,regression的分类器都比较傲娇,最好是把源数据给放在一个标准分布内。不要让数据间的差距太大。这里,我们当然不需要把One-Hot的那些0/1数据给标准化。我们的目标应该是那些本来就是数值型的数据:

    #查看哪些数据是数值型的
    numeric_cols = all_df.columns[all_df.dtypes != 'object']
    numeric_cols

    这里写图片描述
    计算标准分布:(X-X’)/s让我们的数据点更平滑,更便于计算。

    numeric_col_means = all_dummy_df.loc[:, numeric_cols].mean()
    numeric_col_std = all_dummy_df.loc[:, numeric_cols].std()
    all_dummy_df.loc[:, numeric_cols] = (all_dummy_df.loc[:, numeric_cols] - numeric_col_means) / numeric_col_std

    处理完数据后把数据分回训练集和测试集,开始建模。

    #将数据分回训练集和测试集
    dummy_train_df = all_dummy_df.loc[train_df.index]
    dummy_test_df = all_dummy_df.loc[test_df.index]
    #查看训练集和测试集的维度
    dummy_train_df.shape, dummy_test_df.shape
    #首先选用Ridge Regression模型观察效果
    from sklearn.linear_model import Ridge
    from sklearn.model_selection import cross_val_score
    #把数据框形式转化为numpy Array形式,跟sklearn更配
    X_train = dummy_train_df.values
    X_test = dummy_test_df.values
    #用sklearn自带的cross validation进行模型调参
    alphas = np.logspace(-3, 2, 50)
    test_scores = []
    for alpha in alphas:
        clf = Ridge(alpha)
        test_score = np.sqrt(-cross_val_score(clf, X_train, y_train, cv=10, scoring='neg_mean_squared_error'))
        test_scores.append(np.mean(test_score))
    #调参结果可视化
    import matplotlib.pyplot as plt
    %matplotlib inline
    plt.plot(alphas, test_scores)
    plt.title("Alpha vs CV Error");

    这里写图片描述
    可以看到,alpha在10-20之间时误差达到最小值0.135左右,下面用RF模型,看得出的结果怎么样

    from sklearn.ensemble import RandomForestRegressor
    max_features = [.1, .3, .5, .7, .9, .99]
    test_scores = []
    for max_feat in max_features:
        clf = RandomForestRegressor(n_estimators=200, max_features=max_feat)
        test_score = np.sqrt(-cross_val_score(clf, X_train, y_train, cv=5, scoring='neg_mean_squared_error'))
        test_scores.append(np.mean(test_score))
    plt.plot(max_features, test_scores)
    plt.title("Max Features vs CV Error");

    这里写图片描述
    可以看到,用RF模型,误差达到0.137左右。
    Bagging把很多的小分类器放在一起,下面我们将小分类器设为Ridge Regression Sklearn已经直接提供了这套构架,我们直接调用就行:

    #在这里取alpha=15
    from sklearn.linear_model import Ridge
    ridge = Ridge(15)
    from sklearn.ensemble import BaggingRegressor
    from sklearn.model_selection import cross_val_score
    #在这里,我们用CV结果来测试不同的分类器个数对最后结果的影响。
    #注意,我们在用Bagging的时候,要把它的函数base_estimator里填上小分类器(ridge)
    params = [1, 10, 15, 20, 25, 30, 40]
    test_scores = []
    for param in params:
        clf = BaggingRegressor(n_estimators=param, base_estimator=ridge)
        test_score = np.sqrt(-cross_val_score(clf, X_train, y_train, cv=10, scoring='neg_mean_squared_error'))
        test_scores.append(np.mean(test_score))
    import matplotlib.pyplot as plt
    %matplotlib inline
    plt.plot(params, test_scores)
    plt.title("n_estimator vs CV Error");

    这里写图片描述
    可以得到,当小分类器个数为20时,误差低于0.132,优于Ridge Regression模型的出的0.135
    Boosting比Bagging理论上更高级点,下一个分类器把上一个分类器误分的样本加上更高的权重,这样下一个分类器就能在这个部分学得更加“深刻”。

    from sklearn.ensemble import AdaBoostRegressor
    params = [10, 15, 20, 25, 30, 35, 40, 45, 50]
    test_scores = []
    for param in params:
        clf = BaggingRegressor(n_estimators=param, base_estimator=ridge)
        test_score = np.sqrt(-cross_val_score(clf, X_train, y_train, cv=10, scoring='neg_mean_squared_error'))
        test_scores.append(np.mean(test_score))
    plt.plot(params, test_scores)
    plt.title("n_estimator vs CV Error");

    这里写图片描述
    Adaboost+Ridge在这里,25个小分类器的情况下,也是达到了接近0.132的效果。
    最后,我们来看看XGBoost,这依旧是Boosting框架的模型

    from xgboost import XGBRegressor
    params = [1,2,3,4,5,6]
    test_scores = []
    for param in params:
        clf = XGBRegressor(max_depth=param)
        test_score = np.sqrt(-cross_val_score(clf, X_train, y_train, cv=10, scoring='neg_mean_squared_error'))
        test_scores.append(np.mean(test_score))
    import matplotlib.pyplot as plt
    %matplotlib inline
    plt.plot(params, test_scores)
    plt.title("max_depth vs CV Error");

    这里写图片描述
    令人吃惊的是,深度为5的时候,错误率缩小到0.127

    展开全文
  • Kaggle--房价预测

    千次阅读 2018-07-07 21:27:55
    房价预测 目录 目录 一、认识数据 二、定性分析 2.1 属性的意义 2.2 属性分析 三、缺失值处理 3.1 缺失值举例 3.2 缺失值统计 3.3 填充缺失值 3.4 格式转换 四、特征分析 4.1 房价分析 4.2 房价属性的...


    房价预测

    目录

    一、认识数据

      House Prices数据集分为train(即训练)数据和test(即测试)数据,其中,训练集含有1460个样本,80个属性(包括序号),一个标签(SalePrice,即房价);测试集含有1459个样本,80个属性。
      需要做的工作:根据测试集的属性预测每个样本的房价。



    图1

    二、定性分析

    2.1 属性的意义

    SalePrice 以美元出售的房产价格。
    MSSubClass 建筑类
    MSZoning 城市总体规划分区
    LotFrontage 连接物业的街道线
    LotArea: Lot size in square feet 方块大小
    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 1型成品面积
    BsmtFinType2 第二成品区域的质量(如果存在)
    BsmtFinSF2 2型成品面积
    BsmtUnfSF 地下室面积
    TotalBsmtSF 地下室面积总计面积
    Heating 暖气方式
    HeatingQC 暖气质量与条件
    CentralAir 空调
    Electrical 电气系统
    1stFlrSF 一楼面积
    2ndFlrSF 二楼面积
    LowQualFinSF 低质量完工面积(所有楼层)
    GrLivArea 高档(地面)居住面积
    BsmtFullBath 地下室全浴室
    BsmtHalfBath 地下室半浴室
    FullBath 高档浴室
    HalfBath 半日以上洗澡浴室
    Bedroom 地下室层以上的卧室数
    Kitchen 厨房数量
    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 销售条件

    2.2 属性分析

      可以看出,标签为房价,而对于79个属性主要分为几分方面:
    (1)房子地理位置:
    MSSubClass、MSZoning、LotFrontage、LotArea、Street、Alley、LotShape、LandContour、Utilities、LotConfig、LandSlope、Neighborhood、Condition1、Condition2
    (2)房子风格:
    BldgType、HouseStyle、OverallQual、OverallCond
    (3)房子装修:
    YearBuilt、YearRemodAdd、RoofStyle、RoofMatl、Exterior1st、Exterior2nd、MasVnrType、MasVnrArea、ExterQual:
    ExterCond
    (4)地下室:
    Foundation、BsmtQual、BsmtCond、BsmtExposure:、BsmtFinType1、BsmtFinSF1、BsmtFinType2、BsmtFinSF2、BsmtUnfSF、TotalBsmtSF
    (5)冷暖气:
    Heating、HeatingQC、CentralAir、Electrical
    (6)居住面积:
    1stFlrSF、2ndFlrSF、LowQualFinSF、GrLivArea
    (7)功能房间:
    BsmtFullBath、BsmtHalfBath、FullBath、HalfBath、Bedroom、Kitchen、KitchenQual、TotRmsAbvGrd、Functional
    (8)车库:
    GarageType、GarageYrBlt、GarageFinish、GarageCars、GarageArea、GarageQual、GarageCond、PavedDrive
    (9)其他面积:
    WoodDeckSF、OpenPorchSF、EnclosedPorch、3SsnPorch:、ScreenPorch、PoolArea
    (10)销售:
    MoSold、YrSold、SaleType、SaleCondition
    (11)其他:
    Fireplaces、FireplaceQu、PoolQC、Fence、MiscFeature、MiscVal

      假如数据真实可靠,则从实际情况考虑,对于一个房子的价格,最重要的属性首先应该有:地理位置、面积、地下室、冷暖气、车库、房子质量,还有会影响到房价的有:销售条件如时间和方式。所以先可以着重讨论这些方面的属性。

    三、缺失值处理

    3.1 缺失值举例

      图中NA就是缺失值:



    图2

    3.2 缺失值统计

      训练集数据缺失情况, 和它们对应的意义为:



    图3

    3.3 填充缺失值

      缺失数据的变量有很多,处理情况可以分为如下几类:
    (1)缺失多
      直接数据集中剔除哪些存在大量缺失值的变量 缺失量比较多的PoolQC、MiscFeature、Alley、Fence、FireplaceQu是由于房子没有泳池、特殊的设施、旁边的小巷、篱笆、壁炉等设施。 由于缺失量比较多,缺失率超过40%,我们直接移除这几个变量。

    (2)车库的属性
      由于有些房子没有车库,造成车库相关的属性缺失,对于这种情况,我们有missing填充,同时对于车库建造时间的缺失,我们用1900填充,表示车库是年久的,使其变得不重要。

    (3)与装修有关

      有些房子重装修过,但是有些房子是没重装修过的,所有有关的属性可能确实。这是使用missing填充装修情况,用0填充装修面积。

    (4)其它确实较少的属性
      由于Electrical等属性缺失较少,可以使用众数填充:

    3.4 格式转换

      为了使得特征分析顺利进行,首先对字符串型的属性转换到数值型,其中,字符型的属性为:

      转换的规则是:对于字符型属性,按照各个类型的属性的不同取值时房价的均值排高低,按此顺序从低往高,给属性的不同取值赋予1,2,3,4……,使得其变成数值型。

      经过转换后的属性全部为数值型,这时有利于进行分析。

    四、特征分析

    4.1 房价分析

      首先对房价进行分析,画出房价的分布图为:



    图4

      从图中可以看出关于房价分布图有几个特点:
    (1)偏离正态分布
    (2)有明显的正偏态
    (3)有峰值
      进一步求得
    偏度: 1.882876
    峰度: 6.536282

      我们可以知道,在数据中房价主要集中在区间[100000,300000]中,而有关小于100000,和大于300000的房价是偏向异常数据,在进一步考虑时,应该适当合理区分这些数据。

    4.2 房价属性的关系

      在此先分析房价与属性的关系,其中数值型的属性有,字符型的在上面已展示。

      在定性前面分析知,面积等属性与房价是有关系的,下面将分析一下它们的关系,部分情况如图所示:





    图5

      从图中还是很明显地看出, “GrLivArea”和“TotalBsmtSF”似乎与“SalePrice”是线性相关的。这两种关系都是正的,这意味着当一个变量增加时,另一个变量也会增加。 “OverallQual”和“YearBuilt”似乎也与“SalePrice”有关。这种关系似乎在“Overallqual”的情况下更加强烈,在这种情况下,箱型图显示了销售价格是如何随着整体质量而增长的。
      相同的情况分析其它属性得到与房价近似正相关关系的属性有:
    Foundation、Heating、Electrical、SaleType、2ndFlrSF、SaleCondition、GarageArea、YearRemodAdd、ExterQual、BsmtFullBath、1stFlrSF、TotalBsmtSF、BsmtUnfSF、CentralAir、Neighborhood、GarageCars

    4.3 相关性

      首先进行对数值型的属性进行相关系数分析,期待发现它们之间的相关性。



    图6

      这个热图是快速浏览特征与价格关系的最好方法。(颜色越深,对应的像个特征的相关性越大)
      有两个红色的方块引起了我的注意。第一个是“TotalBsmtSF”和“1stFlrSF”变量,第二个是“GarageX”变量。这两种情况都显示了这些变量之间的相关性有多大。实际上,这种相关性是如此强烈,以至于它可以表明多线性的情况。如果我们考虑这些变量,我们可以得出结论,它们给出的信息几乎是相同的,所以多细胞性确实发生了。热图很好地发现了这种情况,在特征选择的主导问题中,像我们这样的问题,它们是必不可少的工具。
      另一件引起我注意的事情是“SalePrice”的相关性。我们可以看到我们著名的“GrLivArea”,“TotalBsmtSF”,以及“OverallQual”与其具有很大相关性。但我们也可以看到许多其他的变量的颜色也很深,这些变量应该被考虑进去。这就是我们接下来要做的。
      现在有上面热点图选择与SalePrice 相关性最大的9个特征,进一步分析它们的相关性。



    图7

      这几个属性之间的信息是否互相包含?或者是,它们之间是否存在线性性?若存在,则可知只需要选取某些属性,就可以代表所有属性,而不必讲所有属性都考虑。



    图8

      从图中可以看出,确实有些属性之间信息重叠,如GrLivArea 和OverallQual之间就存在正相关性,还有GrLivArea和TotalBsmtSF之间也存在正相关性,OverallQual和TotalBsmtSF存在较弱的正相关性。定性分析可知,地下室面积TotalBsmtSF与居住面积当然有关系,除去没有地下室的极少数房子,其它房子地下室面积大,伴随着房子面积大,反过来也成立。

      进一步采用皮尔逊相关分析法对所有属性和房价进行分析:



    图9

      可以清楚地看出与房价高度相关的属性有:
    OverallQual、Foundation、Heating、Electrical、SaleType、2ndFlrSF、SaleCondition、GarageArea、YearRemodAdd、YearBuilt、ExterQual、BsmtFullBath、1stFlrSF、TotalBsmtSF、BsmtUnfSF、CentralAir、Neighborhood、GarageCars、GrLivArea

    4.5 特征选取

      根据以上讨论,去掉部分互相相关性强的属性,选择作为房价分析的特征有:
    OverallQual、Foundation、Heating、Electrical、SaleType、2ndFlrSF、SaleCondition、GarageArea、YearRemodAdd、YearBuilt、ExterQual、BsmtFullBath、1stFlrSF、TotalBsmtSF、BsmtUnfSF、CentralAir、Neighborhood、GarageCars、

    五、回归前的准备

    5.1 特征向量化

      首先采用DictVectorizer进行特征向量化,目的是为了数据归一化(使特征数据方差为1,均值为0)。

    5.2 测试集预处理

      前面的数据预处理只是对训练集进行,对于测试集,其数据缺失情况如下:



    图10

      对于选取的属性进行数据预处理,使用均值或众数进行填充缺失值,步骤和训练集的一样。

    六、回归

    6.1梯度提升回归

      现在训练集的选取的属性和标签准备就位,测试集的选取的属性也预处理完毕,可以进行测试集的回归预测了。
      为了准确地利用训练集对测试集进行回归,在此我们利用了梯度提升回归即 Gradient Boosting Regression这个方法。
      梯度提升回归(Gradient boosting regression,GBR)是一种集成模型,它是一个集成学习算法是一种从它的错误中进行学习的技术。它本质上就是集思广益,集成一堆较差的学习算法进行学习。GBR与一般集成算法的区别是GBR在迭代的时候选择梯度下降的方向来保证最后的结果最好,即是让损失函数在其梯度方向上下降。

    6.2 提交尝试

      再对输出结果转换为提交要求的格式:

      评分标准是均方根误差(RMSE),即是:



    提交结果为:0.14922
    排名:2497/4989 (50%)



    图11

    6.3 改进再提交

      改进的想法由房价的分布产生,房价分布图为:



    图12

      根据前面讨论可知,在数据中房价主要集中在区间[100000,300000]中,而有关小于100000,和大于300000的房价是偏向异常数据,在进一步考虑时,应该适当合理区分这些数据。
      所以,在此将数据按照房价的大小分为两部分。由于测试集中是没有房价的,在这里想到了GrLivArea属性与房价高度正相关,而且在前面讨论中由于属性间信息重叠,不考虑GrLivArea作为分析房价的特征。
      一个很自然的想法是,既然GrLivArea与房价高度正相关,就以GrLivArea作为分隔的属性,将数据分为两部分。经分析GrLivArea的取值,以GrLivArea中值大于等于2500的分为一类,小于2500的分为一类。
      现在有4部分数据集:
    (1)训练集中GrLivArea大于等于2500的数据集;
    (2)训练集中GrLivArea小于2500的数据集;
    (3)测试集中GrLivArea大于等于2500的数据集;
    (4)测试集中GrLivArea小于2500的数据集;

      进行再次回归:
      利用上面(1)中数据对(3)进行回归。利用(2)中数据对(4)进行回归。
      再次提交得分为:0.14438
      排名:2250/4989 (46%)



    图13

    七、总结与展望

    (1)房价预测这个题目看似简单,实质上很有难度,主要是属性很多,而且缺失值也很多,数据预处理有难度。
    (2)本文进行数据预处理考虑还简单,可以继续考虑属性间的线性关系程度,以及属性间合并,或属性分拆等。
    (3)对于结果,我们还是满意的,经过一番尝试后,排名为45%。若要继续提升,一个方向是将数据集继续分类,分为三类或更多。

    八、参考文献

    [1]周志华.机器学习[M].北京:清华大学出版社,2016.
    [2]Peter Harrington.机器学习实战[M].北京:人民邮电出版社,2013.
    [3]韩家炜等.数据挖掘概念与技术[M].北京:机械工业出版社,2012.
    [4] House Prices: Advanced Regression Techniques,
    https://blog.csdn.net/ns2250225/article/details/72626155
    [5] Kaggle房价预测:数据预处理——练习,
    https://blog.csdn.net/qilixuening/article/details/75153131

    展开全文
  • 本资源是基于python实现的Boston Housing 数据集房价预测回归问题,调用了sklearn中5种回归算法对房价进行预测。
  • 机器学习实战:房价预测问题

    热门讨论 2020-09-10 21:32:29
    文章目录机器学习简介小例简单定义机器学习的类别房屋预测问题实战 机器学习简介 小例 先来简单举个例子吧!假如一家公司1月的利润为50万,然后每月增长5%,问其9月利润是多少。按照传统算法,我们知道了该公司1月的...

    机器学习简介

    小例

    先来简单举个例子吧!假如一家公司1月的利润为50万,然后每月增长5%,问其9月利润是多少。按照传统算法,我们知道了该公司1月的利润,知道了月增长率,就可以根据公式计算出相应的结果,而机器学习与传统算法不同的是机器学习是把月份、利润这些数据给到计算机,然后由计算机自动去求解一个函数关系进而求得结果。

    传统算法:
    1月利润+公式→计算机→结果

    机器学习:
    前几个月的月份+每月对应的利润→计算机→F(x)(计算机求得的函数关系)→结果

    简单定义

    然后来看看机器学习的一个简单定义吧~

    机器学习是一种实现人工智能的方法
    从数据中寻找规律、建立关系,然后根据建立的关系去解决问题
    从数据中学习从而实现自我优化与升级

    本文就不做过多介绍了,想深入了解的小伙伴可以去看看其他博主的博客哈。

    机器学习的类别

    1.监督学习:在已有的数据集中,训练数据包括正确结果,知道输入数据与输出结果的关系,并可以根据这种关系建立一个关系模型,在获得新数据后,就可以根据这种关系输出对应结果。

    2.无监督学习:训练数据不包括正确结果,让计算机自己去数据中寻找规律。

    3.半监督学习:训练数据包含少量结果,可以理解为介于监督学习和无监督学习之间。

    4.强化学习:根据每次结果收获的奖惩进行学习,实现优化。就比如让机器人去做一件事,做得好就加5分,做的差就减5分,然后按照第一种方式做事获得的分比第二种方式高,那么机器人就知道第一种方式更好了。按照这种奖惩方式,程序就可以逐步寻找获得高分的方法了。

    房屋预测问题实战

    基于usa_housing_price.csv数据,以人均收入、房屋年龄、房间数量、区域人口、房屋面积作为输入变量,来预测房屋价格。

    好了话不多说,上代码!

    这里的csv文件是提前下载好的

    #加载数据
    import pandas as pd
    import numpy as np
    data = pd.read_csv('usa_housing_price.csv')
    data.head() #预览数据。数据很多,预览数据只是预览前五项。
    

    预览结果:
    在这里插入图片描述
    再来看一下5个输入变量对应的散点图

    %matplotlib inline
    from matplotlib import pyplot as plt #导入相关库
    fig = plt.figure(figsize=(15,12)) #这里是定义画布大小
    fig1 =plt.subplot(231) #231是指两行三列的第一个图,下面的232是指两行三列的第二个图,依次类推
    plt.scatter(data.loc[:,'Avg. Area Income'],data.loc[:,'Price']) #获取数据,画出一个散点图
    plt.title('Price VS Income') #散点图的名称
    
    fig2 =plt.subplot(232)
    plt.scatter(data.loc[:,'Avg. Area House Age'],data.loc[:,'Price'])
    plt.title('Price VS House Age')
    
    fig3 =plt.subplot(233)
    plt.scatter(data.loc[:,'Avg. Area Number of Rooms'],data.loc[:,'Price'])
    plt.title('Price VS Number of Rooms')
    
    fig4 =plt.subplot(234)
    plt.scatter(data.loc[:,'Area Population'],data.loc[:,'Price'])
    plt.title('Price VS Area Population')
    
    fig5 =plt.subplot(235)
    plt.scatter(data.loc[:,'size'],data.loc[:,'Price'])
    plt.title('Price VS size')
    plt.show() #展示散点图
    

    在这里插入图片描述
    注意左上角的1e6是代表10的6次方,即2.5所代表值是2500000。

    #定义输入变量X_multi
    X_multi = data.drop(['Price'],axis=1) #去掉price所在列,因为有5个输入变量,输出结果只有1个,所以去掉price
    y = data.loc[:,'Price']
    X_multi 
    

    预览
    在这里插入图片描述
    可以看到这些数据是5000行5列的

    from sklearn.linear_model import LinearRegression #导入相关库 
    LR_multi = LinearRegression()#建立模型
    LR_multi.fit(X_multi,y) #训练模型
    

    这里模型已经训练好了:
    在这里插入图片描述

    #模型预测
    y_predict_multi = LR_multi.predict(X_multi)
    print(y_predict_multi)
    

    预测结果:
    在这里插入图片描述

    #模型评估
    from sklearn.metrics import mean_squared_error,r2_score
    mean_squared_error_multi = mean_squared_error(y,y_predict_multi)
    r2_score_multi = r2_score(y,y_predict_multi)
    print(mean_squared_error_multi,r2_score_multi)
    

    评估结果:
    在这里插入图片描述
    r2越接近1越好,这里达到0.91,模型还算不错

    #图形评估
    fig6 = plt.figure(figsize=(9,6))
    plt.scatter(y,y_predict_multi)
    

    在这里插入图片描述
    这里y值和y的预测值接近一条45度的直线,可以看出差别不大

    X_test = [66000,3,6,20000,150]
    X_test = np.array(X_test).reshape(1,-1) #将输入数据转化为数组
    print(X_test)
    
    y_test_predict = LR_multi.predict(X_test)
    print(y_test_predict)
    

    在这里插入图片描述

    自己输入一组数据,可以看到预测结果为114万多一点

    房价文件已补

    链接
    提取码:wnkc

    以上内容是博主通过学习Flare Zhao老师课程后的一个学习笔记,然后博主也是刚刚学习机器学习不久,有诸多不足的地方还请大家批评指正! thanks~

    展开全文
  • 房价预测

    2019-08-12 21:31:15
    显然,目的肯定是根据现有的数据,来对房价进行预测了,本数据变量较多,这里不再一一叙述,官网下载的数据又对变量进行描述。 首先导入基本的库 1 import numpy as np 2 import pandas as pd 接下来导入...
  • [实践]房价预测

    千次阅读 2017-12-01 00:33:22
    回归学习器房价预测实践
  • 房价预测模型

    千次阅读 2019-06-17 09:11:59
    房价预测模型的介绍 使用TensorFlow训练模型的工作流
  • kaggle_房价预测

    万次阅读 多人点赞 2018-02-23 11:00:01
    本文是博主基于之前练手Kaggle上泰坦尼克的入门分析而做的个人总结此案例是读者经过研究多个Kaggle上大神的kernel经验,加上个人的理解,再加入百分之一的运气得到 的结果此案例的亮点在于特征工程部分,对于变量的...
  • 线性回归预测房价

    千次阅读 2019-10-31 09:34:36
    给定数据集dataSet,每一行代表一组数据记录,每组数据记录中,第一个值为房屋面积(单位:平方英尺),第二个值为房屋中的房间数,第三个值为房价(单位:千美元),试用梯度下降法,构造损失函数,在函数gradient...
  • 波斯顿房价预测模型 残差平方和找到最好的拟合直线 RSS train_data,test_data = boston.random_split(.8,seed = 0) 内置函数linear创建一个线性回归模型(用一种特定的算法牛顿迭代法)graphlab create会自动的...
  • 预测房价:回归问题

    2020-08-21 00:15:43
    简介 本例出自《Python 深度学习》,自己做了一个简单的总结归纳。 ... 代码 加载数据集 注意:第一次运行时会下载数据集,速度较慢,请耐心等候。 from keras.datasets import boston_housing ...(train_data, train_...
  • kaggle实战之房价预测(一)

    万次阅读 2018-02-04 21:27:38
    一、kaggle简介 kaggle主要为开发商和数据科学家提供举办机器学习竞赛、托管数据库、编写和分享代码的平台,kaggle已经吸引了80万名数据科学家的关注。...二、房价预测 项目地址https://www.kaggle.com/c/house-pr
  • ML之回归预测:利用13种机器学习算法对Boston(波士顿房价)数据集【13+1,506】进行回归预测(房价预测)+预测新数据得分 导读 本文章基于前边的一篇文章,对13种机器学习的回归模型性能比较以后,然后利用各个模型对...
  • ML之xgboost:利用xgboost算法对Boston(波士顿房价)数据集【特征列分段→独热编码】进行回归预测(房价预测)+预测新数据得分 导读 对Boston(波士顿房价)数据集进行特征工程,分别使用特征列分段技术、独热编码技术...
  • 采用线性模型实现房价预测; 案例参照视频课程https://edu.csdn.net/course/detail/7389实现; 代码下载: 链接:https://pan.baidu.com/s/1W9FmC61NK908gm4A75xJQA 提取码:2gm7 数据下载: 链接:...
  • 自行编写线性回归对房价进行预测

    千次阅读 2017-10-11 15:35:55
    本次测试是对一个房屋售价的数据集进行探索,并找出与售价之间有相关性的特征值建立回归模型,来通过此特征值来预测房价。  下面,开始导入数据集: import pandas as pd df = pd.read_csv("house_data.csv") # ...
  • 一、导入库和数据 from sklearn.datasets import load_boston import matplotlib.pyplot as plt dataset = load_boston() ...y_data = dataset.target # 导入目标值(房价) name_data = dataset.featu...
  • Tensorflow多变量线性回归(房价预测) 本文章为本人自己写的jupyter笔记,图片显示有一点问题(下面的每个图片都变成同一张图片),所以仅供预览。 需要下载ipynb文件的朋友可以关注我并找到我上传的资源。 ...
  • 志强预测中国房价到2020年以后才可能会下降 焦点房地产网 house.focus.cn 2007年09月05日07:17 千龙网
1 2 3 4 5 ... 20
收藏数 13,576
精华内容 5,430
关键字:

房价预测