kaggle竞赛——房价预测(二)

文章介绍了在kaggle房价预测竞赛中,如何使用不同基本回归模型(如Lasso、ElasticNet、KernelRidge、GradientBoosting等)进行训练,并通过Stacking集成学习方法提升预测准确性。通过5折交叉验证和RMSE评价函数,比较了各模型的表现,最终选用Lasso作为第二层学习器的Stacking模型取得了最佳效果。

之前的工作我们完成了数据的读取、初步的分析、缺失值的处理、特征的变换和提取,接下啦我们将使用不同的基本回归模型先对数据集进行训练,然后再集成多种回归模型共同对房价进行综合预测并判断集成法的有效性。

1、建立模型

导入算法包

from sklearn.linear_model import ElasticNet,Lasso#弹性网络和lasso回归
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.kernel_ridge import KernelRidge#核岭回归
from sklearn.pipeline import make_pipeline
from sklearn.base import BaseEstimator, TransformerMixin, RegressorMixin, clone
from sklearn.model_selection import KFold, cross_val_score, train_test_split
from sklearn.metrics import mean_squared_error
import xgboost as xgb
import lightgbm as lgb
#%%
y_train = train.SalePrice.values
train = all_data[:train.shape[0]]
test = all_data[train.shape[0]:]

评价函数

先定义一个评价函数,我们采用5折交叉验证,为与比赛的评价标准一致,我们用RMSE来为每个模型打分。我们使用sklearn中的cross_val_score()函数,但是这个函数没有shuffle属性,我们添加一行代码,以便在交叉验证之前对数据集进行shuffle。shuffle=True表示对数据打乱,重新洗牌,这样就能设置随机种子,但是注意,对于时间序列数据,不能打乱

n_folds = 5
def rmsle_cv(model):
    kf = KFold(n_splits=5,shuffle=True,random_state=42).get_n_splits(train.values)
    print("kf={}".format(kf))
    rmse = np.sqrt(-cross_val_score(model,train.values,y_train,scoring='neg_mean_squared_error',cv=kf))
    return rmse

sklearn中的参数scoring下,均方误差作为评判 标准时,却是计算”负均方误差“(neg_mean_squared_error)。这是因为sklearn在计算模型评估指标的时候,会考 虑指标本身的性质,均方误差本身是一种误差,所以被sklearn划分为模型的一种损失(loss)。在sklearn当中,所有 的损失都使用负数表示,因此均方误差也被显示为负数了.

基本回归模型

基本模型

  • LASSO回归

lasso回归就是在传统的线性回归目标函数后面加上了一个L1范数,也称为L1正则项,这样就能使得不重要特征的系数压缩至0,从而实现较为准确的参数估计效果,但是该模型可能对异常值非常敏感,由于数据集中依然存在一定的离群点,可能会影响特征的平均值和方差,影响标准化结果。在此种情况下,使用中位数和四分位数间距进行缩放会更有效。所以我们sklearn中的RobustScaler对数据进行标准化处理
RobustScaler
传统的StandScaler是将该特征的每一个样本减去该列的均值,再除以该列的方差。但数据包含许多异常值是,使用均值和方差进行缩放可能并不是一个好的选择,在此种情况下,我们可以使用RobustScaler对中位数和四分位数间距进行缩放会更有效,结果更加具有鲁棒性
图片
IQR:四分位距,第三四分位数(0.75)与第一四分位数(0.25)之间的距离

from sklearn.preprocessing import RobustScaler

lasso = make_pipeline(
    RobustScaler(),
    Lasso(alpha=0.0005
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值