K折交叉验证K-CV与StratifiedKFold

1. K折交叉验证

K-fold Cross Validation,记为K-CV

KFold 将所有的样例划分为 k 个组,称为折叠 (fold) ,每组数据都具有相同的大小。每一次分割会将其中的 K-1 组作为训练数据,剩下的一组用作测试数据,一共会分割K次.

比如训练样本有4000个,假设K=4. 那么模型会训练4次,生成4个模型结果。每次训练的数据是3000(即3个4000/4,3=K-1),验证数据是1000(1个4000/4))。如果是lightGBM,那么可以将这4个模型的结果取平均,即为最终结果。

K一般大于等于2,实际操作时一般从3开始取,只有在原始数据集合数据量小的时候才会尝试取2。

K-CV可以有效的避免过拟合与欠拟合的发生,最后得到的结果也比较具有说服性

2.StratifiedKFold

StratifiedKFold: 是KFold()的变种,采用分层分组的形式(有点类似分层抽样), 使每个分组中各类别的比例 同整体数据中各类别的比例尽可能的相同。(它相对于KFold()方法更完善)

oof = np.zeros(train_df.shape[0])
val_aucs = []
test_df[‘prob’] = 0

seeds = [1023]#
for seed in seeds:
skf = StratifiedKFold(n_splits=4, shuffle=True, random_state=seed)
for i, (trn_idx, val_idx) in enumerate(skf.split(train_df, train_df[‘label’])):
print(’--------------------- {} fold ---------------------’.format(i))
print(‘len-trn_idx:’,len(trn_idx))
print(‘len-val_idx:’,len(val_idx))
t = time.time()
trn_x, trn_y = train_df[cols].iloc[trn_idx].reset_index(drop=True), train_df[‘label’].values[trn_idx]
val_x, val_y = train_df[cols].iloc[val_idx].reset_index(drop=True), train_df[‘label’].values[val_idx]

tr_data = lgb.Dataset(trn_x,label=trn_y)
va_data = lgb.Dataset(val_x, label=val_y)
model = lgb.train(
params,
tr_data,
num_boost_round=1000,
valid_sets=[tr_data, va_data],
early_stopping_rounds=50,
feval=tpr_weight,
#feature_name=features,
#categorical_feature=categorical_columns,
verbose_eval=50
)
oof[val_idx] = model.predict(val_x)
test_df[‘prob’] += model.predict(test_df[cols]) / skf.n_splits / len(seeds)
cv_auc = roc_auc_score(train_df[‘label’], oof)
val_aucs.append(cv_auc)
print(’\ncv_auc: ', cv_auc)

print(val_aucs, np.mean(val_aucs))

你可能感兴趣的:(特征工程,算法,机器学习)