您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 汽车理论 > 机器学习应用中的常见问题分类问题你了解多少
机器学习应用中的常见问题分类问题你了解多少分类问题是机器学习应用中的常见问题,而二分类问题是其中的典型,例如垃圾邮件的识别。本文基于UCI机器学习数据库中的银行营销数据集,从对数据集进行探索,数据预处理和特征工程,到学习模型的评估与选择,较为完整的展示了解决分类问题的大致流程。文中包含了一些常见问题的处理方式,例如缺失值的处理、非数值属性如何编码、如何使用过抽样和欠抽样的方法解决分类问题中正负样本不均衡的问题等等。1.数据集选取与问题定义本次实验选取UCI机器学习库中的银行营销数据集(BankMarketingDataSet:)。这些数据与葡萄牙银行机构的直接营销活动有关。这些直接营销活动是以电话为基础的。通常来说,银行机构的客服人员至少需要联系一次客户来得知客户是否将认购银行的产品(定期存款)。因此,与该数据集对应的任务是分类任务,而分类目标是预测客户是(yes)否(no)认购定期存款(变量y)。数据集包含四个csv文件:1)bank-additional-full.csv:包含所有的样例(41188个)和所有的特征输入(20个),根据时间排序(从2008年5月到2010年9月);2)bank-additional.csv:从1)中随机选出10%的样例(4119个);3)bank-full.csv:包含所有的样例(41188个)和17个特征输入,根据时间排序。(该数据集是更老的版本,特征输入较少);4)bank.csv:从3)中随机选出10%的样例4119个)。提供小的数据集(bank-additional.csv和bank.csv)是为了能够快速测试一些计算代价较大的机器学习算法(例如SVM)。本次实验将选取较新的数据集,即包含20个特征量的1)和2)。2.认识数据2.1数据集输入变量与输出变量数据集的输入变量是20个特征量,分为数值变量(numeric)和分类(categorical)变量。具体描述见数据集网站。输出变量为y,即客户是否已经认购定期存款(binary:yes,no)。2.2原始数据分析首先载入数据,然后使用info()函数和describe()函数查看数据集的基本信息。3.数据预处理与特征工程3.1缺失值处理从2.2节给出的数据集基本信息可以看出,数值型变量(int64和float64)没有缺失。非数值型变量可能存在unknown值。使用如下代码查看字符型变量unknown值的个数。缺失值处理通常有如下的方法:对于unknown值数量较少的变量,包括job和marital,删除这些变量是缺失值(unknown)的行;如果预计该变量对于学习模型效果影响不大,可以对unknown值赋众数,这里认为变量都对学习模型有较大影响,不采取此法;可以使用数据完整的行作为训练集,以此来预测缺失值,变量housing,loan,education和default的缺失值采取此法。由于sklearn的模型只能处理数值变量,需要先将分类变量数值化,然后进行预测。本次实验使用随机森林预测缺失值,代码如下:deffill_unknown(data,bin_attrs,cate_attrs,numeric_attrs):#fill_attrs=[education,default,housing,loan]fill_attrs=[]foriinbin_attrs+cate_attrs:ifdata[data[i]==unknown][y].count()ain_data=data[data[i]!=unknown]trainY=train_data[i]trainX=train_data.drop(fill_attrs,axis=1)test_data[i]=train_predict_unknown(trainX,trainY,testX)data=pd.concat([train_data,test_data])returndata3.2分类变量数值化为了能使分类变量参与模型计算,我们需要将分类变量数值化,也就是编码。分类变量又可以分为二项分类变量、有序分类变量和无序分类变量。不同种类的分类变量编码方式也有区别。3.2.1二分类变量编码根据上文的输入变量描述,可以认为变量default、housing和loan为二分类变量,对其进行0,1编码。代码如下:defencode_bin_attrs(data,bin_attrs):foriinbin_attrs:data.loc[data[i]==no,i]=0data.loc[data[i]==yes,i]=1returndata3.2.2有序分类变量编码根据上文的输入变量描述,可以认为变量education是有序分类变量,影响大小排序为illiterate,basic.4y,basic.6y,basic.9y,high.school,professional.course,university.degree,变量影响由小到大的顺序编码为1、2、3、...,。代码如下:defencode_edu_attrs(data):values=[illiterate,basic.4y,basic.6y,basic.9y,high.school,professional.course,university.degree]levels=range(1,len(values)+1)dict_levels=dict(zip(values,levels))forvinvalues:data.loc[data[education]==v,education]=dict_levels[v]returndata3.2.3无序分类变量编码根据上文的输入变量描述,可以认为变量job,marital,contact,month,day_of_week为无序分类变量。需要说明的是,虽然变量month和day_of_week从时间角度是有序的,但是对于目标变量而言是无序的。对于无序分类变量,可以利用哑变量(dummyvariables)进行编码。一般的,n个分类需要设置n-1个哑变量。例如,变量marital分为divorced、married、single,使用两个哑变量V1和V2来编码。maritalV1V2divorced00married10single01Python的pandas包提供生成哑变量的函数,故代码如下:defencode_cate_attrs(data,cate_attrs):data=encode_edu_attrs(data)cate_attrs.remove(education)foriincate_attrs:dummies_df=pd.get_dummies(data[i])dummies_df=dummies_df.rename(columns=lambdax:i+_+str(x))data=pd.concat([data,dummies_df],axis=1)data=data.drop(i,axis=1)returndata3.3数值特征预处理3.3.1连续型特征离散化将连续型特征离散化的一个好处是可以有效地克服数据中隐藏的缺陷:使模型结果更加稳定。例如,数据中的极端值是影响模型效果的一个重要因素。极端值导致模型参数过高或过低,或导致模型被虚假现象迷惑,把原来不存在的关系作为重要模式来学习。而离散化,尤其是等距离散,可以有效地减弱极端值和异常值的影响。通过观察2.2节的原始数据集的统计信息,可以看出变量duration的最大值为4918,而75%分位数为319,远小于最大值,而且该变量的标准差为259,相对也比较大。因此对变量duration进行离散化。具体地,使用pandas.qcut()函数来离散化连续数据,它使用分位数对数据进行划分(分箱:bining),可以得到大小基本相等的箱子(bin),以区间形式表示。然后使用pandas.factorize()函数将区间转为数值。data[bining_attr]=pd.qcut(data[bining_attr],bining_num)data[bining_attr]=pd.factorize(data[bining_attr])[0]+13.3.3规范化由于不同变量常常使用不同的度量单位,从数值上看它们相差很大,容易使基于距离度量的学习模型更容易受数值较大的变量影响。数据规范化就是将数据压缩到一个范围内,从而使得所有变量的单位影响一致。foriinnumeric_attrs:scaler=preprocessing.StandardScaler()data[i]=scaler.fit_transform(data[i])3.3.4持久化预处理后的数据由于需要训练模型预测unknown值,预处理过程的时间代价比较大。因此将预处理后的数据持久化,保存到文件中,之后的学习模型直接读取文件数据进行训练预测,无须再预处理。defpreprocess_data():input_data_path=../data/bank-additional/bank-additional-full.csvprocessed_data_path=../processed_data/bank-additional-full.csvprint(Loadingdata...)data=pd.read_csv(input_data_path,sep=;)print(Preprocessingdata...)numeric_attrs=[age,duration,campaign,pdays,previous,emp.var.rate,cons.price.idx,cons.conf.idx,euribor3m,nr.employed,]bin_attrs=[default,housing,loan]cate_attrs=[poutcome,education,job,marital,contact,month,day_of_week]data=shuffle(data)data=fill_unknown(data,bin_attrs,cate_attrs,numeric_attrs)data.to_csv(processed_data_path,index=False)需要注意的是,由于原始数据是有序的(以时间为序),读取原始数据后,需要将其随机打乱,变成无序数据集。这里使用sklearn.utils包中的shuffle()函数进行打乱。一些情况下原始数据维度非常高,维度越高,数据在每个特征维度上的分布就越稀疏,这对机器学习算法基本都是灾难性(维度灾难)。当我们又没有办法挑选出有效的特征时,需要使用PCA等算法来降低数据维度,使得数据可以用于统计学习的算法。但是,如果能够挑选出少而精的特征了,那么PCA等降维算法没有很大必要。在本次实验中,数据集中的特征已经比较有代表性而且并不过多,所以应该不需要降维(实验证明降维确实没有帮助)。关于降维的介绍可以参考之前写的这个博客()。总之,数据预处理对于训练机器学习算法非常重要,正所谓“garbagein,garbageout”。4.模型的训练与评估4.1划分数据集首先,需要将处理好的数据集划分为3部分,分别是训练集(trainset)、交叉检验集(Crossvalidationset)和测试集(testset)。(另见博客学习模型的评估和选择)。训练集是用于训练模型。交叉检验集用来进行模型的选择,包括选择不同的模型或者同一模型的不同参数,即选择在交叉检验集上的测试结果最优的模型。测试集用于检测最终选择的最优模型的质量。通常,
本文标题:机器学习应用中的常见问题分类问题你了解多少
链接地址:https://www.777doc.com/doc-4206652 .html