kaggle房价预测

比赛链接

第一步

        我们先导入使用的模块

import numpy as np
import pandas as pd

第二步

        载入所使用的数据

test_data = pd.read_csv("./data/house_price/test.csv", index_col=0)
train_data = pd.read_csv("./data/house_price/train.csv", index_col=0)

        数据在比赛的网站上都有的,我们将数据从哪csv文件中读取出来,其中index_col参数的含义是以第0列作为索引,在本数据中也就是以ID作为索引。

我们可以展示一小部分的数据,让我们更加方便的对数据进行预处理。

       

test_data.head()
train_data.head()

  测试数据如下:

  训练数据如下:

 我们将数据绘制成直方图的形式,来观察一下数据的分布情况:

%matplotlib inline
prices = pd.DataFrame({"price" : train_data["SalePrice"], "log(price + 1)" : np.log1p(train_data["SalePrice"])})

prices.hist()

        观察数据可知,如果我们使用原来的数据的话,数据分布的并不均匀,并不符合正太分布,出现右偏的情况,这时我们可以使用对数变换来确保数据符合正太分布,但是最后我们得出的结果要变回原来的数值。

        接下来我们要合并训练集和测试集,这样做的目的是统一操作某些不是数字特征的特征值,我在回归的时候需要拆分训练集和测试集。需要特别注意的是,在训练集中是有房子价格的特征的,也就是说训练集比测试集多一个特征,我们需要将这个特征暂时剔除出去。

y_train = np.log1p(trian_data.pop("SalePrice"))
all_data = pd.concat((train_data, test_data), axis=0)

         我们来观察一下所有数据的维度

all_data.shape

         一共有2919条数据,每条数据有79个特征。

        观察比赛中的数据描述可知,MSSubClass应该是一种字符,不应该是整数类型,它只是房子的类型,并不是级别,如果视为数字,将会为模型增加噪声。

         我们输出一下MSSubClass的数据类型

all_data['MSSubClass'].dtypes

        应该转为字符型的数据

all_data['MSSubClass'] = all_data['MSSubClass'].astype(str)

        观察一下MSSubClass的数据分布

all_data['MSSubClass'].value_counts()

 

                 像这种的分类数据,要进行特殊的处理,我采用了独热编码,在panads中有方法可以直接调用 get_dummies会将分类形式的数据转换为独热编码的形式。

all_dummy_date = pd.get_dummies(all_data)
all_dummy_data.head()

         接下来处理空值,先统一一下空值有多少

all_dummy_data.isnull.sum.sort_values(ascending=False).head()

         为了简单处理,我采用平均值来填补空值。

        

mean_cols = all_dummy_data.mean()
all_dummy_data = all_dummy_data.fillna(mean_cols)

        标准化数字特征的数据,对于回归分类器来说比较重要,最好把原数据给放在一个标准分布内。

        来查看一下那些是数字化特征

       

numeric_cols = all_data.columms[all_data.dtypes != 'object']
numeric_cols

         计算标准分布:(X- X{}')/ s, 让数据点更加平滑,更便于计算。

numeric_cols_means = all_dummy_data.loc[:, numeric_cols].mean()
numeric_cols_std = all_dummy_data.loc[:, numeric_cols].std()
all_dummy_data.loc[:, numeric_cols] = (all_dummy_data.loc[:, numeric_cols] - numeric_cols_means) / numeric_cols_std

              最后拆分数据集

       

dummy_train_data = all_dummy_data.loc[train_data.index]
dummy_test_data = all_dummy_data.loc[test_data.index]

第三步回归分析

        为了简单起见,并没有使用搜索法,而是简单的遍历,在验证方法中使用了交叉验证的方法。

       岭回归:

from sklearn.linear_model import Ridge
from sklearn.model_selection import cross_val_score

X_train = dummy_train_data.values
X_test = dummy_test_data.values

alphas = np.logspace(-3, 2, 50)
test_scores = []
for alpha in alphas:
    clf = Ridge(alpha)
    test_score = np.sqrt(-croos_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")

 第四步提交数据

        

y_final = np.expm1(ridge.predict(X_test))
submission_df = pd.DataFrame(data={'Id' : test_data.index, 'SalePrice' : y_final})

       涉及到别的模型,将会在后续渐渐介绍

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值