Datawhale X 李宏毅苹果书AI夏令营 - Task3笔记 - 2

1. 模型训练的实践方法论

在应用机器学习算法时,实践方法论可以显著提高模型的训练效果。当模型在 Kaggle 等竞赛中的表现不如预期时,首先要检查训练数据的损失。如果训练数据上的损失很大,这表明模型在训练集上也没有学好,接下来需要分析原因。

2. 模型偏差

模型偏差 是指模型过于简单,无法表达数据的真实分布。举个例子,如果模型的函数集合过小,即使找到最佳参数 θ*,损失也可能无法降低到足够低。此时,增加模型的复杂性或灵活性是一个有效的解决方案。例如,可以增加输入特征的数量或使用深度学习模型,以提高模型的表达能力。

在这里插入图片描述

3. 优化问题

优化问题 主要指梯度下降等优化算法可能会陷入局部最小值,从而无法找到真正的最优解。在优化过程中可能遇到的挑战:尽管模型的灵活性足够大,但优化算法可能无法找到更低的损失。此时,模型的优化方法可能需要改进,比如采用更高级的优化算法或调整超参数。

举例来说,在残差网络的研究中,如果深度更大的网络(例如 56 层)在训练集上的损失比浅层网络(例如 20 层)更高,这可能表明优化算法做得不好,而不是模型的灵活性不足。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 过拟合

过拟合 是指模型在训练数据上表现良好,但在测试数据上表现不佳。这通常是因为模型过于复杂,能够记住训练集中的噪声而非学习到数据的真实模式。过拟合的极端情况:模型在训练集上取得完美结果,但在测试集上却表现不佳。
在这里插入图片描述

为了解决过拟合问题,可以采取以下策略:

  • 增加训练集:通过数据增强等方法增加训练样本,以降低模型的复杂性对数据的敏感性。
  • 限制模型的灵活性:减少模型参数的数量或使用正则化技术,如早停(early stopping)、正则化(regularization)和丢弃法(dropout method)。这些方法可以防止模型过度拟合训练数据。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
5. 交叉验证

交叉验证 是一种评估模型泛化能力的方法。最常见的是 k 折交叉验证。训练数据被分成 k 等份,其中一部分用于验证模型,其余部分用于训练。通过对每一份进行训练和验证,可以得到更稳定的模型性能评估。
在这里插入图片描述
在这里插入图片描述

6. 不匹配

不匹配 是指训练集和测试集的分布不一致,即使模型在训练集上表现良好,也可能在测试集上表现不佳。解决不匹配问题,需要理解数据的生成过程,并确保训练集和测试集具有相似的分布。
在这里插入图片描述

实战演练

import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.regularizers import l2
from tensorflow.keras.callbacks import EarlyStopping
from sklearn.model_selection import train_test_split, KFold
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier

# 生成模拟数据
X = np.random.rand(1000, 10)
y = np.random.randint(2, size=(1000, 1))

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

def create_model(learning_rate=0.001, l2_reg=0.01):	# 创建模型函数
    model = Sequential([
        Dense(64, activation='relu', kernel_regularizer=l2(l2_reg), input_shape=(10,)),
        Dense(32, activation='relu', kernel_regularizer=l2(l2_reg)),
        Dense(1, activation='sigmoid')
    ])
    model.compile(optimizer=Adam(learning_rate=learning_rate), loss='binary_crossentropy', metrics=['accuracy'])
    return model


def cross_validate_model(X, y):	# 交叉验证评估
    model = KerasClassifier(build_fn=create_model, epochs=20, batch_size=32, verbose=0)
    kf = KFold(n_splits=5, shuffle=True, random_state=42)
    results = []
    for train_index, val_index in kf.split(X):
        X_train, X_val = X[train_index], X[val_index]
        y_train, y_val = y[train_index], y[val_index]
        history = model.fit(X_train, y_train, validation_data=(X_val, y_val))
        val_accuracy = history.history['val_accuracy'][-1]
        results.append(val_accuracy)
    return results

# 创建和训练模型
model = create_model()
early_stopping = EarlyStopping(monitor='val_loss', patience=5)
history = model.fit(X_train, y_train, epochs=100, batch_size=32, validation_split=0.2, callbacks=[early_stopping])

# 评估模型
test_loss, test_accuracy = model.evaluate(X_test, y_test)
print(f'Test Loss: {test_loss:.4f}')
print(f'Test Accuracy: {test_accuracy:.4f}')

# K折交叉验证
cv_results = cross_validate_model(X, y)
print(f'Cross-Validation Results: {cv_results}')
print(f'Mean Accuracy: {np.mean(cv_results):.4f}')

运行结果:
输出模型在测试集上的损失值和准确率,用于表明模型在未见过的数据上的表现。测试结果会输出一条信息,比如测试损失和准确率,例如“Test Loss: 0.6932” 和 “Test Accuracy: 0.5020”,显示模型的实际表现如何。此外,代码还会进行K折交叉验证,评估模型在整个数据集上的性能。交叉验证的结果会以准确率的形式呈现,并计算这些准确率的均值。你会看到类似“Cross-Validation Results: [0.4950, 0.5100, 0.5000, 0.5050, 0.4900]” 和 “Mean Accuracy: 0.5000”的输出,展示模型在不同数据划分上的表现一致性和稳定性。这些结果帮助你了解模型的泛化能力和稳定性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值