[比赛]二手车交易价格预测-模型融合

一、模型的结果层面的融合

回归任务中的加权融合
根据各个模型的最终预测表现分配不同的权重以改变其对最终结果影响的大小。对于正确率低的模型给予更低的权重,而正确率更高的模型给予更高的权重。
分类任务中的Voting
基本思想是选择所有机器学习算法当中输出最多的那个类。

二、其他融合

Boosting
Boosting是一种将各种弱分类器串联起来的集成学习方式,每一个分类器的训练都依赖于前一个分类器的结果,顺序运行的方式导致了运行速度慢。和所有融合方式一样,它不会考虑各个弱分类器模型本身结构为何,而是对训练数据(样本集)和连接方式进行操纵以获得更小的误差。但是为了将最终的强分类器的误差均衡,之前所选取的分类器一般都是相对比较弱的分类器,因为一旦某个分类器较强将使得后续结果受到影响太大。所以多用于集成学习而非模型融合(将多个已经有较好效果的模型融合成更好的模型)。

Bagging
与Boosting方法中各分类器之间的相互依赖和串行运行不同,Bagging方法中基学习器之间不存在强依赖关系,且同时生成并行运行。

其基本思路为:
在样本集中进行K轮有放回的抽样,每次抽取n个样本,得到K个训练集;
分别用K个训练集训练得到K个模型。
对得到的K个模型预测结果用投票或平均的方式进行融合。


给出选出参数之后的融合代码

from mlxtend.regressor import StackingCVRegressor
# 使用lgb和xgb那两个模型
def bulid_modl_xgb(x_train, y_train):
    model = XGBRegressor(n_estimators=400, learning_rate=0.05, gamma=0, subsample=0.8, colsample_bytree=0.9, max_depth=7, objective='reg:squarederror')
    model.fit(x_train, y_train)
    return model

def bulid_modl_lgb(x_train, y_train):
    model = LGBMRegressor(n_estimators=1000, leaves=200, best_depth=55, learning_rate=0.05, objective='regression_l1')
    model.fit(x_train, y_train)
    return model


def build_model_stackReg(x_train, y_train, xgb, lgb, lr):
    model = StackingCVRegressor(regressors=(xgb, lgb), meta_regressor=lr)
    model.fit(np.array(x_train), np.array(y_train))
    return model
# LGB
model_lgb = bulid_modl_lgb(X, Y_ln)
val_lgb = model_lgb.predict(XTest)
MAE_lgb = mean_absolute_error(Ytrue, np.expm1(val_lgb))
print(MAE_lgb)   # 576.9558364837794

# XGB
model_xgb = bulid_modl_xgb(X,Y_ln)
val_xgb = model_xgb.predict(XTest)
MAE_xgb = mean_absolute_error(Ytrue, np.expm1(val_xgb))
print(MAE_xgb)   # 616.7312224557686

# Stacking
xgb = XGBRegressor(n_estimators=400, learning_rate=0.05, gamma=0, subsample=0.8, colsample_bytree=0.9, max_depth=7, objective='reg:squarederror')
lgb = LGBMRegressor(n_estimators=1000, leaves=200, best_depth=55, learning_rate=0.05, objective='regression_l1')
lr = LinearRegression()
model_stack = build_model_stackReg(X, Y_ln, xgb, lgb, lr)
val_stack = model_stack.predict(np.array(XTest))
MAE_stack = mean_absolute_error(Ytrue, np.expm1(val_stack))
print(MAE_stack)    # 581.2588003507759

未完待续

你可能感兴趣的:(比赛)