Kaggle入门题目(House Prices)完整刷题流程

前言

  • 最近刚参加了泰迪杯比赛(没错,又参加了一次,因为对去年的成绩不是很满意),重新拾起了数据挖掘的一些知识,就随便拿了道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竞赛的基本流程,笔者能力有限,暂未接触到正式题目。
  • 如有大佬对文章或算法有改进意见,感谢提出。
  • 创作不易,转载请注明出处,感谢。
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值