当前位置: 首页 > 后端技术 > Python

Python机器学习算法入门指南(全)

时间:2023-03-26 19:22:49 Python

前言机器学习作为人工智能领域的核心组成部分,是计算机程序通过学习数据经验来优化自身算法并产生相应“智能”建议的过程和决定。机器学习的一个经典定义是:如果计算机程序在任务T中的性能(由P衡量)随着经验E的提高而提高,则称计算机程序从经验E中学习关于某类任务T和性能度量P。机器学习简介机器学习是计算机学习根据数据分布建立概率和统计模型,并利用这些模型对数据进行分析和预测的方法。根据学习数据分布方式的不同,主要可以分为有监督学习和无监督学习:1.1有监督学习从有标签的数据(x为变量特征空间,y为标签),通过选择的模型和确定的学习策略,然后使用合适的算法计算和学习最优模型,并使用模型进行预测的过程。根据模型预测结果Y的有限值或无限值,可进一步分为分类模型或回归模型;1.2无监督学习:从未标记的数据(x为变量特征空间),通过选定的模型和确定的学习策略,然后使用合适的算法计算学习最优模型,并利用模型发现统计规律或内在数据的结构。根据应用场景可分为聚类、降维、关联分析等模型。2机器学习建模过程2.1定义业务问题定义业务问题是机器学习的前提。这里,需要抽象出解决实际业务问题的方法:需要学习什么样的数据作为输入,以什么样的模型做决策为目标作为输出。(比如一个简单的新闻分类问题场景是学习现有的新闻及其类别标签数据,得到一个文本分类模型,用该模型预测每天新增新闻的类别,从而将其分类到每个新闻中channel.)2.2数据选择:收集和输入数据决定了机器学习结果的上限,算法只是尽可能接近这个上限。这意味着数据的质量决定了模型的最终效果。在实际工业应用中,算法通常只占一小部分。工程师的大部分工作是查找数据、提炼数据和分析数据。数据选择需要注意:①数据代表性:代表性差的数据会导致模型拟合效果不佳;②数据时间范围:如果监督学习的特征变量X和标签Y与时间序列相关,则需要明确数据的时间窗口,否则可能导致数据泄露,即存在和利用的现象因果关系反转的特征变量。(比如预测明天会不会下雨,但是训练数据包括明天的温度和湿度);③数据业务范围:明确与任务相关的数据表范围,避免遗漏代表性数据或引入大量无关数据作为噪声;2.3特征工程:数据预处理和特征提取特征工程就是将原始数据转化为模型可用的特征。按技术手段一般可分为:①数据预处理:缺失值/异常值处理、数据离散化、数据标准化等;②特征提取:特征表示、特征推导、特征选择、特征降维等;2.3.1数据预处理outlierprocessing采集的数据可能由于人为或自然因素引入异常值(噪声),对模型学习产生干扰。通常需要处理人为引起的异常值,通过业务/技术手段(如3σ准则)确定异常值,然后通过(python,正则表达式匹配)等方法过滤异常信息,删除或替换值根据业务情况。缺失值处理对数据的缺失部分进行补齐,不做合并业务处理或删除。根据缺失率和处理方式分为以下几种情况:①缺失率高,可结合业务直接删除特征变量。经验可以加一个bool类型的变量特征来记录字段缺失,缺失记录为1,非缺失记录为0;②缺失率低,可以结合业务使用一些缺失值填充方法,比如pandas的fillna方法,训练随机森林模型预测缺失值的填充;③不处理:随机森林、xgboost、lightgbm等一些模型可以处理缺失数据,不需要对缺失数据做任何处理。数据离散化数据离散化可以减少算法的时间和空间开销(不同的算法会有所不同),并且可以使特征更具业务可解释性。离散化就是将连续的数据分割成离散的区间。分割的原则包括等距、等频等方法。数据标准化数据的每个特征变量的维度差异很大。数据标准化可以消除不同组件维度差异的影响,加快模型收敛的效率。常用的方法有:①min-max标准化:将取值范围缩放到(0,1),但不改变数据分布。max是样本的最大值,min是样本的最小值。②z-score标准化:将取值范围缩放到接近0,处理后的数据符合标准正态分布。u是均值,σ是标准差。2.3.2特征提取特征表示数据需要转换成计算机可以处理的数值形式。如果数据是图像数据,需要转换成RGB三维矩阵表示。字符数据可以用多维数组表示,包括Onehot单热编码表示、word2vetor分布式表示、bert动态编码等;特征推导的基本特征对样本信息的表达有限,可以辅以从特征中衍生出新含义的特征。特征推导是对已有的基本特征的含义进行一定的处理(聚合/转换等)。例如12个月的工资可以处理:平均月薪、最高工资等;转换方法是指字段之间的加减乘除。比如可以处理12个月的工资:工资收入与支出的比例,差额等;②使用特征衍生工具:如Featuretools等;featureselectionfeatureselection筛选出重要的特征,丢弃不重要的特征。特征选择方法一般分为三类:①过滤法:根据特征的散度或相关性指标,对每个特征进行打分后选择,如方差验证、相关系数、IV值、卡方检验、信息获得。②打包法:每次选择一些特征对模型进行迭代训练,根据模型的预测效果得分选择特征。③Embedding法:使用一些模型进行训练,得到每个特征的权重系数,按照权重系数从大到小选择特征,比如XGBOOST特征重要性选择特征。特征降维如果特征选择后的特征数量仍然过多,这种情况下往往会出现数据样本稀疏、距离计算困难的问题(称为“维数灾难”),可以通过特征降维来解决.常用的降维方法有:主成分分析(PCA)、线性判别分析(LDA)等。2.4模型训练模型训练是选择模型学习数据分布的过程。这个过程还需要根据训练结果调整算法的(hyper)参数,使结果更好。2.4.1数据集划分在训练模型之前,一般将数据集划分为训练集和测试集,训练集又可以细分为训练集和验证集,以评估模型的泛化能力。①训练集(trainingset):用来运行学习算法。②开发验证集(developmentset)用于调整参数、选择特征和优化其他算法。常用的验证方法有交叉验证、留一法等;③测试集(testset)用于评价算法的性能,但不会相应改变学习算法或参数。2.4.2模型选择常见的机器学习算法如下:模型选择取决于数据情况和预测目标。可以训练多个模型,可以根据实际效果选择性能更好的模型或者模型融合。2.4.3模型训练训练过程可以通过参数调优来优化,这是一个基于数据集、模型和训练过程细节的经验过程。超参数优化需要基于对算法原理的理解和经验,此外还有自动调参技术:网格搜索、随机搜索、贝叶斯优化。2.5模型评估标准模型评估:模型学习的目的是使学习到的模型对新数据具有良好的预测能力(泛化能力)。现实中,模型的训练数据学习程度和泛化能力通常通过训练误差和测试误差来评价。2.5.1评价指标①评价分类模型:常用的评价标准有准确率P、召回率R、两者的调和平均F1-score等,取值由混淆对应的统计数计算得出matrix:precision率是指分类器正确分类的正样本数(TP)与分类器预测的正样本数(TP+FP)的比值;召回率是指被分类器正确分类的正样本数(TP)占所有正样本的比例(TP+FN)。F1-score是准确率P和召回率R的调和平均值:②评估回归模型:常用的评估指标有RMSE均方根误差等。反馈是预测值和实际值之间的拟合。③评价聚类模型:可以分为两种,一种是将聚类结果与一个“参考模型”的结果进行比较,称为“外部指标”(externalindex):如兰德指标、FM指标,ETC。;另一种是不使用任何参考模型直接检验聚类结果,称为“内部指标”(internalindex):如紧凑性、分离性等。2.5.2模型评价与优化根据指标性能训练集和测试集,分析原因,优化模型。常用的方法有:2.6模型决策是机器学习的最终目标,对模型预测信息进行分析和解释,并应用于实际工作领域。需要注意的是,工程是结果导向的,模型上线运行的效果直接决定了模型的成败,不仅包括它的准确率、误差等,还有它的运行速度(时间复杂度),资源消耗(空间复杂度),稳定性综合考虑。3Python实战#这是一个简单的demo。利用鸢尾植物的数据,训练鸢尾分类模型,通过模型预测识别品种。importpandasaspd#Loaddatasetdata=load_iris()df=pd.DataFrame(data.data,columns=data.feature_names)df.head()#使用pandas_profiling库分析数据importpandas_profilingdf.profile_report(title='iris')#划分标签y,特征xy=df['class']x=df.drop('class',axis=1)#划分训练集,测试集fromsklearn.model_selectionimporttrain_test_splittrain_x,test_x,train_y,test_y=train_test_split(x,y)#模型训练fromxgboostimportXGBClassifier#selectmodelxgb=XGBClassifier(max_depth=1,n_estimators=1)xgb.fit(train_x,train_y)fromsklearn.metricsimportprecision_score,recall_score,f1_score,accuracy_core,ro,aucdefmodel_metrics(model,x,y,pos_label=2):"""评估函数"""yhat=model.predict(x)result={'accuracy_score':accuracy_score(y,yhat),'f1_score_macro':f1_score(y,yhat,average="macro"),'precision':precision_score(y,yhat,average="macro"),'recall':recall_score(y,yhat,average="macro")}返回结果#模型评估结果print("TRAIN")print(model_metrics(xgb,train_x,train_y))print("TEST")print(model_metrics(xgb,test_x,test_y))#模型预测xgb.predict(test_x)