前言
- 最近刚参加了泰迪杯比赛(没错,又参加了一次,因为对去年的成绩不是很满意),重新拾起了数据挖掘的一些知识,就随便拿了道Kaggle上的入门题目练练手,很经典的题目——房价预测。感兴趣的读者可以学习下。
分析
题目分析
- 毕竟是经典的题目,所以,问题也很简单,原文是这样的:
如果让一个购房者描述一下他们梦想中的房子,他们可能不会从地下室天花板的高度或靠近东西方向的铁路开始。但这场游乐场竞赛的数据集证明,与卧室数量或白色尖桩篱笆相比,它对价格谈判的影响要大得多。
79个解释变量(几乎)描述了爱荷华州埃姆斯市住宅的每个方面,这个竞赛挑战你预测每个房子的最终价格。
- 很经典的回归问题,就是根据79个自变量去预测最终的房价。
数据集分析
- 作为入门题目,数据集更简单,甚至训练集测试集都已经分好了,另外两个,一个是数据描述,描述每一个字段的含义,一个数提交示例,表示提交的格式。
数据分析
- 训练数据一共有81列1460行,包含第一列的ID,最后一列的房价,以及中间的79个特征。
- 有很多缺失值以及字符串值,所以需要做缺失值处理,以及哑变量处理。
数据预处理
缺失值处理及哑变量处理
- 对于int类型及float类型的字段,我采用均值填充的方法填充缺失值。对于字符串类型的字段,采用“nan”字符串填充缺失值。
- 同时,对于字符串类型的字段,通过sklearn库的LabelEncoder进行哑变量处理。
- 代码如下
#数据预处理
from sklearn.preprocessing import LabelEncoder
#缺失值处理
#哑变量处理
def preprocessing(data):
for i in data.columns:
if data[i].dtype == "object":
data[i].fillna("nan",inplace=True)
data[i] = LabelEncoder().fit_transform(data[i])
else:
data[i].fillna(data[i].mean(),inplace=True)
return data
划分X,Y及训练集和测试集
- 将第二列到倒数第二列作为X,最后一列作为Y。
#划分X,Y
X = train_data.iloc[:,1:-1]
Y = train_data.iloc[:,-1]
- 划分训练集和测试集,20%作为测试集。
#划分训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size = 0.2,random_state=123)
模型选择与训练
- Sklearn中的回归模型有很多,当然,只要认真调参,每个回归模型,基本都能取得比较好的效果。由于本次只是简单练手,所以笔者并未认真调参,而是,一个一个试模型。最终选取的比较好的模型是集成学习的GBRT回归模型,并采用500棵决策树进行训练。
from sklearn import ensemble
model_gradient_boosting_regressor = ensemble.GradientBoostingRegressor(n_estimators=500)
model_gradient_boosting_regressor.fit(X_train,Y_train)
模型评价
- 模型回归分数在0.91以上,虽说不够高,但也比大多数其他模型强了。
def evaluation(model, method):
model.fit(X_train, Y_train)
score = model.score(X_test, Y_test)
result = model.predict(X_test)
plt.figure()
plt.plot(np.arange(len(result)), Y_test, "go-", label="True value")
plt.plot(np.arange(len(result)), result, "ro-", label="Predict value")
plt.title(f"method:{method}---score:{score}")
plt.legend(loc="best")
plt.show()
evaluation(model_gradient_boosting_regressor,"model_gradient_boosting_regressor")
对测试集进行预测并提交
- 首先读取测试集,并将测试集进行预处理。
data = pd.read_csv("test.csv")
#preprocessing方法实现见数据预处理部分
test_data = preprocessing(data)
test_data = test_data.iloc[:,1:]
- 将模型应用于测试集,然后提取ID和预测结果写入csv文件。
res = data.iloc[:,0]
res = pd.concat((pd.DataFrame(res),pd.DataFrame(model_gradient_boosting_regressor.predict(test_data))),axis=1)
res.rename(columns={"MSSubClass":"Id",0:"SalePrice"},inplace=True)
res.to_csv("result.csv",index=False)
- 提交结果,排名在前45%,不是很好。
结语
- 本文只简单做了一道入门题,只简单介绍了Kaggle竞赛的基本流程,笔者能力有限,暂未接触到正式题目。
- 如有大佬对文章或算法有改进意见,感谢提出。
- 创作不易,转载请注明出处,感谢。