intel oneAPI2023黑客松大赛赛道二建模方案介绍
本次和小伙伴报名了赛道二:淡水质量预测。这个赛题主要是给出24个特征变量(标签变量、类别变量、文本变量、数值变量等)共计5956842条数,标签1和标签0的比例约为3:7,本质是个二分类问题。
由于主办方没有给出测试集,所以要自己本地划分测试集做分析,我们主要按75:25的比例划分了训练集和测试集,并采用accuracy作为评估指标。参考主办方给出的相关代码文件GitHub - idz-cn/2023hackathon: 2023 Hackathon,主要使用modin、sklearex和xgboost三个工具。其中modin用于加速数据读取和数据加工,可无缝衔接原生pandas接口;sklearnex无缝优化skearn了的相关模型和算法,包括但不限于逻辑回归、朴素贝叶斯;xgboost主要是表格类分类题目的神兵利器。建模流程包括数据读取、数据预处理、模型训练与模型评估。
数据预处理代码
le_cat = 'Color, Source, Month'.split(', ')
for i in le_cat:
le = LabelEncoder()
data[i] = data[i].astype('str')
data[i] = le.fit_transform(data[i])
其他一些工作还包括没有提升的特征工程:对一些特征重要度比较高的特征进行减法和除法运算,衍生新的特征,但没有实际提升;分Source和Month进行建模也没有提升;对类别变量进行频率计算也没有提升。
模型训练与推理代码
# XGB模型十折交叉平权融合预测
def train_and_predict(train_data,train_label,test_data):
NFOLD = 10
random_state = 2021
KF = StratifiedKFold(n_splits=NFOLD, shuffle=True, random_state=random_state)
oof_xgb = np.zeros(len(train))
predictions_xgb = np.zeros(len(test))
params = {'booster': 'gbtree',
'objective': 'binary:logistic',
'eval_metric': 'error',
'max_depth': 6,
'subsample': 0.8,
'colsample_bytree': 0.8,
'colsample_bylevel': 0.8,
'colsample_bynode':0.8,
'seed': random_state,
'nthread': 4,
'eta':0.05
}
for fold_, (trn_idx, val_idx) in enumerate(KF.split(train_data,train_label)):
print('----------------------- fold {} -----------------------'.format(str(fold_+1)))
train_matrix = xgboost.DMatrix(train_data.iloc[trn_idx], label = train_label.iloc[trn_idx])
valid_matrix = xgboost.DMatrix(train_data.iloc[val_idx], label = train_label.iloc[val_idx])
test_matrix = xgboost.DMatrix(test_data)
valid_oof = xgboost.DMatrix(train_data.iloc[val_idx])
watchlist = [(train_matrix, 'train'),(valid_matrix, 'eval')]
model = xgboost.train(params, train_matrix, num_boost_round = 50000, evals = watchlist, verbose_eval = 200, early_stopping_rounds = 200)
predictions_xgb[:] += (model.predict(test_matrix , ntree_limit = model.best_ntree_limit)/ NFOLD)
oof_xgb[val_idx] = model.predict(valid_oof , ntree_limit = model.best_ntree_limit)
return predictions_xgb , oof_xgb
pred_xgb , oof_xgb = train_and_predict(train,train_label,test)
在建模分析中,十折调参的lightgbm和十折xgboost的平权集成融合 > 十折xgboost > 一折xgboost。
整体建模方案比较简单。主要收获是了解到英特尔OneAPI的相关机器学习工具包,面对大数据量场景可以有效加速数据读取和数据处理,在本机测试中modin【Ray】确实能优化pandas的数据读取。对于sklearn的优化,下面两行就能加速优化,非常方便(需要放在sklearn包导入前)。
from sklearnex import patch_sklearn
patch_sklearn()