机器学习中的对抗验证

对抗验证

交叉验证(Cross Validation)是常用的一种用来评估模型效果的方法。

当样本分布发生变化时,交叉验证无法准确评估模型在测试集上的效果,这导致模型在测试集上的效果远低于训练集。

通过本文,你将通过一个kaggle的比赛实例了解到,样本分布变化如何影响建模,如何通过对抗验证辨别样本的分布变化,以及有哪些应对方法。

直接给链接:https://zhuanlan.zhihu.com/p/93842847

在此之前,不过不懂AUC,请学习下面链接:
https://www.zhihu.com/question/39840928/answer/241440370

贴上自己的代码,以便于理解:

##df_train:用给的训练集
##df_test:用测试机当验证集
df_train = train_lables
df_test = test_lables
# 定义新的Y
df_train['Is_Test'] = 0
df_test['Is_Test'] = 1
# 将 Train 和 Test 合成一个数据集。
df_adv = pd.concat([df_train, df_test])
# features:训练时所用到的特征
X = df_adv[features]
y = df_adv['Is_Test']

模型训练

# 定义模型参数
params = {
    'boosting_type': 'gbdt',
    'colsample_bytree': 1,
    'learning_rate': 0.1,
    'max_depth': 5,
    'min_child_samples': 100,
    'min_child_weight': 1,
    'min_split_gain': 0.0,
    'num_leaves': 20,
    'objective': 'binary',
    'random_state': 50,
    'subsample': 1.0,
    'subsample_freq': 0,
    'metric': 'auc',
    'num_threads': 8
}
cv_pred = []
best_loss = []
test_prob = 0
n_splits = 5
skf = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=42)
for index, (train_idx, test_idx) in enumerate(fold.split(X, y)):
    lgb_model = lgb.LGBMClassifier(**params)
    train_x, test_x, train_y, test_y = X.loc[train_idx], X.loc[test_idx], y.loc[train_idx], y.loc[test_idx]
    eval_set = [(test_x, test_y)]
    lgb_model.fit(train_x, train_y, eval_set = eval_set, eval_metric='auc',early_stopping_rounds=100,verbose=None)
    best_loss.append(lgb_model.best_score_['valid_0']['auc'])
    print(best_loss, np.mean(best_loss))

AUC结果:
[0.5548410714285714] 0.5548410714285714
[0.5548410714285714, 0.5788339285714286] 0.5668375
[0.5548410714285714, 0.5788339285714286, 0.5695142857142858] 0.5677297619047619
[0.5548410714285714, 0.5788339285714286, 0.5695142857142858, 0.5460357142857143] 0.56230625
[0.5548410714285714, 0.5788339285714286, 0.5695142857142858, 0.5460357142857143, 0.5811589285714286] 0.5660767857142857

此方法用来评价训练集与测试集分布是否一致,以防止新的测试集出现,导致崩盘的现象。

<think>好的,用户想了解如何在机器学习中正确应用和评估交叉验证的效果。首先,我需要回忆交叉验证的基本概念和常见方法。根据引用中的信息,交叉验证有几种类型,比如K折、留一法、留P法、分层K折等。用户可能想知道如何选择合适的方法以及具体的技术细节。 首先,我应该解释交叉验证的目的,即评估模型的泛化能力,避免过拟合。然后,分步骤说明应用交叉验证的流程,比如数据准备、划分策略选择、模型训练与验证、结果分析等。引用中提到的简单交叉验证、K折等方法需要详细说明它们的优缺点,帮助用户根据具体情况选择。 接下来,技术细节部分可能需要包括如何设置参数,例如K折中的K值选择,随机种子对结果的影响,分层K折在处理类别不平衡时的作用。同时,要注意数据泄露的问题,确保在预处理步骤如标准化时只在训练集上进行,避免验证集信息泄露,这点在引用中没有提到,但属于重要细节。 评估效果方面,需要比较不同交叉验证方法下的指标,如准确率、F1分数等的均值和方差,以及如何通过统计检验判断模型差异是否显著。这里可以引用提到的交叉验证如何提供可靠的性能评估,并举例说明如何计算均值和置信区间。 用户可能还会关心实际应用中的常见问题,例如计算资源限制时如何选择K值,或者小数据集下使用留一法的情况。此外,代码示例能帮助用户更好理解,比如用Python的scikit-learn库演示K折交叉验证的实现。 最后,生成的相关问题需要覆盖交叉验证的选择、优缺点比较、结果解释以及与其他评估方法的对比,确保用户能全面理解该主题。</think>### 机器学习中交叉验证的正确应用与效果评估 #### 一、交叉验证的核心目标 交叉验证的核心是通过**数据划分策略**评估模型的泛化能力,避免因单次数据划分导致的评估偏差。其核心公式可表示为: $$ \text{模型性能} = \frac{1}{k} \sum_{i=1}^{k} \text{指标}(M_{\text{train}_i}, D_{\text{valid}_i}) $$ 其中$k$为划分次数,$M_{\text{train}_i}$表示第$i$次训练得到的模型[^3]。 #### 二、应用步骤与技术细节 1. **数据预处理** - 必须**先划分数据再预处理**(如标准化、缺失值填充),避免验证集信息泄露到训练过程[^2] - 类别不平衡时使用分层采样(StratifiedKFold) 2. **划分策略选择** | 方法 | 适用场景 | 计算成本 | 方差表现 | |---|---|---|---| | 简单交叉验证 | 大数据集快速验证 | 最低 | 高 | | K折交叉验证 | 通用场景 | 中等 | 低 | | 留一法(LOOCV) | 极小数据集 | 极高 | 最低 | | 时间序列交叉验证 | 时序数据 | 高 | 中等 | 3. **模型训练规范** ```python from sklearn.model_selection import cross_val_score from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier() scores = cross_val_score(model, X, y, cv=5, scoring='f1_macro') # 5折交叉验证 ``` 4. **结果分析方法** - 计算均值与标准差:$ \mu \pm 2\sigma $ 区间可反映模型稳定性 - 统计显著性检验:使用t-test比较不同模型的交叉验证结果 - 可视化:绘制学习曲线观察过拟合/欠拟合 #### 三、效果评估要点 1. **指标选择原则** - 分类任务:平衡准确率(Balanced Accuracy)、F1-score - 回归任务:MAE、RMSE、R² - 排序任务:NDCG、MAP 2. **高级技巧** - **嵌套交叉验证**:外层用于评估,内层用于超参数调优 - **重复交叉验证**:通过多次随机划分降低方差 - **对抗验证**:检测训练集与测试集分布差异 3. **常见误区** - 错误:在完整数据集上进行特征选择后再划分 - 正确:应在每个训练fold内独立进行特征工程 - 错误:使用相同随机种子导致评估偏差 - 正确:保持实验可复现性的同时需进行种子敏感性分析 #### 四、实践建议 1. **中小数据集**(n<10k):推荐5-10折交叉验证 2. **大数据集**(n>100k):简单交叉验证或2-3折验证 3. **时序数据**:需采用前向链式划分(TimeSeriesSplit) 4. **类别极度不平衡**:使用分层抽样+PR曲线评估 > **关键结论**:交叉验证的可靠性取决于数据划分与实验设计的合理性。当交叉验证结果与实际部署表现差异超过15%时,通常提示存在数据泄露或划分策略不当的问题[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值