前言
开始接触机器学习,一个必不可少的一个工具就是xgboost,这里使用xgboost中最简单的功能完成一个kaggle竞赛:Boston Housing,而完成的代码行数只有不到40行,足以看出xgboost的强大!
赛题
根据给出的数据属性进行对应房价的预测。
赛题的地址:https://www.kaggle.com/c/boston-housing#description
数据
作为入门,这里没有考虑更多一步的优化,只对数据进行简单的认识一下(打开train.csv):
- 训练集包括了15列,第一列是ID,最后一列是medv(要预测的数据),因此在训练的时候将这两个属性去除。
- 训练集中70%的数据取出用于训练,30%的数据取出用于评价。
打开测试集(test.csv)
- 缺少了预测项medv.
代码实现
代码非常简单,但还是需要对pandas,numpy库有些了解,对应的方法可以直接查询文档。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/9/10 22:51
# @Author : likewind
# @mail : likewind1993@163.com
# @File : BostonHousing.py
import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
#load dataset
dataset_folder = r'E:/kaggle_race/BostonHousing/'
dataset_train = dataset_folder + 'train.csv'
dataset_test = dataset_folder + 'test.csv'
data_train = pd.read_csv(dataset_train)
data_test = pd.read_csv(dataset_test)
#drop irrelevant properties
X = data_train.drop(['ID', 'medv'], axis=1)
#medv is train label
y = data_train.medv
#split train_dataset into train_data, train_label, test_data, test_label
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=123)
#use regressor to predict medv.
xg_reg = xgb.XGBRegressor(objective='reg:linear', colsample_bytree=0.3, learning_rate=0.1, max_depth=10,
alpha = 10, n_estimators=500, reg_lambda=2)
#training the regressor
xg_reg.fit(X_train, y_train)
#use the trained regressor to predict test_data
preds = xg_reg.predict(X_test)
#calc rmse
rmse = np.sqrt(mean_squared_error(y_test, preds))
print("Trained RMSE: %f " % rmse)
#use the trained regressor to predict test dataset.
x_test = data_test.drop(['ID'], axis=1)
predictions = xg_reg.predict(x_test)
ID = (data_test.ID).astype(int)
result = np.c_[ID, predictions]
#output results
np.savetxt(dataset_folder + 'xgb_submission.csv', result, fmt="%d,%.4f" ,header='ID,medv', delimiter=',', comments='')
效果
提交到kaggle后,得分3.84706
大概在19名左右。
在完成竞赛的过程中,我们并没有考虑每个特征对结果的影响,因此在接下来的过程中,优化的空间会很大!