House Prices:第一次提交Top 11%

Kaggle上的第二个入门赛House Prices,这次没有直接复制教程,找了个半截的例子逐步完善,第一次提交居然拿到了11%

avatar_cover Alex Xiang
2024-09-12 387阅读

竞赛地址:House Prices - Advanced Regression Techniques

教程地址就不贴了,百度随便搜了一个,做了一半发现代码不全,比较坑人,正好可以深入了解一下,这么简单的例子自己应该可以独立完成吧?

其实过程很简单,总结一下就是下面几部分:

  • 了解分析数据,也就是EDA的过程,这个竞赛的数据有81个属性,看了很多入门的例子,重点都会在这个阶段,会详细介绍如何分析这些属性。
  • 补全空值
  • 生成训练和预测的输入数据
  • 选择模型进行预测
  • 保存结果,提交

下面做一些简单的说明,代码比较简单,具体可以参加notebook:House Prices: First commit got 11%

一开始查看一下输入文件,如果打算在本地运行,这里可以判断一下是否kangle的环境,然后设置一下文件名,在kangle的notebook,输入文件的路径是这样的:

/kaggle/input/house-prices-advanced-regression-techniques/sample_submission.csv
/kaggle/input/house-prices-advanced-regression-techniques/data_description.txt
/kaggle/input/house-prices-advanced-regression-techniques/train.csv
/kaggle/input/house-prices-advanced-regression-techniques/test.csv

然后读入文件:

file_train_in = '/kaggle/input/house-prices-advanced-regression-techniques/train.csv'
file_test_in = '/kaggle/input/house-prices-advanced-regression-techniques/test.csv'

train = pd.read_csv(file_train_in)
test = pd.read_csv(file_test_in)

train数据集有1460行,81列,notebook中后面有比较大的篇幅是分析这些数据,这里就略去了,放一张所有特征直方图汇总的截图,分析数据的时候直方图还是比较有用的:

接下来补全空值,对于数值类型和字符类型处理不同:

str=train.select_dtypes("object")
for column in str:
    train.fillna({column:train[column].mode()[0]}, inplace=True)
    test.fillna({column:train[column].mode()[0]}, inplace=True)

num=train.select_dtypes(["float64","int64"]).drop("SalePrice",axis=1)
for column in num:
    train.fillna({column:train[column].median()}, inplace=True)
    test.fillna({column:train[column].median()}, inplace=True)    

生成训练数据和特征

data=pd.get_dummies(train,columns=str.columns)
data_test=pd.get_dummies(test,columns=str.columns)
train_features = data.columns.difference(['SalePrice'])
test_features = data_test.columns.difference(['SalePrice'])
features = train_features.intersection(test_features)
target = 'SalePrice'

x = data[features]
y = data[target]
test_x = data_test[features]

categorical_features_indices = np.where(x.dtypes == 'object')[0]

训练和预测,用的是CatBoostRegressor模型,可以看到这一步挺简单的,直接用的单一模型,最后结果已经不错了。

model = CatBoostRegressor(verbose = False, loss_function='RMSE', cat_features=categorical_features_indices)
model.fit(x, y)
test_pred = model.predict(test_x)

保存和提交

test_id = test['Id']
submission = pd.DataFrame(test_id, columns = ['Id'])
submission['SalePrice'] = test_pred 
submission.head()
submission.to_csv("submission.csv", index = False, header = True)

排名成绩

Filter blog posts by tag kaggle