python随机森林房价预测

Kaggle房价预测

作为Kaggle竞赛中的经典入门题目,我主要在kernels中学习其他人分析和处理数据的流程,首先是通过各类plt的图表,分析数据特征和房价之间的相关性

载入数据集

    df_train = pd.read_csv('./input/train.csv')
    df_test = pd.read_csv('./input/test.csv')

房价整体分布概率直方图

    print(df_train['SalePrice'].describe())
    sns.distplot(df_train['SalePrice'])
    plt.show()


根据直方图可以看出整体房价大致的区间分布

总平方英尺,散点图

    var = 'GrLivArea'
    # axis: 需要合并链接的轴,0是行,1是列
    data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
    data.plot.scatter(x=var, y='SalePrice', ylim=(0, 800000))
    plt.show()


在常规印象中,面积越大房价越贵,根据散点图可以看出基本符合规律,除了少数离群点。

建造年份,箱线图

    var = 'YearBuilt'
    data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
    f, ag = plt.subplots(figsize=(16, 8))
    fig = sns.boxplot(x=var, y="SalePrice", data=data)
    fig.axis(ymin=0, ymax=800000)
    plt.xticks(rotation=90)
    plt.show()


一般规律是房屋的建造年份越新,房价越高。根据箱线图的走势,基本符合预期。但也有部分年份比较旧的房屋房价特别高,推测可能是历史老屋,或者古董别墅之类的。

相关系数,热点图

    corrmat = df_train.corr()
    f, ax = plt.subplots(figsize=(12, 9))
    sns.heatmap(corrmat, vmax=.8, square=True)
    plt.show()


在前面单独分析了几个属性后,我们现在查看train训练集中所有属性相关系数的热点图。

相关系数矩阵,获取相关性最高的前10个特征

    k = 10
    cols = corrmat.nlargest(k, 'SalePrice')['SalePrice'].index
    cm = np.corrcoef(df_train[cols].values.T)
    sns.set(font_scale=1.25)
    hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={'size': 10},
                     yticklabels=cols.values, xticklabels=cols.values)
    plt.show()


在热点图大致了解所有属性的相关性后,接着按照相关系数排序,取前10个特征输出相关矩阵

特征筛选

根据Kaggle官方提供的字段说明里,GarageCars和GarageArea描述的是车库容纳车辆数量和车库面积,描述的基本是同一件事情,而且相关系数分别是0.64和0.62,因此只取其中的GrLivArea

离群点检测

观察GrLivArea的散点图,最右侧2个点明显不符,因此在训练数据集中删除掉

    df_train.sort_values(by='GrLivArea', ascending=False)[:2]
    print("drop 2 outliers")
    print(df_train.sort_values(by='GrLivArea', ascending=False)[:2])

    df_train = df_train.drop(df_train[(df_train['GrLivArea'] > 4000) & (df_train['SalePrice'] < 300000)].index)

随机森林,建模,预测

    # 根据相关度选择特征
    predictor_cols = ['OverallQual', 'GrLivArea', 'GarageCars', 'TotalBsmtSF', 'TotRmsAbvGrd', 'YearBuilt']
    train_X = df_train[predictor_cols]

    my_model = RandomForestRegressor()
    my_model.fit(train_X, train_y)

    # GarageCars,TotalBsmtSF存在空值,
    df_test['GarageCars'] = df_test['GarageCars'].fillna(0)
    df_test['TotalBsmtSF'] = df_test['TotalBsmtSF'].fillna(0)

    test_X = df_test[predictor_cols]

    predicted_prices = my_model.predict(test_X)
    # 取整
    print(predicted_prices)

    my_submission = pd.DataFrame({'Id': df_test.Id, 'SalePrice': predicted_prices})
    my_submission.to_csv('./submission.csv', index=False)

完整代码,数据集下载

githup源码

猜你喜欢

转载自www.cnblogs.com/wanli002/p/10886872.html