学完机器学习的基本算法之后,想找一个实践的机会。于是就瞄准了kaggle比赛,先从最基本的房价预测开始,这是一个比较简单的比赛。
训练集数据是1460x81的数据,其中1460是数据条数,80列是有关房价的特征,1列是房价。
测试集数据是1459x80的数据,其中1459是数据条数,80列是有关房价的特征,没有房价的标签
从数据集的分布来看,标签是一个连续值,这是一个回归的问题。针对回归问题,常见算法有线性回归,Lasso回归,树算法(Xgboost),SVR等等。
首先我们来加载数据集
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 导入数据集
train = pd.read_csv('data/train.csv')
test = pd.read_csv('data/test.csv')
首先,利用 train.head()来查看数据
利用,get_dtype_counts()方法查看各个特征的数据类型,可以看到数字类型的特征一共是38个,object类型的特征为43个。不同类型的特征处理的方式是不一样的。数字类型的特征处理缺失值的时候,要用均值,众数或者其他函数关系来填充空值。obejct类型一般用None填充。
接下来用info(),可以看到各个特征的类型,数目等信息,由于数目太大没有放全,用describe()函数查看数值类型的均值和方差等信息。
用mean()函数查看均值,median()查看中位数等等。
由于机器学习的任务是不断迭代的,所以这里先实现一个最基本的模型。对于缺失值直接暴力填充。
# 将测试集和训练集连接
full = pd.concat([train,test],ignore_index=True)
# 查看缺失值,并将缺失值的特征由大到小排列。
tmp = full.isnull().sum()
tmp[tmp>0].sort_values(ascending=False)
首先填充数字类型的特征,直接按照均值填充
# 对数值类型的填充
full.fillna(full.mean(),inplace=True)
# 查看剩余的缺失值
tmp = train.isnull().sum()
tmp[tmp>0].sort_values(ascending=False)
接下来填充非数值类的值,直接用None填充。
# 对字符类型进行填充
full.fillna('None',inplace=True)
tmp = full.isnull().sum()
tmp[tmp>0].sort_values(ascending=False)
到目前为止,我们已经暴力的填充完所有的数据了,下面需要对数据集进行一些处理,然后跑模型。
# 去掉Id,SalePrice列
full = full.drop(['Id','SalePrice'],axis=1)
# 变成one-hot编码
full=pd.get_dummies(full).reset_index(drop=True)
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import RobustScaler,StandardScaler
# 标准化处理
std = StandardScaler()
full = std.fit_transform(full)
# 引入LinearRegression()模型
model = LinearRegression()
# 将训练集和测试集分开,
n_train = train.shape[0]#行数
#划分数据集
X = full[:n_train]##相当于取出X
y = train.SalePrice#取出训练集的标签
test_x = full[n_train:]#1461行取到最后
# 训练模型
model.fit(X,y)
# 预测
saleprice = model.predict(test_x)
# 产生要提交的csv文件
result=pd.DataFrame({'Id':test.Id, 'SalePrice':saleprice})
result.to_csv("submission1.csv",index=False)
果然,第一个模型表现的很弱鸡,最暴力的填充,最简单的模型,最差的分数。没关系,我们慢慢改进,
接下来我尝试了xgboost,一直听说他很屌,究竟有多屌呢。在上面的特征工程不变的情况下,直接调用xgboost函数,排名飞一样的上升。
import xgboost as xgb
xg_reg=xgb.XGBRegressor(objective='reg:linear',colsample_bytree=0.4,learning_rate=0.01,max_depth=8,alpha=10,n_estimators=600,subsample=0.7)
xg_reg.fit(X,y)
pred=xg_reg.predict(test_x)
result=pd.DataFrame({'Id':test.Id, 'SalePrice':pred})
result.to_csv("submission1.csv",index=False)
在暴力填充特征的情况下,就上面的几行代码,请看结果,上升了2294排名。下一篇博客,我们会对特征值进行优化,看看结果如何。