深度学习模型性能优化实战之从评估到提升的全流程解析
1. 概述
在构建和使用机器学习模型的过程中,模型的效果评估和优化是两个至关重要的环节。无论模型是用于分类、回归还是其他任务,评估其表现以及持续优化模型性能,都是确保模型在实际应用中取得成功的关键。本节将重点介绍模型效果评估的定义、评估模型性能的重要性以及模型优化的必要性。
1.1 什么是模型效果评估?
模型效果评估是指通过一系列指标和方法来衡量机器学习模型在特定任务上的表现。它帮助我们量化模型的预测能力,判断模型是否能够有效地完成给定的任务。常见的评估指标包括准确率、精确率、召回率、F1分数、AUC等。不同的任务和场景下,使用的评估指标可能不同。评估的主要目标是确定模型是否可以在训练数据之外的测试数据上进行良好的泛化,即对未知数据的预测准确性。
1.2 评估模型性能的重要性
模型性能的评估至关重要,原因包括:
-
判断模型的有效性:通过评估指标可以判断模型是否达到了预期的目标。例如,在分类任务中,模型是否准确地分类了大部分的样本。
-
指导模型改进:通过评估模型在不同指标下的表现,我们可以识别模型的弱点,进而有针对性地调整模型结构或算法,提升其性能。
-
避免过拟合与欠拟合:模型的性能评估可以帮助发现模型是否出现过拟合(在训练集表现很好但在测试集上效果差)或欠拟合(模型无法捕捉数据的复杂性),从而采取适当的措施进行优化。
-
选择合适的模型:在开发阶段,往往会尝试多种不同的模型,通过对这些模型进行效果评估,可以帮助选择最适合的模型。
1.3 模型优化的必要性
模型优化是提高模型性能的过程,通常是基于评估结果进行的。优化的目的是提高模型在实际任务中的预测能力,使其能够更好地处理复杂的任务。模型优化的必要性体现在以下几个方面:
-
提高泛化能力:通过调整模型参数、结构以及正则化手段,可以避免模型过度拟合训练数据,提高其在测试集或实际生产环境中的表现。
-
提高运行效率:模型的优化不仅可以提升性能,还可以减少训练时间和计算资源的消耗,尤其在大规模数据集和实时系统中尤为重要。
-
应对数据不平衡问题:在许多实际场景中,数据存在类别不平衡问题,优化模型可以帮助提升在少数类上的预测能力,增强模型的适用性。
-
提升模型稳定性:在某些任务中,优化模型能够提升其稳定性和鲁棒性,确保其在不同场景下均有良好的表现,减少模型在新数据上的波动。
2. 模型评估的基本指标
在机器学习模型的评估过程中,选择合适的评估指标至关重要。不同的任务场景下,评估模型表现的方式可能有所不同,因此理解各种常见的评估指标及其适用场景非常重要。以下是几种常用的评估指标,包括分类任务中最常见的准确率、精确率、召回率、F1 分数、ROC-AUC 曲线和混淆矩阵。
2.1 准确率(Accuracy)
准确率是最基础、最直观的评估指标,表示模型预测正确的样本数占总样本数的比例。
公式为:
Accuracy = T P + T N T P + T N + F P + F N \ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} Accuracy=TP+TN+FP+FNTP+TN
其中:
- TP:True Positive(真正例),即模型正确预测为正类的数量。
- TN:True Negative(真负例),即模型正确预测为负类的数量。
- FP:False Positive(假正例),即模型错误预测为正类的数量。
- FN:False Negative(假负例),即模型错误预测为负类的数量。
准确率适合于数据类别平衡的场景,但在类别不平衡的情况下,单纯使用准确率可能无法反映模型的真实表现。例如,在一个极度偏向负类的分类问题中,模型即使全预测为负类,准确率也会非常高。
2.2 精确率(Precision)
精确率是针对正类预测的一个评估指标,表示模型预测的正类样本中有多少是真正的正类样本。
公式为:
Precision = T P T P + F P \ \text{Precision} = \frac{TP}{TP + FP} Precision=TP+FPTP
精确率高,意味着模型在预测为正类时,错误预测为正类的比例较低。在某些场景下(如垃圾邮件检测),更关注模型在预测为正时的准确性,这时精确率就显得尤为重要。
2.3 召回率(Recall)
召回率衡量的是模型在所有真实的正类样本中,有多少被正确预测为正类。它反映了模型的“敏感性”。
公式为:
Recall = T P T P + F N \ \text{Recall} = \frac{TP}{TP + FN} Recall=TP+FNTP
召回率高,意味着模型可以识别出更多的正类样本。在某些任务中,召回率比精确率更重要,例如在疾病检测中,漏掉一个阳性病例的代价往往非常高。
2.4 F1 分数(F1 Score)
F1 分数是精确率和召回率的调和平均值,是一个综合考虑这两个指标的指标。当我们希望在精确率和召回率之间找到一个平衡点时,F1 分数是一个非常有效的评估指标。
公式为:
F 1 = 2 × Precision × Recall Precision + Recall \ F1 = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} F1=2×Precision+RecallPrecision×Recall
F1 分数在值域为 0 到 1 之间,越接近 1,模型的精确率和召回率之间的平衡越好。
2.5 ROC-AUC 曲线
ROC(Receiver Operating Characteristic)曲线是一条表示模型在不同阈值下的分类性能的曲线。曲线的横轴为假正率(False Positive Rate, FPR),纵轴为真正率(True Positive Rate, TPR)。
- FPR:假正率,即假阳性数在实际负类总数中的占比。
F P R = F P F P + T N \ FPR = \frac{FP}{FP + TN} FPR=FP+TNFP - TPR:真正率,即召回率。
T P R = T P T P + F N \ TPR = \frac{TP}{TP + FN} TPR=TP+FNTP
AUC(Area Under the Curve)是 ROC 曲线下的面积,用来衡量模型的整体分类能力,AUC 值越接近 1,说明模型的分类效果越好。ROC-AUC 特别适用于不平衡数据集的评估,因为它可以有效地反映正负类样本分布不均的情况。
2.6 混淆矩阵(Confusion Matrix)
混淆矩阵是一个可视化工具,展示了模型在分类任务中的预测结果与真实结果之间的对应关系。它是一个二维矩阵,表示预测标签与实际标签的组合情况。混淆矩阵的结构如下:
预测为正类(Positive) | 预测为负类(Negative) | |
---|---|---|
实际为正类 | TP(真正类) | FN(假负类) |
实际为负类 | FP(假正类) | TN(真负类) |
通过混淆矩阵,可以非常直观地看到模型在不同类别下的表现,便于分析哪些类别容易被误分类,从而有针对性地进行优化。
3. 模型评估的高级指标
除了常见的基础评估指标外,复杂的机器学习任务往往需要更深入的评估手段。这些高级评估指标提供了对模型性能的更细致分析,帮助我们更好地理解模型的行为和改进方向。以下是几种常见的高级模型评估指标:
3.1 Log-Loss(对数损失)
Log-Loss(对数损失)是一种常用于分类任务的损失函数,尤其是二元分类和多分类问题中。它用于衡量模型的预测概率与实际类别之间的差异,强调了模型预测不确定性的影响。Log-Loss 对错误预测的惩罚非常大,特别是当模型对错误类别给出高概率时。
公式为:
Log-Loss = − 1 N ∑ i = 1 N [ y i log ( p i ) + ( 1 − y i ) log ( 1 − p i ) ] \ \text{Log-Loss} = -\frac{1}{N} \sum_{i=1}^{N} \left[ y_i \log(p_i) + (1 - y_i) \log(1 - p_i) \right] Log-Loss=−N1i=1∑N[yilog(pi)+(1−yi)log(1−pi)]
其中:
- (N) 是样本数
- (y_i) 是真实标签(0 或 1)
- (p_i) 是模型预测的概率
Log-Loss 越小,说明模型的预测越准确,预测的概率值越接近真实的类概率。在应用中,Log-Loss 非常适合评估那些需要输出概率的模型,如逻辑回归和神经网络模型。
3.2 Mean Squared Error(均方误差,MSE)
均方误差(MSE)是回归任务中常用的评估指标之一。它衡量的是模型预测值与真实值之间的差异,通过计算误差的平方来避免正负误差的抵消。MSE 更关注较大的误差,因为它会对大的偏差进行平方放大。
公式为:
MSE = 1 N ∑ i = 1 N ( y ^ i − y i ) 2 \ \text{MSE} = \frac{1}{N} \sum_{i=1}^{N} (\hat{y}_i - y_i)^2 MSE=N1i=1∑N(y^i−yi)2
其中:
- (N) 是样本数
- (\hat{y}_i) 是模型的预测值
- (y_i) 是实际值
MSE 越小,说明模型的预测误差越小。但由于其对较大误差的放大效应,MSE 可能会导致在某些情况下对少量的异常值过于敏感。
3.3 MAE(平均绝对误差)
平均绝对误差(Mean Absolute Error, MAE)是另一种回归任务中常用的评估指标,它与 MSE 类似,都是衡量预测值与实际值之间的差异。不同之处在于,MAE 是计算误差的绝对值而不是平方值,因此它对异常值的敏感度较小。
公式为:
MAE = 1 N ∑ i = 1 N ∣ y ^ i − y i ∣ \ \text{MAE} = \frac{1}{N} \sum_{i=1}^{N} |\hat{y}_i - y_i| MAE=N1i=1∑N∣y^i−yi∣
MAE 的值越小,表明模型的预测误差越小。由于 MAE 的稳定性,它在异常值较多的回归任务中更为适用。
3.4 AUC-PR(精确率-召回率曲线)
AUC-PR 是用于评估模型在不同阈值下的精确率和召回率的变化情况,特别适用于类别极度不平衡的二分类问题。与 ROC 曲线不同,AUC-PR 更侧重于正类样本的表现,因此在正负样本极不平衡的情况下,它能比 AUC-ROC 提供更有价值的模型表现评估。
- 精确率(Precision):正类预测为正的比例。
- 召回率(Recall):真实正类被正确预测为正的比例。
PR 曲线的横轴为召回率,纵轴为精确率,AUC-PR 是 PR 曲线下的面积,数值越大,表示模型在平衡精确率与召回率方面表现越好。
AUC-PR 特别适合不平衡数据集中的二分类任务,例如在疾病检测或欺诈检测中,由于负类占多数,AUC-PR 能更好地反映模型在正类上的表现。
3.5 衡量模型偏差与方差(Bias-Variance Tradeoff)
偏差-方差权衡(Bias-Variance Tradeoff)是模型评估中非常重要的一个概念,用来解释模型在泛化能力和训练表现上的平衡。它揭示了模型的复杂度与其在训练集和测试集上的表现之间的关系。
- 偏差(Bias):表示模型的预测与实际值之间的系统性误差。高偏差的模型(如线性回归)过于简单,无法捕捉数据中的复杂模式,容易产生欠拟合问题。
- 方差(Variance):表示模型对训练数据的敏感度。高方差的模型(如高复杂度的决策树)过度拟合训练数据,导致模型无法很好地泛化到新的数据,容易产生过拟合问题。
衡量模型的偏差和方差可以通过以下步骤:
- 偏差的衡量:通过观察模型在训练集和测试集上的误差来评估。高偏差意味着模型在训练集上的误差也很高,模型过于简单。
- 方差的衡量:通过模型在训练集和测试集之间的性能差异来评估。高方差意味着模型在训练集上表现很好,但在测试集上表现较差,模型过于复杂。
在实际应用中,开发者往往需要在偏差和方差之间找到一个合适的平衡,以确保模型既不过拟合也不过度简化。这种平衡常常通过正则化技术、交叉验证等方式来实现。
4. 模型效果可视化
可视化是评估模型效果的一种直观而有效的方式,通过图形展示不同评估指标的变化和模型的行为,可以帮助开发者更好地理解模型的表现、发现潜在问题,并进行针对性的优化。在这一节中,我们将讨论几种常见的模型效果可视化方法。
4.1 混淆矩阵可视化
混淆矩阵是一种显示分类模型预测结果的工具,它可以帮助我们了解模型在各个类别上的表现。通过混淆矩阵的可视化,可以清楚地看到模型在哪些类别上预测得准确,在哪些类别上容易出错。
混淆矩阵的可视化一般用热力图(Heatmap)表示,每个矩阵格子中的数字表示实际值与预测值的对应情况:
- 对角线上的数字表示模型正确分类的样本数(真正例和真负例)。
- 对角线外的数字表示错误分类的样本数(假正例和假负例)。
这种可视化形式便于识别模型在特定类别上的偏差,并根据具体误分类的情况进行调优。
4.2 ROC 曲线与 AUC 指标的可视化
ROC 曲线是一种用于二分类任务中评估模型性能的图形工具,它展示了模型在不同阈值下的假正率(FPR)与真正率(TPR)之间的权衡。通过绘制 ROC 曲线,可以观察到模型在不同阈值下的表现,特别是当需要权衡召回率和精确率时。
ROC 曲线的横轴为假正率(False Positive Rate),纵轴为真正率(True Positive Rate),曲线下的面积(AUC)越大,表示模型的整体性能越好。
ROC 曲线图的可视化可以帮助开发者直观了解模型的分类能力:
- 理想的 ROC 曲线接近左上角,这意味着模型在各种阈值下表现良好。
- AUC 值接近 1 时,表示模型的判别能力很强;AUC 值接近 0.5 时,表示模型的判别能力接近随机猜测。
4.3 Precision-Recall 曲线
精确率-召回率(Precision-Recall, PR)曲线是衡量模型在不同阈值下精确率和召回率之间的权衡关系的工具,尤其适合用于类别不平衡的场景。在精确率和召回率之间,常常存在一个互相制约的关系:当提高召回率时,精确率可能会降低,反之亦然。
PR 曲线的横轴为召回率(Recall),纵轴为精确率(Precision)。通过可视化 PR 曲线,可以帮助开发者了解模型在平衡召回率和精确率时的表现,特别是在处理类别不平衡问题时,它比 ROC 曲线更有意义。
AUC-PR 是精确率-召回率曲线下的面积,越大表示模型在正负类分布不均的情况下表现越好。通过可视化 PR 曲线,可以判断在哪个阈值下模型能更好地兼顾精确率和召回率。
4.4 学习曲线(Learning Curve)
学习曲线是用来评估模型随着训练集大小增加时的表现变化情况的工具。通过绘制学习曲线,开发者可以直观地看到模型的训练误差和验证误差随着训练数据量变化的趋势,从而判断模型是否有足够的数据进行训练,或是否存在过拟合或欠拟合的问题。
学习曲线的横轴通常是训练集的大小,纵轴是模型的误差(如准确率或损失函数值)。通过可视化学习曲线,可以做出以下评估:
- 如果训练误差和验证误差都较大,说明模型欠拟合,可能需要提高模型的复杂度或使用更多的特征。
- 如果训练误差较小而验证误差较大,说明模型过拟合,可以通过正则化或增加训练数据来解决。
4.5 参数的重要性图(Feature Importance)
参数的重要性图是一种用于解释模型中各个特征对最终预测结果影响的可视化工具。尤其在决策树、随机森林等模型中,模型能够自动计算每个特征的重要性,帮助开发者理解哪些特征对模型的预测影响最大。
参数的重要性可视化通常以柱状图或条形图的形式展示:
- 横轴表示特征的重要性分数,通常归一化到 0 和 1 之间。
- 纵轴表示各个特征的名称。
通过可视化参数的重要性,开发者可以:
- 识别对模型贡献最大的特征,并进一步优化这些特征。
- 删除对模型预测无关紧要的特征,从而简化模型,减少过拟合的风险。
5. 模型的过拟合与欠拟合
在机器学习中,模型的泛化能力是至关重要的。过拟合和欠拟合是两个常见的问题,它们直接影响模型在新数据上的表现,因此理解它们的概念并知道如何识别和处理这些问题非常重要。
5.1 过拟合与欠拟合的定义
-
过拟合(Overfitting):过拟合是指模型在训练数据上表现极佳,但在测试数据或新数据上的表现较差。这通常是因为模型过于复杂,学到了训练数据中的噪声和细节,导致泛化能力不足。过拟合模型能够很好地记住训练集中的每个样本,但在面对新数据时表现较差。
-
欠拟合(Underfitting):欠拟合是指模型在训练数据和测试数据上都表现不佳。这通常是因为模型过于简单,无法捕捉数据中的复杂模式。欠拟合模型没有充分学习训练数据中的信息,导致对任务的理解不足。
5.2 如何通过模型评估识别过拟合与欠拟合?
通过模型的训练误差和测试误差,可以有效识别模型是否存在过拟合或欠拟合。常用的方法包括以下几种:
-
训练误差与测试误差的对比:
- 过拟合:如果模型在训练集上误差很低,但在测试集上误差较高,说明模型可能过拟合。模型在训练集上过度拟合,学习到了训练数据中的细节和噪声,导致在新数据上的表现不稳定。
- 欠拟合:如果模型在训练集和测试集上的误差都很高,说明模型欠拟合,无法有效捕捉数据中的模式。
-
学习曲线(Learning Curve):
- 过拟合:学习曲线显示训练误差远低于验证误差,且随着数据量的增加,训练误差继续下降而验证误差保持较高。这个现象表明模型在训练集上表现良好,但在测试集上无法泛化。
- 欠拟合:学习曲线显示训练误差和验证误差都很高,且随着数据量的增加,误差没有显著降低,表明模型没有足够复杂性来学习数据中的模式。
-
交叉验证(Cross-validation):
- 通过交叉验证可以在多个数据集上评估模型性能。如果模型在每个训练集上的表现很好,但在验证集上的表现较差,说明模型可能过拟合。
- 如果模型在训练集和验证集上的表现都不理想,说明模型欠拟合。
5.3 过拟合与欠拟合对模型性能的影响
-
过拟合的影响:
- 泛化能力差:过拟合模型对训练数据的适应性过强,学到了数据中的噪声和细节,这导致它在新数据上的表现较差,无法有效泛化。
- 误导模型优化方向:由于模型在训练集上表现极佳,可能误导开发者认为模型已经非常优秀,但实际上它对新数据并不可靠。
- 模型复杂度高:过拟合通常伴随着模型的高复杂度,可能导致模型训练时间较长、推理速度变慢。
-
欠拟合的影响:
- 学习不足:欠拟合模型对数据的理解不够深入,无法学习到数据中的有效模式,导致其在训练数据和测试数据上都表现不佳。
- 低预测准确性:由于模型过于简单,欠拟合通常表现为准确率低或误差大,无法有效完成预测任务。
- 模型优化空间大:欠拟合的模型通常意味着可以通过增加模型复杂度、增加特征等手段显著提高性能。
5.4 如何解决过拟合与欠拟合?
-
解决过拟合的方法:
- 增加训练数据:通过增加训练数据,模型可以获得更多的信息,减少对噪声的过度学习。
- 正则化:使用 L1、L2 正则化等技术,可以限制模型的复杂性,防止模型过度拟合训练数据。
- 使用更简单的模型:降低模型的复杂度,例如减少神经网络中的层数或节点数,以减少模型对训练数据的过度拟合。
- 数据增强:通过数据增强技术(如图像旋转、翻转等),增加数据的多样性,帮助模型更好地泛化。
-
解决欠拟合的方法:
- 增加模型复杂度:通过增加模型的参数(如增加神经网络的层数、使用更复杂的算法)来提高模型对数据的学习能力。
- 特征工程:引入更多有意义的特征或使用高级特征提取方法,帮助模型捕捉数据中的复杂模式。
- 减少正则化:如果模型的正则化参数过高,可能会导致欠拟合,适当减小正则化强度可以帮助模型更好地拟合数据。
- 训练更长时间:延长模型的训练时间或增加训练的迭代次数,使模型有更多机会学习数据中的模式。
6. 模型优化技术
模型优化是提高模型性能的关键步骤,通过合理的优化策略,可以提高模型的泛化能力,减少过拟合问题,增强模型在实际应用中的表现。本节将介绍几种常见的模型优化技术。
6.1 数据增强与清洗(Data Augmentation and Preprocessing)
-
数据增强:特别适用于图像、文本等任务,通过增加训练数据的多样性,提升模型的泛化能力。常见的数据增强方法包括图像的翻转、旋转、缩放,以及在文本中加入同义词替换等。它可以有效减少模型的过拟合,特别是在数据量较小的场景下。
-
数据清洗:清洗数据是模型优化的基础步骤,包括处理缺失值、异常值、重复数据等。确保数据质量可以帮助模型更准确地学习重要模式,同时减少训练噪声对模型的影响。
6.2 特征工程(Feature Engineering)
特征工程是提高模型性能的重要方法,通过选择、创造、变换数据中的特征来提升模型的表现。
-
特征选择:去除冗余特征或噪声特征,保留最相关的特征,帮助模型更快、更准确地学习数据模式。
-
特征缩放:如标准化(Standardization)或归一化(Normalization),将特征值缩放到相同范围,尤其适用于基于距离的算法(如KNN、SVM)和梯度下降优化的算法。
-
特征提取:使用技术如主成分分析(PCA)或其他降维方法,减少特征维度,保留数据中的主要信息,这有助于降低模型复杂度和计算成本。
6.3 正则化技术(L1 和 L2 正则化)
正则化通过在损失函数中添加惩罚项来控制模型的复杂度,从而减少过拟合。
-
L1 正则化(Lasso 回归):对权重的绝对值进行惩罚,能够使某些权重变为零,从而实现特征选择。这种正则化方法适用于特征较多的场景。
-
L2 正则化(Ridge 回归):对权重的平方进行惩罚,限制模型的权重过大,减少过拟合的风险。L2 正则化有助于防止模型在训练数据中捕捉噪声。
6.4 模型集成(Ensemble Methods)
模型集成是通过组合多个模型的预测结果来提高整体模型的性能,常见的方法有:
-
Bagging:通过从训练集中随机采样生成多个子集,在每个子集上训练模型,最终通过平均或投票得到预测结果。随机森林是典型的 Bagging 算法,它通过在每个决策树上随机选择特征来减少过拟合。
-
Boosting:迭代训练多个弱模型,每次训练时重点关注前一轮被错误分类的样本。经典算法如 AdaBoost、Gradient Boosting 等通过逐步优化分类误差来提高模型准确性。XGBoost 和 LightGBM 是 Boosting 的改进版,它们在处理大规模数据时表现出色。
6.5 超参数调优(Hyperparameter Tuning)
超参数调优可以显著提高模型的性能,通过选择最佳的超参数组合,使得模型在特定任务中的表现达到最优。常见的调优方法有:
-
网格搜索(Grid Search):通过穷举所有可能的超参数组合来找到最优的设置。虽然这种方法能保证找到最佳参数,但计算成本较高,适用于较小的超参数空间。
-
随机搜索(Random Search):随机选择部分超参数组合进行评估,计算效率较高,适用于超参数空间较大的情况。
-
贝叶斯优化(Bayesian Optimization):通过构建超参数的概率模型,智能地选择超参数组合。贝叶斯优化相比网格搜索和随机搜索能更快地找到最优超参数,尤其适用于复杂的模型。
6.6 Early Stopping 技术
Early Stopping 是一种常用的防止过拟合的技术,尤其适用于深度学习模型。它通过监控模型在验证集上的性能,当性能不再提高时提前停止训练,从而避免模型在训练集上过度拟合。Early Stopping 不仅能提升模型的泛化能力,还能减少不必要的训练时间,节约计算资源。
7. 基于损失函数的优化
损失函数是机器学习模型优化的核心,通过最小化损失函数,模型可以逐步调整参数,使预测结果更接近实际值。在实际应用中,不同任务需要不同的损失函数来衡量模型性能,甚至可以自定义损失函数,以适应特定场景的需求。
7.1 自定义损失函数与应用场景
损失函数的选择对于模型优化至关重要,常用的损失函数包括:
- 均方误差(MSE):常用于回归任务,衡量预测值与真实值之间的平方差,适合关注大误差的场景。
- 交叉熵损失(Cross-Entropy Loss):常用于分类任务,特别是多分类问题,它衡量模型输出的概率分布与实际标签分布之间的差异。
然而,某些特定场景下,标准的损失函数并不能完全满足需求,此时可以设计自定义损失函数。自定义损失函数可以根据实际需求进行优化,以下是几种常见应用场景:
-
不平衡数据问题:在分类任务中,当数据不平衡(例如,正负样本数量差异较大)时,标准的损失函数可能导致模型倾向于预测多数类。为此,可以自定义加权交叉熵损失(Weighted Cross-Entropy Loss),给少数类样本赋予更高权重,使模型更加关注少数类。
-
异质性误差处理:在某些回归任务中,不同预测值区间的误差影响不同。例如,当预测的误差较小时,模型对误差的容忍度可以高一些,而对大误差的惩罚则需要更严格。这时,可以设计带有误差权重的自定义损失函数,重点惩罚大误差。
-
特定业务需求:在一些实际应用中,模型的错误代价不同。例如,在金融领域,假正例和假负例的代价可能不对等,因此可以设计惩罚特定错误类型的损失函数,以最小化业务相关风险。
-
对抗样本的鲁棒性:为了提高模型对对抗样本的鲁棒性,可以自定义损失函数,加入对抗扰动的约束,迫使模型学习到更加稳健的特征。
7.2 通过损失函数进行模型优化
在机器学习模型的训练过程中,模型通过最小化损失函数来更新参数。损失函数是模型优化的目标,因此合理的损失函数设计对模型性能的影响非常大。通过以下方式,开发者可以通过调整或自定义损失函数进行优化:
-
损失函数的平衡:
-
在一些场景下,模型需要同时优化多个目标,如回归模型需要同时考虑预测的准确性和模型的平滑性。这种情况下,可以通过组合损失函数,例如将 MSE 和正则化项结合,找到精度与复杂度的平衡。
-
组合损失函数的形式一般为:
Loss = MSE + λ ⋅ Regularization Term \ \text{Loss} = \text{MSE} + \lambda \cdot \text{Regularization Term} Loss=MSE+λ⋅Regularization Term
其中 ( \lambda ) 是控制两个目标的权重因子,通过调整该超参数,可以实现更合理的优化。
-
-
对目标函数进行微调:
- 对于一些需要精确优化特定目标的任务,如提高分类的召回率,可以在损失函数中加入目标导向的惩罚机制。例如,可以将 F1 分数转化为损失函数,通过优化 F1 分数来最大化分类的精确率和召回率。
-
针对特定任务的优化:
- 在推荐系统、广告点击率预估等任务中,AUC(Area Under Curve)是一个非常重要的评估指标。标准损失函数(如交叉熵)虽然与 AUC 相关,但并非直接优化 AUC。因此,可以通过构建能够直接优化 AUC 的自定义损失函数,提升模型在这些指标上的表现。
-
动态调整损失函数:
- 在一些复杂场景中,损失函数不一定是固定的。可以设计动态损失函数,根据模型的训练状态、错误分布、或某些业务需求的变化,调整损失函数。例如,在模型早期训练时,可能更关注总体误差的减小,而在后期更关注优化特定的精度或召回率。
-
使用自定义损失函数改善模型鲁棒性:
- 一些模型对噪声或对抗攻击样本敏感,可以通过加入特定约束或加权项的自定义损失函数,让模型对噪声更加鲁棒。例如,在图像分类中可以加入对抗损失函数,使模型不仅要在正常样本上表现好,还要在对抗样本上有一定的抗扰性。
8. 模型的可解释性与公平性
在机器学习模型的实际应用中,除了追求性能外,模型的可解释性和公平性也日益重要。模型可解释性帮助我们理解模型的预测过程,从而增强信任感和可操作性;而模型公平性确保模型对不同群体的预测结果不带偏见,避免在实际应用中出现歧视性行为。
8.1 可解释性的重要性
模型可解释性指的是能够理解和解释模型的决策过程和预测结果。可解释性在以下场景中尤为重要:
-
增强信任和透明度:在高风险领域(如医疗、金融、司法等),可解释性使模型的决策透明化,用户和监管机构可以更好地信任模型的预测结果。
-
调试与优化:可解释性可以帮助开发者识别模型中的问题,理解模型为什么在某些情况下表现不佳,并进一步优化模型。
-
法律与合规要求:在一些场景中,法律或行业标准要求模型必须可解释,尤其是涉及个人权益的预测任务(如贷款申请、信用评分、招聘筛选等)。
-
避免错误决策:当模型的决策过程可解释时,用户能够理解为什么模型做出某一决策,从而在特定情况下避免依赖错误预测做出错误决策。
8.2 如何提高模型的可解释性(LIME, SHAP)
提高模型的可解释性,可以通过多种方法,其中 LIME 和 SHAP 是两种常见的模型解释工具,它们提供了针对复杂模型的局部或全局解释。
LIME(Local Interpretable Model-agnostic Explanations)
LIME 是一种模型无关的解释方法,它通过生成局部线性模型来解释复杂模型的预测结果。LIME 的核心思想是:虽然复杂模型整体可能难以解释,但在某个局部区域上,它的行为可以通过线性模型来近似。
-
工作原理:
- 在输入数据的周围生成多个类似的样本。
- 观察模型在这些样本上的预测。
- 通过拟合一个局部线性模型来解释模型的预测行为。
-
应用场景:LIME 常用于深度学习模型和其他黑箱模型(如集成模型、随机森林)在某个具体样本的预测解释,帮助理解模型是如何得出某个特定预测的。
SHAP(SHapley Additive exPlanations)
SHAP 是一种基于合作博弈论的解释方法,通过分配特征的重要性分数来解释模型的输出。SHAP 的核心思想是将每个特征看作是一个玩家,它们共同决定模型的输出,SHAP 值衡量了每个特征对模型预测贡献的大小。
-
工作原理:
- SHAP 值基于 Shapley 值计算,这是博弈论中的一个概念,表示每个特征在所有可能的特征组合中的贡献。
- SHAP 提供了全局和局部解释,能够解释单个样本的预测结果,以及模型在整个数据集上的总体行为。
-
应用场景:SHAP 非常适合解释复杂模型如神经网络、集成模型等,它提供了一个统一的框架来解释模型的预测,并且对于多个样本、整个数据集的解释效果都较好。
对比与选择
- LIME:适合局部解释,即针对单个样本的特定预测进行解释,它的灵活性高,可以应用于各种模型。
- SHAP:不仅提供局部解释,还能提供全局解释,对于理解整个模型的行为非常有用,同时 SHAP 值有理论上的基础,因此解释的结果具有更强的可解释性和一致性。
8.3 模型公平性评估及优化
模型公平性(Fairness)指的是确保模型的预测结果不受某些特定属性(如性别、种族、年龄等)的偏见影响。公平性在道德和法律层面上都十分重要,尤其在社会影响较大的领域如就业、信贷、医疗等。
公平性评估
评估模型的公平性可以通过以下方式:
-
Demographic Parity:即不同群体(如男性与女性、不同种族之间)的预测结果应相似。具体衡量方式是确保模型对各个群体的正预测率相似。
-
Equal Opportunity:确保不同群体在真实正类样本上的预测准确率相同。这种评估方法适用于关注不同群体中的某些重要机会(如接受治疗、获得贷款等)的场景。
-
Equalized Odds:确保模型在不同群体上的假正率和真正率一致。即对于不同群体,模型的错误率和正确率应该保持一致。
公平性优化
为了提升模型的公平性,以下几种方法常用于解决模型中的偏见问题:
-
预处理数据:在模型训练之前,通过对数据进行平衡处理来减少偏见。例如,可以通过过采样或欠采样技术平衡不同群体的数据分布,或者通过去除与偏见相关的特征来减少数据偏见。
-
修改损失函数:在模型训练过程中,加入公平性约束,将公平性目标融入到损失函数中,使得模型在优化精度的同时也考虑到不同群体的公平性。例如,加入针对不同群体的加权损失,使模型在多个群体间表现更加均衡。
-
后处理预测结果:在模型训练完成后,对预测结果进行调整,以减少模型的偏见。例如,可以通过对不同群体的预测结果进行再平衡,确保各群体的正预测率相近。
-
对抗训练:通过训练对抗网络,刻意削弱模型对某些不相关属性(如种族、性别等)的敏感性,从而使模型的预测结果更具公平性。
9. 实战案例:优化深度学习模型的性能
在本节中,我们将通过一个实际案例,展示如何使用前面介绍的优化技术来提升深度学习模型的性能。通过详细分析初始模型的表现,找出问题,并逐步应用优化技术,最终实现性能的提升。
9.1 案例介绍与问题分析
案例背景:本案例涉及一个图像分类任务,模型需要在一个包含10类的图像数据集上进行分类。初始模型采用了一个简单的卷积神经网络(CNN)架构,在训练集上表现良好,但在验证集上的准确率较低,说明存在过拟合问题。此外,模型在某些特定类别上的预测效果较差。
问题分析:
- 过拟合:模型在训练集上的准确率很高,但在验证集上的表现明显下降,可能是由于模型过度拟合训练数据。
- 类别不平衡:数据集中部分类别的样本数量较少,导致模型在这些类别上的表现不佳。
- 特征提取不足:模型的卷积层较少,可能导致对图像特征提取不充分,影响模型在复杂模式下的泛化能力。
9.2 评估初始模型效果
首先,对初始模型的效果进行评估,使用以下指标和可视化方法来分析模型的表现:
- 准确率:模型在训练集上的准确率为98%,但在验证集上仅为75%,显示出显著的过拟合现象。
- 混淆矩阵:混淆矩阵显示模型在少数类上的表现非常差,特别是某些类别的假负例率较高。
- 学习曲线:训练集的误差随着训练次数减少,但验证集的误差在训练过程中呈现上升趋势,进一步表明过拟合问题。
- ROC-AUC 曲线:虽然整体 AUC 值较高,但个别类别的 AUC 值低,说明模型在处理这些类别时表现不理想。
9.3 通过上述优化技术提升模型性能
为了提升模型性能,针对上述问题逐步应用优化技术:
-
数据增强:
- 增强策略:应用数据增强技术对图像进行旋转、翻转、裁剪等操作,增加数据多样性,防止模型过拟合。
- 效果:数据增强有效增加了训练样本的多样性,使模型在验证集上的泛化能力有所提升。
-
正则化(L2 正则化):
- 在模型的卷积层和全连接层中加入 L2 正则化,限制模型的权重大小,防止模型过度拟合训练集的细节和噪声。
- 效果:加入正则化后,模型在验证集上的表现有所提升,验证集准确率上升到80%。
-
模型集成(Ensemble Methods):
- 通过 Bagging 方法,训练多个独立的 CNN 模型,并将它们的预测结果进行投票或平均处理,减少单一模型的过拟合风险。
- 效果:模型集成后,验证集上的准确率进一步提升到83%,同时减少了在少数类别上的误分类现象。
-
超参数调优(随机搜索):
- 使用随机搜索方法调优超参数,包括卷积核数量、学习率、正则化系数等,找到更优的参数组合。
- 效果:通过超参数调优,模型的结构更加适合当前数据集,验证集上的准确率进一步提升到85%。
-
Early Stopping 技术:
- 使用 Early Stopping 技术,在验证集的准确率不再提高时提前停止训练,防止模型在训练后期过拟合。
- 效果:训练过程变得更加高效,减少了不必要的训练轮次,并且防止了模型的验证集表现下降。
9.4 性能提升前后对比
通过上述优化技术,模型的性能得到了显著提升。我们将初始模型和优化后的模型进行对比,以便直观了解优化效果。
评估指标 | 初始模型 | 优化后模型 |
---|---|---|
训练集准确率 | 98% | 90% |
验证集准确率 | 75% | 85% |
少数类预测准确率 | 60% | 80% |
过拟合现象 | 显著 | 明显减少 |
训练时间 | 较长 | 适中 |
- 验证集准确率提升:通过数据增强、正则化、模型集成等方法,验证集的准确率从75%提升到85%,提高了模型的泛化能力。
- 少数类预测性能提升:优化后,少数类的预测准确率显著提高,表明数据增强和模型集成对处理类别不平衡问题有较好的效果。
- 训练时间优化:使用 Early Stopping 技术,训练时间得到了有效控制,避免了模型在训练后期继续过拟合。
10. 结论
在本次深度学习模型优化的实战案例中,我们通过一系列的优化技术显著提升了模型的性能。通过数据增强、正则化、模型集成、超参数调优和 Early Stopping 技术的综合运用,验证集上的准确率从75%提升至85%,并显著减少了过拟合现象。同时,针对类别不平衡问题,优化后的模型在少数类样本上的表现也得到了大幅改进。
关键总结
- 数据增强与清洗:增加了训练数据的多样性,减少了模型的过拟合风险。
- 正则化技术(L2 正则化):控制了模型的复杂度,有效降低了权重值过大的情况,提升了泛化能力。
- 模型集成(Bagging):通过多个模型的组合预测,减少了模型的单一化偏差,进一步提升了模型在验证集上的表现。
- 超参数调优(随机搜索):优化了模型的超参数组合,使模型的结构更加适应数据集的特性。
- Early Stopping 技术:避免了过长时间训练,提升了模型的训练效率,并防止后期过拟合。
进一步提升模型性能的方向与工具
虽然模型性能得到了显著的提升,但依然有一些方向可以进一步优化:
-
更复杂的模型架构:可以尝试使用更深、更复杂的网络结构,例如使用预训练的深度神经网络模型(如 ResNet、EfficientNet 等),这些模型可以捕捉更高维度的特征,从而提升模型在图像分类等任务上的表现。
-
迁移学习(Transfer Learning):迁移学习能够将已经训练好的模型应用到新的任务中,特别适合数据量较少的场景。通过利用在大规模数据集上预训练好的模型,可以显著提升小规模数据集上的分类准确率。
-
优化特征提取:可以考虑使用更多高级的特征提取方法,或者进行特征选择,去掉对模型无关的特征,以提升模型的效率和表现。
-
AutoML 工具的使用:自动化机器学习工具(如 Google 的 AutoML、TPOT 等)可以自动搜索最优的模型架构和超参数,减少人工调参的工作量,并找到更优的解决方案。
-
模型公平性与可解释性:未来在优化模型性能的同时,考虑模型的可解释性和公平性变得越来越重要。通过工具如 SHAP、LIME,进一步提高模型的透明度,并确保模型在实际应用中对不同群体的公平性。
-
更高级的优化算法:可以探索使用更加智能的优化算法,如AdamW、Lookahead、Ranger等,它们在训练稳定性和收敛速度上有更好的表现。
相关文章:
深度学习模型性能优化实战之从评估到提升的全流程解析
1. 概述 在构建和使用机器学习模型的过程中,模型的效果评估和优化是两个至关重要的环节。无论模型是用于分类、回归还是其他任务,评估其表现以及持续优化模型性能,都是确保模型在实际应用中取得成功的关键。本节将重点介绍模型效果评估的定义…...
C++ | Leetcode C++题解之第446题等差数列划分II-子序列
题目: 题解: class Solution { public:int numberOfArithmeticSlices(vector<int> &nums) {int ans 0;int n nums.size();vector<unordered_map<long long, int>> f(n);for (int i 0; i < n; i) {for (int j 0; j < i;…...
【解密 Kotlin 扩展函数】扩展属性与扩展函数类似(十九)
导读大纲 1.1.1 扩展属性的创建和使用 1.1.1 扩展属性的创建和使用 之前, 我们已经了解声明 Kotlin 属性的语法 Kotlin中的顶级属性–传送门就像扩展函数一样,我们也可以指定扩展属性就像之前所说,属性和函数的区别在于前者是特征,后者是行为 相比扩展函…...
【Spring Boot 入门二】Spring Boot中的配置文件 - 掌控你的应用设置
一、引言 在上一篇文章中,我们开启了Spring Boot的入门之旅,成功构建了第一个Spring Boot应用。我们从环境搭建开始,详细介绍了JDK的安装以及IDE的选择与配置,然后利用Spring Initializr创建了项目,分析了项目结构&am…...
OpenCV第十二章——人脸识别
1.人脸跟踪 1.1 级联分类器 OpenCV中的级联分类器是一种基于AdaBoost算法的多级分类器,主要用于在图像中检测目标对象。以下是对其简单而全面的解释: 一、基本概念 级联分类器:是一种由多个简单分类器(弱分类器)级联组…...
深入Volatile
深入Volatile 1、变量不可见性: 1.1多线程下变量的不可见性 直接上代码 /*** author yourkin666* date 2024/08/12/16:12* description*/ public class h1 {public static void main(String[] args) {MyClass myClass new MyClass();myClass.start();while (tr…...
数据结构 ——— 顺序表oj题:编写函数,合并两个有序数组
目录 题目要求 代码实现 题目要求 nums1 和 nums2 是两个升序的整型数组,另外有两个整数 m 和 n 分别代表 nums1 和 nums2 中的元素个数 要求合并 nusm2 到nums1 中,使合并后的 nums1 同样按升序顺序排列 最终,合并后的数组不应由函数返…...
Proto文件相关知识
百度Apollo的数据结构常用proto文件来定义, proto文件允许你以类似于C结构体或类的方式定义数据结构。你可以在这个文件中定义简单数据类型、枚举、消息类型等。 基于proto文件,Protocol Buffers编译器(protoc)可以自动生成对应的…...
k8s的控制节点不能访问node节点容器的ip地址
master控制node服务器添加容器后,访问不了该node服务器容器的ip,只能在node服务器访问 排查后发现是k8s的master服务器和node节点的网址网段和k8s初始化时提示的ip网段不一致 我之前是192.168.137.50, 实际上master主机期望的是192.168.1.50 解决方案: 1.删除服务器后重建ma…...
鸿蒙OpenHarmony
开源鸿蒙系统编译指南 Ubuntu编译环境配置第一步:Shell 改 Bash第二步:安装Git和安装pip3工具第三步:远程仓配置第四步:拉取代码第五步:安装编译环境第六步:本地编译源码 Windows开发环境配置第一步&#x…...
把白底照片变蓝色用什么软件免费 批量更换证件照底色怎么弄
作为专业的修图师,有时候也会接手证件照修图和换底色工作,这种情况下,需要换底色的照片也许达到上百张。为了提高工作效率,一般需要批量快速修图,那么使用什么软件工具能够给各式不同的照片批量更换背景色呢࿱…...
Spring之生成Bean
Bean的生命周期:实例化->属性填充->初始化->销毁 核心入口方法:finishBeanFactoryInitialization-->preInstantiateSingletons DefaultListableBeanFactory#preInstantiateSingletons用于实例化非懒加载的bean。 1.preInstantiateSinglet…...
笔记整理—linux进程部分(6)进程间通信、alarm和pause
两个进程间通信可能是任何两个进程间的通信(IPC)。同一个进程是在同一块地址空间中的,在不同的函数与文件以变量进程传递,也可通过形参传递。2个不同进程处于不同的地址空间,要互相通信有难度(内存隔离的原…...
Java网络通信—UDP
0.小记 1.udp通信不需要建立socket管道,一边只管发,一边只管收 2.客户端:将数据(byte)打包成包裹(DatagramPacket),写上地址(IP端口),通过快递站&…...
k8s架构,从clusterIP到光电半导体,再从clusterIP到企业管理
clusterIP作为k8s中的服务, 也是其他三个服务的基础 ~]$ kubectl create service clusterip externalname loadbalancer nodeport 客户端的流量到service service分发给pod,pod由控制器自动部署,自动维护 那么问题是service的可用…...
vue框架和uniapp框架区别
文章目录 vue框架和uniapp框架区别一、引言二、Vue.js 概述1、Vue.js 简介1.1、特点 2、适用场景 三、Uni-app 概述1、Uni-app 简介1.1、特点 2、适用场景 四、区别与比较1、跨平台能力2、开发体验3、性能优化4、社区和支持 五、总结 vue框架和uniapp框架区别 一、引言 在前端…...
828华为云征文 | 华为云Flexus云服务器X实例搭建Zabbix网络设备监视系统(Ubuntu服务器运维)
前言 Flexus X实例内嵌智能应用调优算法,性能强悍,基础模式GeekBench单核及多核跑分可达同规格独享型实例的1.6倍,性能模式更是超越多系列旗舰型云主机,为企业业务提供强劲动力。 💼 Flexus X Zabbix:打造…...
JAVA基础-线程(Thread)、多线程(Multi-threaded)
1、知识铺垫 要想了解什么是线程,首先要搞明白线程与进程的区别,并行与并发的区别 1.1 线程与进程 进程:是指⼀个内存中运⾏的应⽤程序,每个进程都有⼀个独⽴的内存空间,⼀个应⽤程序可以同时运⾏多个进程;…...
hystrix微服务部署
目录 一.启动nacos和redis 1.查看是否有nacos和redis 二.开始项目 1.hystrix1工程(修改一下工程的注册名字) 2.运行登录nacos网站查看运行效果(默认密码nacos,nacos) 3.开启第二个项目 hystrix2工程 4.关闭第二个项目 hyst…...
使用百度文心智能体创建多风格表情包设计助手
文章目录 一、智能定制,个性飞扬二、多元风格,创意无限 百度文心智能体平台为你开启。百度文心智能体平台,创建属于自己的智能体应用。百度文心智能体平台是百度旗下的智能AI平台,集成了先进的自然语言处理技术和人工智能技术&…...
【嵌入式裸机开发】智能家居入门3(MQTT服务器、MQTT协议、微信小程序、STM32)
前面已经写了两篇博客关于智能家居的,服务器全都是使用ONENET中国移动,他最大的优点就是作为数据收发的中转站是免费的。本篇使用专门适配MQTT协议的MQTT服务器,有公用的,也可以自己搭建 前言一、项目总览二、总体流程分析1、了解…...
css的背景background属性
CSS的background属性是一个简写属性,它允许你同时设置元素的多个背景相关的子属性。使用这个属性可以简化代码,使其更加清晰和易于维护。background属性可以设置不同的子属性。 background子属性 定义背景颜色 使用background-color属性 格式&#x…...
Cypress自动化测试实战:构建高效的前端测试体系
在快速迭代的软件开发环境中,前端自动化测试是保证代码质量和用户体验的重要手段。Cypress作为一款功能强大的前端自动化测试工具,凭借其丰富的特性、直观的API和高效的测试执行速度,赢得了众多开发者和测试团队的青睐。本文将深入探讨Cypres…...
【YOLO学习】YOLOv2详解
文章目录 1. 概述2. Better2.1 Batch Normalization(批归一化)2.2 High Resolution Classifier(高分辨率分类器)2.3 Convolutional With Anchor Boxes(带有Anchor Boxes的卷积)2.4 Dimension Clusters&…...
windows 录音编码为flv格式时,pcm采样格式
这里使用的是0x3e,转换为二进制: 0 0 1 1 1 1 1 0 前四个字节为3,表示Linear Pcm, 后4个字节1 1 1 0 表示44100HZ采样, 16个bit,单声道。 故,windows 音频采样不支持48000HZ频率...
Qt开发技巧(九)去掉切换按钮,直接传样式文件,字体设置,QImage超强,巧用Qt的全局对象,信号槽断连,低量数据就用sqlite
继续讲一些Qt开发中的技巧操作: 1.去掉切换按钮 QTabWidget选项卡有个自动生成按钮切换选项卡的机制,有时候不想看到这个烦人的切换按钮,可以设置usesScrollButtons为假,其实QTabWidget的usesScrollButtons属性最终是应用到QTabWi…...
51c自动驾驶~合集1
我自己的原文哦~ https://blog.51cto.com/whaosoft/11466109 #HTCL 超过所有视觉方案!HTCL:分层时间上下文问鼎OCC 本文是对ECCV2024接受的文章 HTCL: 的介绍,HTCL在SemanticKITTI基准测试中超过了所有基于相机的方法,甚至在和…...
Star 3w+,向更安全、更泛化、更云原生的 Nacos3.0 演进
作者:席翁 Nacos 社区刚刚迎来了 Star 突破 30000 的里程碑,从此迈上了一个新的阶段。感谢大家的一路支持、信任和帮助! Nacos /nɑ:kəʊs/是 Dynamic Naming and Configuration Service 的首字母简称,定位于一个更易于构建云原…...
PHP魔幻(术)方法
PHP中的魔幻方法,也被称为魔术方法(Magic Methods),是一组具有特殊功能的方法。这些方法在PHP中有固定的名称,并且会在特定的时机自动被PHP调用,而无需开发者显式调用。它们通常用于执行一些特殊的操作&…...
VS开发 - 静态编译和动态编译的基础实践与混用
目录 1. 基础概念 2. 直观感受一下静态编译和动态编译的体积与依赖项目 3. VS运行时库包含哪些主要文件(从VS2015起) 4. 动态库和静态库混用的情况 5. 感谢清单 1. 基础概念 所谓的运行时库(Runtime Library)就是WINDOWS系统…...
什么是电商?/网页seo是什么意思
在CSS的第一篇博客中看到了CSS带给我们的不一样的视觉体验,本篇博客将继续学习CSS,让我们一起在它的基本语法中领悟它的强大之处。一.选择器的类型1.标记选择器一个HTML页面由很多不同的标记组成,而CSS标记选择器就是声明哪些标记采用哪种CSS…...
简单的网页代码实例/seo优化sem推广
2019独角兽企业重金招聘Python工程师标准>>> 经典文章推荐:1.关于Kafka配额的讨论(1) Kafka自0.9.0.0版本引入了配额管理(quota management),旨在broker端对clients发送请求进行限流(throttling)。目前Kafka支持两大类配额管理: 网…...
全渠道营销案例/长沙好的seo外包公司
六一即将到来,作为一个儿童与大龄儿童都心心念念热度极高的重点节日,儿童节自然也是营销榜单前几名。无论是母婴还是食品,是服饰还是美妆,都免不了要蹭一波儿童节的热度,有的主打"可爱一万年"希望所有人都能…...
济南模板网站制作/网络运营推广
这篇文章纯记录:XML一,xml简介二,什么是 XML三,XML 和 HTML 之间的差异四,xml树结构示例XML 文档形成一种树结构五,xml语法六,xml元素xml命名规则七,xml HTML一,xml简介 …...
做网站哪里需要用钱/成人厨师短期培训班
load方法中能实现什么? 我们经常会有一些需求:让某方法的执行先于main方法。比如要hook某个系统类的方法(hook UIViewController的viewWillAppear和viewDidDisappear通过AOP的方式实现埋点功能),或者做一些初始化操作。…...
公司做竞拍网站的收入怎么报税/现在什么app引流效果好
2019独角兽企业重金招聘Python工程师标准>>> 学习阶段可以安装一个windows版本的mongodb,尽快把mongodb服务跑起来,让程序连上。mongodb的安装、运行、基础命令的知识,可以参考 菜鸟教程mongodb spring mongodb 依赖版本ÿ…...