吴恩达:机器学习的六个经典核心算法永不过时。随着人工智能技术爆炸增长,吴恩达团队表示,机器学习领域有些经典的算法在历史的演变中经得起时间的考验。(线性回归、逻辑回归、决策树、K-Means聚类、神经网络、梯度下降)
-
4-1机器学习篇(分享各种算法的优点缺点及其应用场景\算法竞赛实战优化的一些干货(数据处理|特征工程|参数搜索|模型堆叠))
-
4-2深度学习篇(分享各种算法的优点缺点及其应用场景\算法竞赛实战优化的一些干货(数据处理|超参数|优化器|模型堆叠))
如果你想深入了解经典机器学习算法的原理及其代码实现,那么这个项目将非常适合你。这个项目是一个集合了传统机器学习算法和深度学习算法的库。它包括线性回归,逻辑回归,决策树,K-means,感知机网络等算法。项目的目标是提供一个易于使用,同时又具有高度可定制性的机器学习库。通过经典实现回归,分类,聚类等任务。手写算法的必要性在于深入理解算法的原理和实现细节,从而能够更好地应用和调优算法。
项目的结构清晰且易于理解。每个算法都有一个单独的文件夹,文件夹的名字就是算法的名称。每个文件夹下都有两个Python文件:
(模型名称)_main_run.py:这个文件主要负责数据的加载,预处理,模型的训练,预测以及结果的展示。它为用户提供了一个方便的使用界面,用户可以通过这个文件快速地使用该算法。
(模型名称).py:这个文件包括数据清洗,异常筛选,特征筛选,特征标准化。最主要是算法的核心实现。它包括模型的训练和预测逻辑的功能。这个文件为那些希望深入了解算法工作原理的用户提供了详细的参考和指导。
使用这个库非常简单。首先,你需要安装所需的依赖项。然后,你可以直接运行(模型名称)_main_run.py文件来使用该算法。
例如,如果你想使用线性回归算法,你可以运行LinearRegression_main_run.py文件就可以得到相关算法对波士顿房价数据集的预测结果。
如何将线性回归运用到自己的业务场景中去呢?
1.确定业务的痛点,比如现有的方式得到业务数据在人力,物力,耗时耗力。需要提前知道某个业务数据值并且该数据值对未来的决策有深远的影响。
2.像上面的波士顿房价有(住宅用地比例、城镇中非商业用地的所占比例、是否处于查尔斯河边、一氧化氮浓度 、每栋住宅的房间数……)这些相关特征,结合自己场景需要预测的值进行特征采集,采集的特征和我们需要预测的值相关性越高越好,还可以使用特征结合交叉的方式生成重要特征。需要注意的是线性回归模型需要解决多重共线性的问题简单来说有些特征的数据变化是重复的就可以去除。
3.特征收集完成可以做一些数据清洗等,数据异常值填充,特征归一化处理等。
4.划分数据,可以随机划分,分层划分。划分的训练集和测试集根据自己的业务场景进行划分,推荐(8:2)。
5.进行算法的逻辑构建,像线性回归,常用的方法使用最小二乘法来得到每个特征的权重和偏置,还可以使用梯度下降法求解等。(前提是把数学理论知识打好基础,这样方便我们做好后续的优化工作)。
6.看我们的测试数据上的预测值是否满足业务要求(不同业务场景会有不同的评价指标高低比如r2,mae,mse等),如果不满足,需要持续优化预测结果,最好是从数据上进行优化。
7.模型部署上线,注意只要业务数据有大的波动模型就不会适用,需要进行模型的迭代,以增强泛华能力。
以上,只是举了一个基本的流程,不同业务和场景可能会有一点差异。
机器学习算法通过应用数学理论来解决各种业务场景中的问题,并寻找最优解来满足需求。数学理论提供了理论基础和优化框架,帮助我们发展和改进机器学习算法,从而在现实世界中应用其效果,解决业务痛点。主要讲 1、各个算法的优缺点及应用场景 2、竞赛top方案中常用的策略和技巧,以及工作中的优化思路等。
有监督学习算法:
决策树(Decision Trees):决策树以树形结构表示决策规则,并通过数据的特征进行分支选择。优点包括易于解释和理解,能够处理非线性问题;缺点是容易过拟合。应用场景:分类和回归问题,如客户信用评分、疾病诊断等。
逻辑回归(Logistic Regression):逻辑回归用于二分类或多分类,通过将线性权重组合应用于Sigmoid函数来预测概率。优点包括易于实现和解释,计算效率高;缺点是对特征工程敏感。应用场景:金融风控、医疗诊断等。
支持向量机(Support Vector Machines):SVM通过在高维空间中找到最优超平面,用于分类和回归问题。优点包括高维空间中的强大分类能力,鲁棒性好;缺点是对大规模数据集和噪声敏感。应用场景:图像分类、文本分类等。
随机森林(Random Forest):随机森林是一种基于决策树的集成学习算法,通过投票或平均预测结果来提高模型性能。优点包括能够处理高维数据、减少过拟合,对特征选择不敏感;缺点是容易过拟合。应用场景:医学诊断、金融风控等。
K最近邻算法(K-Nearest Neighbors, KNN):KNN是一种基于实例的学习算法,通过计算新样本与训练集中各个样本的距离来进行分类或回归。优点是简单易用,无需训练;缺点是对于高维数据效果不佳、对距离度量的选择敏感。应用场景:基于位置的推荐系统、图像识别等。
梯度提升机(Gradient Boosting Machines, GBM):GBM是一种集成学习算法,通过合并多个弱学习器来构建一个强学习器,主要有(lightgbm\xgboost\catboost)。优点包括对复杂关系建模、鲁棒性较好;缺点是训练时间较长。应用场景:搜索排名、异常检测、数据科学比赛top方案常用。
无监督学习算法:
聚类算法(Clustering):聚类算法将数据划分为不同的组别,使组内的数据相似度最大化,并使组间的相似度最小化。常见的算法包括K-means、层次聚类等。优点包括发现隐藏的模式、用于生成新的特征;缺点是对初始值敏感。应用场景:市场细分、社交网络分析等。
主成分分析(Principal Component Analysis,PCA):PCA通过降维将高维数据映射到低维,保留最大方差的特征。优点包括降低维度、可视化数据;缺点是无法处理非线性关系。应用场景:图像压缩、数据预处理等。
关联规则学习(Association Rule Learning):关联规则学习用于发现数据中的频繁项集和关联规则。优点包括发现数据中的隐藏关系、用于推荐系统等;缺点是可能生成冗余和无用的规则。应用场景:购物篮分析、交叉销售推荐等。
实战优化策略干货分享!!!:
数据预处理:
特征缩放:将数值特征缩放到相似的范围,如使用标准化(例如,Z-score归一化)或归一化(例如,最小-最大缩放)。在许多优化算法中,如梯度下降法,特征的尺度差异可能导致学习过程收敛缓慢。将特征归一化可以加快收敛速度,从而提高算法的效率。特征归一化可以减少异常值对算法的影响。如果某个特征具有异常值(比如一个特别大的值),它可能会对模型的训练过程产生较大的影响。通过归一化,异常值的影响可以被减小。不是所有的机器学习算法都要求进行特征归一化。例如,决策树和随机森林等树形结构的算法通常不需要进行特征归一化。
异常值处理:检测和处理异常值,如使用截断或替代方法来处理异常数据点。通过设定阈值来限制变量的最大或最小值,将异常值替换为数据集的平均值、中位数或者其他合适的统计量需要根据具体的数据特点以及业务需求来进行选择。在进行异常值处理时,应充分理解数据背后的业务含义,并根据实际情况选择合适的方法。
特征工程:
通过手动构造新的特征:或者将原始特征变换为更有用的表示形式,来提供更丰富的信息,交叉特征,需要两个特征的组合才能对标签有相关性。特征降维PCA算法,降低模型复杂度。 引入领域知识:结合领域专业知识,将先验信息融入模型中,提高模型的表现。 加权样本:对于不平衡数据集,赋予少数类别更高的权重,使模型更加关注这些样本。
模型训练和集成:
KFold交叉验证:KFold交叉验证将数据集分成K个子集,每个子集都会被用作训练集和验证集。这意味着每个样本都会被用于模型的训练和验证,从而最大程度地利用了数据集的信息更好地评估模型的泛化能力。KFold交叉验证可以帮助选择合适的模型参数。通过交叉验证的迭代过程,可以尝试不同的参数组合,并根据验证集的性能选择最佳的参数。这样可以减少对单个训练集产生的过拟合或欠拟合的风险。
堆叠集成:将多个模型集成在一起,选择基本模型时,应该尽量选择不同类型和结构的模型,以便获得多样性。例如,可以组合线性模型、树模型、神经网络等,这样可以使得不同模型在捕获数据模式上具有互补性,提高最终的集成性能。通过投票、加权平均值等方式来做出最终预测。在比赛最后才考虑进行模型堆叠。
参数调优:
实战重点考虑贝叶斯搜索方式 网格搜索:通过遍历参数空间来寻找最佳参数组合,使用交叉验证来评估性能。 随机搜索:在指定的参数范围内随机选择参数组合并进行评估,适用于参数空间较大的情况。 贝叶斯搜索:常见的贝叶斯搜索方式包括高斯过程贝叶斯优化(Gaussian Process Bayesian Optimization)、随机森林贝叶斯优化(Random Forest Bayesian Optimization)、Bayesian Optimization with Tree-structured Parzen Estimator (TPE) 。但是这里重点推荐optuna搜索,我愿称它为最强搜索神器。
高效性:Optuna 可以在相对短的时间内找到较优的超参数组合,尤其适用于大型参数空间和高维参数空间的场景。
灵活性:Optuna 支持多种优化算法,包括高斯过程、随机森林和 TPE 等,可以根据实际问题选择合适的算法。
并行性:Optuna 可以轻松地实现并行运行,从而加速超参数优化的过程。
Optuna 是一个功能强大的超参数优化框架,特别适用于复杂的参数空间和大规模的机器学习模型。
有监督学习算法:
多层感知机(Multilayer Perceptron, MLP):MLP是一种基于神经网络的有监督学习算法,具有多个隐层的前馈神经网络结构。优点包括能够学习非线性关系、适用于复杂模式识别;缺点是对超参数敏感,容易过拟合。应用场景:语音识别、自然语言处理等。
卷积神经网络(Convolutional Neural Networks,CNN):CNN是一种特殊的神经网络,通过卷积和池化等操作,有效处理图像和时序数据。优点包括共享权重和局部连接、适用于图像识别和计算机视觉任务;缺点是对于大规模数据集和高维数据较依赖。应用场景:图像分类、目标检测等。
循环神经网络(Recurrent Neural Networks,RNN):RNN是一种具有循环连接的神经网络,可以处理序列和时序数据。优点包括对时序关系建模、适用于语言模型和语音识别;缺点是处理长期依赖关系困难、训练慢。应用场景:语言生成、机器翻译等。
长短时记忆网络(Long Short-Term Memory,LSTM):LSTM是一种特殊的RNN,通过门控机制有效地解决了长期依赖问题。优点包括处理长期依赖关系、适用于文本生成和语音识别;缺点是训练时间较长。应用场景:文本生成、情感分析等。
注意力机制(Attention Mechanism):注意力机制是一种通过动态地对序列中重要元素进行加权来提高模型性能的机制。优点包括对复杂关系建模、能够处理变长输入;缺点是计算复杂度较高。应用场景:机器翻译、图像描述生成等。
无监督学习算法:
生成对抗网络(Generative Adversarial Networks,GAN):GAN是一种由生成器和判别器组成的框架,通过对抗训练来生成逼真的数据。优点包括生成真实数据样本、用于图像生成和数据合成;缺点是训练不稳定,难以衡量生成质量。应用场景:图像生成、数据增强等。
变分自编码器(Variational Autoencoders,VAE):VAE是一种基于自编码器的生成模型,通过编码器和解码器学习数据的潜在分布。优点包括生成具有连续表示的样本、用于图像生成和数据重建;缺点是对于复杂数据分布的模拟困难。应用场景:图像生成、异常检测等。
实战优化策略干货分享!!!:
数据预处理:
图像数据: 1读取和解码图像文件,如JPEG、PNG等格式。 2缩放和裁剪图像,使其适应模型输入的大小。 3标准化图像数据,将像素值归一化到[0, 1]或[-1, 1]的范围内。 4数据增强,如旋转、平移、缩放、翻转等变换操作,以及亮度、对比度、饱和度等颜色变换操作。
文本数据: 1文本分词、建立词汇表、构建索引,将文本转换为数字表示(例如使用单词嵌入)。 2序列填充,将不同长度的文本序列填充为相同长度,以便于模型处理。 3标准化文本数据,如转换为小写字母、去除标点符号等。 4数据增强在文本数据中相对较少使用,但可以尝试一些方式,增强小样本的数量、随机替换、插入或删除单词、反义、并归以及简单的语言模型生成等。
结构化数据: 1数据清洗,包括处理缺失值、异常值等。 2特征标准化,如使用Z-score标准化或min-max标准化。 3类别特征编码,如独热编码(One-Hot Encoding)或标签编码(Label Encoding)。 4数据增强方式:数据增强的方式较少,可以考虑在无监督学习或生成对抗网络中使用。在时间序列数据中可以将序列以等差的方式分成两份或者多份。
语音数据: 1音频加载和解码,将音频文件转换为波形数据。 2音频预处理,如去噪、降噪、语音增强等。 3音频特征提取,如使用梅尔频率倒谱系数(Mel-Frequency Cepstral Coefficients,MFCC)等。 4音频数据增强的方式较多,例如随机添加噪声、改变音调、速度变化、时域和频域扩展等。
模型训练的各种技巧:
1.一般来说,越大的batch-size使用越大的学习率,较大的批量大小可以提供更多的样本信息、更准确的梯度估计,并且可以稳定训练过程。这使得我们可以使用较大的学习率,从而在训练的每个迭代中更快地前进并更快地收敛。
相反,较小的批量大小可能会导致梯度估计不稳定,并且噪音较大。由于每个小批量只包含有限的样本,无法代表整个数据集的分布情况。因此,在这种情况下,较小的学习率可以有助于减小梯度更新的幅度,确保训练过程更加稳定,并减少在样本间波动较大时的错误。
2.权重初始化相比于其他的trick来说在平常使用很频繁。Xavier初始化适用于使用普通激活函数(如tanh、sigmoid)的情况下,而He初始化则适合于使用ReLU激活函数的情况。 He初始化采用高斯分布进行初始化,其标准差为 (\sqrt{\frac{2}{n}}),其中 (n) 为上一层神经元的数量。相比之下,Xavier初始化使用的是更加平衡的高斯分布,在普通激活函数情况下的标准差为 (\sqrt{\frac{1}{n}})。
这两种初始化方法可以保证在开始训练时,权重值的分布不会过于集中或分散,有助于避免梯度消失或梯度爆炸的问题,从而有助于训练过程的稳定性。因此,权重初始化是十分重要的一环,尤其是对于深度神经网络的训练来说。
3.dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃,这一过程是随机的。在随机梯度下降算法中,每一个mini-batch都在训练不同的网络,因为dropout导致网络结构的随机变化。
Dropout类似于bagging ensemble减少variance。它通过投票的方式来减少模型的方差。一般来说,我们会在全连接层部分使用dropout,而在卷积层则不使用。这是因为在全连接层中,参数数量较多,使用dropout有助于减少过拟合风险;而卷积层的参数数量较少,通常不需要使用dropout,因为加入dropout对模型的泛化能力影响有限。
4.多模型融合也是提高模型泛化能力,预测准确度的一种方式。通过不同的网络模型得到的结果进行随机加权求和,平均投票法等,但不建议消耗资源很大。
5.优化算法还是是adam和SGD+monmentum。在小数据集上,一些高级优化算法(如Adam、Adadelta等)的实验效果可能不如简单的随机梯度下降(SGD),因为这些算法可能在小数据集上过拟合的风险较大。虽然SGD的收敛速度可能较慢,但最终的结果通常比较理想。进行实验时,你也可以尝试先使用Ada系列优化算法,并在快要收敛时转换成SGD继续训练,这种方法也可能会带来模型性能的提升。Adadelta在分类问题上效果比较好,而Adam在生成问题上效果较好。尽管Adam收敛速度较快,但得到的解往往不如SGD+Momentum得到的解好。在不考虑时间成本的情况下,使用SGD可能是更好的选择。
6.梯度归一化表示在计算得到的梯度后,将其除以mini-batch的大小来控制梯度大小。
7.在小数据集上,dropout和SGD(随机梯度下降)的组合通常可以有效防止过拟合,并提升模型效果。对dropout的使用位置需要谨慎,在RNN中,建议放置在输入到RNN和RNN到输出的位置。
8.在训练神经网络时,推荐使用ReLU或tanh等激活函数来代替sigmoid,因为在sigmoid函数的输入范围之外,梯度容易消失。
9.对于LSTM的遗忘门的偏置,推荐使用1.0或更大的值进行初始化。
10.针对超参数调优,learning rate是最关键的参数,推荐尝试 cosine learning rate 和 cyclic learning rate 等方法。在模型表现已经不错时,可以考虑数据增广和改损失函数。
11.从实战经验来说在小数据集上结合随机梯度下降、momentum、学习率调整策略(1.ReduceLROnPlateau;2.Cosine Annealing ;3. StepLR)是一个可行的、性能较好的优化组合,当然也可以根据具体情况进行调整和尝试其他的优化算法。
-
https://farid.one/kaggle-solutions/ 这个网站收录了从 2010 年 Kaggle 诞生至今几乎全部的竞赛优胜解决方案。并且每当新比赛结束,网站都会立即更新,上传最新的解决方案,多看看大佬的思路对自己的工作和竞赛会有帮助的。
-
这里有一个通用建议,在拿到一个竞赛项目的时候,不要忙着用什么很厉害的算法,多可视化数据分布,看看数据的特征的情况,多挖掘一些高效的特征,找找数据的规律。不要使用容易过拟合的算法,有些时候A榜排名很高,B榜排名会差很大。比如在kaggle的一个金融时序比赛中,日本一个选手就只构建了一些特征,和线性回归模型就拿了第一名。所以建议,深刻把常用算法原理搞懂,找到自己对数据的feeling。相信一定会成为一名优秀的数据科学家。
1.在运行任何模型之前,请确保你的数据已经正确地加载和预处理。
2.对于深度学习模型,可能需要较长的训练时间,取决于你的数据大小和硬件配置。
3.请确保你的环境满足所有依赖项的要求。
4.如果相要知道算法的原理,需要掌握一定的线性代数、概率论与统计、高等数学、机器学习基本原理、一定的python代码基础能力。
我们欢迎任何形式的贡献,包括但不限于:新的算法实现,bug修复,性能优化,文档改进等。你可以通过Github仓库进行贡献,我们会在收到后尽快处理。