第一步
我们先导入使用的模块
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- )/ 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})
涉及到别的模型,将会在后续渐渐介绍