决策树相关算法-XGBoost原理分析及实例实现_第1页
决策树相关算法-XGBoost原理分析及实例实现_第2页
决策树相关算法-XGBoost原理分析及实例实现_第3页
决策树相关算法-XGBoost原理分析及实例实现_第4页
决策树相关算法-XGBoost原理分析及实例实现_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、决策树相关算法一XGBoost原理分析及实例实现(三)i前言本篇博客作为前两篇XGBoost的原理与分析的续作三,主要记录的是使用XGBoost对kaggle中的初级赛题进行预测的实例,以此来加深自己对XGBoost库的使用。前两篇XGBoost原理分析如下,本篇实例地址为2数据集分析Titanic赛题的数据集需要到上述赛题地址下载,包括训练集train.csv中,测试集test.csv,最后赛题预测的答案集为gender_submission.csv。给出的数据集的记录中有些Variable存在缺失,而且Variable的值存在离散型数据,连续型数据和字符串数据。这些在训练模型之前都需要进行

2、处理,首先对赛题给出的数据进行分析,提取出要训练的模型特征。3特征工程此赛题的特征工程主要包括四个任务:数据缺失值处理,连续型数据特征值处理,字符串型数据特征值处理,预测模型的特征选择。接下来这3个任务将贯穿整个特征工程的过程。特征选择一般的方式有:计算每一个特征与响应变量label的相关性,比如说计算互信息系数。训练能够对特征打分的预选模型:RandomForest和LogisticRegression等都能对模型的特征打分,通过打分获得相关性后再训练最终模型;3.1查看数据整体信息包括行列信息,各列Variable缺失值情况,dtypes的值。inmportnumpyasnpmportpa

3、ndasaspdIrain=pd.read_csv(ML/data/Titanic/train.csv)est=pd.read_csv(ML/data/Titanic/test.csv)ull_data=train,testprint(()outclasspandas.core.frame.DataFrameRangeIndex:891entries,0to890Datacolumns(total12columns):PassengerId891non-nullint64Survived891non-nullint64Pclass891non-nullint64Name89

4、1non-nullobjectSex891non-nullobjectAge714non-nullfloat64SibSp891non-nullint64Parch891non-nullint64Ticket891non-nullobjectFare891non-nullfloat64Cabin204non-nullobjectEmbarked889non-nullobjectdtypes:float64(2),int64(5),object(5)memoryusage:83.6+KBNone3.2根据train.csv中各个ariable的取值和特性进行数据处理主要查看数据的各个Variab

5、le对Survived的影响来确定是否该Variable对生还有影响。PassengerId和SurvivedSurvived是模型最终需要预测的Label,给定的数据集该Variable值没有缺失Passengerid是各个乘客的ID,每个ID号各不相同,基本没有什么数据挖掘意义,对需要预测的存活性几乎没有影响。Pclasspclass为船票类型,离散数据(不需要进行特别处理),没有缺失值。该变量的取值情况如下。inprint(trainPclass.value_counts(sort=False).sort_index()out121621843491PcSus/ived的影响计算出每个P

6、class属性的取值中存活的人的比例printtrainPclass,Survived.groupby(Pclass,as_index=False).mean()outPclassSurvived010.62963020.47282630.242363从输出的生还率可以看出,不同的Pclass类型对生还率影响还是很大的,所以选取该属性作为最终的模型的特征之一,取值为1,2,3.3.SexSex为性别,连续型数据特征,没有缺失值。该变量的取值情况如下。inprint(trainSex.value_counts(sort=False).sort_index()outemale314male577和

7、Sexvived的影响计算出每个Sex属性的取值中存活的人的比例printtrainSex,Survived.groupby(Sex,as_index=False).mean()outSexSurvived0female0.742038male0.188908从输出的生还率可以看出,不同的Sex类型对生还率影响还是很大的,所以选取该属性作为最终的模型对于字符串数据特征值的处理,可以将两个字符串值映射到两个数值0,1上。4.AgeAge为年龄,连续型数据,Age714non-nullfloat64该属性包含较多的缺失值,不宜删除缺失值所在的行的数据记录。此处不仅需要对缺失值进行处理,而且需要对该

8、连续型数据进行处理。对于该属性的缺失值处理:方法一,默认填充值的范围(mean-std),(mean+std)。方法二,将缺失的Age当做label,将其他列的属性当做特征,通过已有的Age的记录训练模型,来预测缺失的Age值。2对该连续型数据进行处理:常用的方法有两种,方法一,等距离划分。方法二,通过卡方检验/信息增益/GINI系数寻找差异较大的分裂点。对于该属性的缺失值处理方式一,方式二在最终的代码仓库中fOrdatasetinfull_data:age_avg=datasetAge.mean()age_std=datasetAge.std()age_null_count=datasetA

9、ge.isnull().sum()age_defaultist=np.random.randint(low=age_avg-age_std,high=age_avg+age_std,size=age_null_count,)datasetAgenp.isnan(datasetAge)=age_default_listdatasetAge=datasetAge.astype(int)对该连续型数据进行处理方式二trainCategoricalAge=pd.cut(trainAge,5)print(trainCategoricalAge,Survived.groupby(CategoricalAg

10、e,as_index=False).mean()outCategoricalAgeSurvived0(-0.08,16.00.532710(16.0,32.00.360802(32.0,48.00.360784(48.0,64.00.434783(64.0,80.00.090909可以看出对连续型特征Age离散化处理后,各个年龄阶段的存活率还是有差异的,所以可以选取CategoricalAge作为最终模型的一个特征。5.SibSpandParchSibSp和Parch分别为同船的兄弟姐妹和父母子女数,离散数据,没有缺失值。于是可以根据该人的家庭情况组合出不同的特征。SSlbSpvived的影响

11、printtrainSibSp,Survived.groupby(SibSp,as,index=False).mean()对aSchvived的影响printtrainParch,Survived.groupby(Parch,as_index=False).mean()PSCSp组合对Survived的影响ordatasetinfull_data:datasetFamilySize=datasetSibSp+datasetParch+1print(trainFamilySize,Survived.groupby(FamilySize,as_index=False).mean()是否为一个人sA

12、lone对Survived的影响trainIsAlone=0train.loctrainFamilySize=1,IsAlone=1print(trainIsAlone,Survived.groupby(IsAlone,as_index=False).mean()out1SibSpSurvived000.34539510.53588520.46428630.25000040.16666750.00000080.000000out2ParchSurvived000.343658110.550847220.500000330.600000440.000000550.200000660.000000

13、out3010.303538120.552795230.578431340.724138450.200000560.136364670.333333780.0000008110.000000out4IsAloneSurvived000.505650110.303538从输出的生还率可以看出,可以选取的模型特征有Parch和SibSp组合特征FamilySize,Parch,SibSp,lsAlone该四个特征的取值都为离散值。Ticket和CabinTicket为船票号码,每个ID的船票号不同,难以进行数据挖掘,所以该列可以舍弃oCabin为客舱号码,204non-nullobject对于89

14、1条数据记录来说,缺失巨大,难以进行填充或者说进行缺失值补充带来的噪音将更多,所以可以考虑放弃该列。FareFare为船票售价,连续型数据,没有缺失值,需要对该属性值进行离散化处理。fOrdatasetinfulldata:datasetFare=datasetFare.fillna(trainFare.median()ainCategoricalFare=pd.qcut(trainFare,6)print(trainCategoricalFare,Survived.groupby(CategoricalFare,as_index=False).mean()outCategoricalFare

15、Survived0(-O.OO1,7.7750.205128(7.775,8.6620.190789(8.662,14.4540.366906(14.454,26.00.436242(26.0,52.3690.417808(52.369,512.3290.697987可以看出对连续型特征Fare离散化处理后,各个票价阶段的存活率还是有差异的,所以可以选取CategoricalFare作为最终模型的一个特征。此时分为了6个等样本数阶段。EmbarkedEmbarked是终点城市,字符串型特征值,889non-nullobject对于891个数据记录来说,缺失数极小,所以这里考虑使用该属性最多的值

16、填充。print(trainEmbarked.value_counts(sort=False).sort_index()outC168Q77S644Name:Embarked,dtype:int64填充和探索Embarked对Survived的影响ordatainfull_data:dataEmbarked=dataEmbarked.fillna(S)print(trainEmbarked.value_counts(sort=False).sort_index()print(trainEmbarked,Survived.groupby(Embarked,as_index=False).mean

17、()out1C168Q77S646Name:Embarked,dtype:int64EmbarkedSurvived0C0.553571Q0.389610S0.339009可以看出不同的Embarked类型对存活率的影响有差异,所以可以选择该列作为最终模型的特征,由于该属性的值是字符型,还需要进行映射处理或者one-hot处理。Name为姓名,字符型特征值,没有缺失值,需要对字符型特征值进行处理。但是观察到Name的取值都是不相同,但其中发现Name的titlename是存在类别的关系的。于是可以对Name进行提取出称呼这一类别titlename.return*攵卜于甲好的数据集mportre

18、defget_title_name(name):title_s=re.search(A-Za-z+).,name)iftitle_s:returntitle_s.group(1)returnordatasetinfull_data:datasetTitleName=datasetName.apply(get_title_name)print(pd.crosstab(trainTitleName,trainSex)outSexfemalemaleTitleNameTOC o 1-5 h zIapt01ol02Countess10Don01Dr16Jonkheer01Lady10Major02Ma

19、ster040Miss1820Mlle20Mme10Mr0517Mrs1250Ms10Rev06Sir01可以看出不同的itlename中男女还是有区别的。进一步探索lename对Survived的影响。看出上面的离散取值范围还是比较多,所以可以将较少的几类归为一个类别。trainTitleName=trainTitleName.replace(Mme,Mrs)trainTitleName=trainTitleName.replace(Mlle,Miss)trainTitleName=trainTitleName.replace(Ms,Miss)ainTitleName=trainTitleN

20、ame.replace(Lady,Countess,Capt,Col,Don,Dr,Major,Rev,Sir,Jonkheer,Dona,Other)print(trainTitleName,Survived.groupby(TitleName,as_index=False).mean()out1TitleNameSurvived0Master0.5750001Miss0.7027032Mr0.156673Mrs0.793651Other0.347826可以看出TitleName对存活率还是有影响差异的,TitleName总共为了5个类别:Mrs,Miss,Master,Mr,Other。3

21、.3赛题的特征提取总结此赛题是计算每一个属性与响应变量label的影响(存活率)来查看是否选择该属性作为最后模型的输入特征。最后选取出的模型输入特征有Pclass,Sex,CategoricalAge,FamilySize,Parch,SibSp,IsAlone,CategoricalFare,Embarked,TitleName。最后对上述分析进行统一的数据清洗,将train.csv和test.csv统一进行处理,得出新的模型训练样本集。4oo模型训练4.1数据清洗和特征选择此步骤主要是根据3中的数据分析来进行编写的。着重点Age的缺失值使用了两种方式进行填充。均值和通过其他清洗的数据特征使

22、用随机森林预测缺失值两种方式。defdata_feature_engineering(full_data,age_default_avg=True,one_hot=True):paramfull_data:全部数据集包括train,test:paramage_default_avg:age默认填充方式,是否使用平均值进行填充:paramone_hot:Embarked字符处理是否是one_hot编码还是映射处理HUH理好的数fordatasetinfull_data:PclassParch、SibSp不需要处理sex0,1datasetSex=datasetSex.map(Passenger_

23、seR.astype(int)FamilySizedatasetFamilySize=datasetSibSp+datasetParch+1IsAlonedatasetIsAlone=0isAlone_mask=datasetFamilySize=1datasetocisAlone_mask,IsAlone=1Fare离散化处理,6个阶段fare_median=datasetFare.median()datasetCategoricalFare=datasetFare.fillna(fare_median)datasetCategoricalFare=pd.qcut(datasetCatego

24、ricalFare,6,labels=0,1,2,3,4,5)Embarked射处理,one-hot编码,极少部分缺失值处理datasetEmbarked=datasetEmbarked.fillna(S)datasetEmbarked=datasetEmbarked.astype(str)ifone_hot:因为OneotEncoder只能编码数值型,所以此处使用abelBinarizer进行独热编码Embarked_arr=LabelBinarizer().fit_transform(datasetEmbarked)datasetEmbarked_0=Embarked_arr:,0data

25、setEmbarked_1=Embarked_arr:,1datasetEmbarked_2=Embarked_arr:,2dataset.drop(Embarked,axis=1,inplace=True)else:字符串映射处理datasetEmbarked=datasetEmbarked.map(Passenger_Embarked).astype(int)Nam选取称呼Title_namedatasetTitleName=datasetName.apply(get_title_name)datasetTitleName=datasetTitleName.replace(Mme,Mrs)

26、datasetTitleName=datasetTitleName.replace(Mlle,Miss)datasetTitleName=datasetTitleName.replace(Ms,Miss)datasetTitleName=datasetTitleName.replace(Lady,Countess,Capt,Col,Don,Dr,Major,Rev,Sir,Jonkheer,Dona,Other)datasetTitleName=datasetTitleName.map(Passenger_TitleName).astype(int)age缺失值,分段处理ifage_defau

27、lt_avg:缺失值使甩ivg处理age_avg=datasetAge.mean()age_std=datasetAge.std()age_null_count=datasetAge.isnull().sum()age_default_list=np.random.randint(low=age_avg-age_std,high=age_avg+age_std,size=age_null_count)datasetocnp.isnan(datasetAge),Age=age_default_listdatasetAge=datasetAge.astype(int)else:将age作为abel

28、,预测缺失的age特征为TitleName,Sex,pclass,SibSP,Parch,IsAlone,CategoricalFare,FamileSize,Embarkedfeature_list=TitleName,Sex,Pclass,SibSp,Parch,IsAlone,CategoricalFare,FamilySize,Embarked,Ageifone_hot:feature_list.append(Embarked_0)feature_list.append(Embarked_1)feature_list.append(Embarked_2)feature_list.rem

29、ove(Embarked)Agedata=dataset.loc:,featurelistun_Age_mask=np.isnan(Age_dataAge)Age_train=Age_dataun_Age_mask要训练的Ageprint(Age_train.shape)featureist.remove(Age)rfO=RandomForestRegressor(n_estimators=60,oob_score=True,min_samples_split=10,min_samples_leaf=2,max_deptl=7,random_state=10)rfO.fit(Age_train

30、feature_list,Age_trainAge)defset_default_age(age):ifnp.isnan(ageAge):print(agePassengerId)printage.locfeature_listdata_x=np.array(ageocfeature_list).reshape(1,-1)printdata_xage_v=round(rf0.predict(data_x)print(pred:,age_v)ageAge=age_vreturnage_vprintagereturnageAgedatasetAge=dataset.apply(set_defaul

31、t_age,axis=1)print(dataset.tail()data_age_no_full=datasetdatasetAge.pd.cu与pd.cu的区别,前者是根据取值范围来均匀划分,后者是根据取值范围的各个取值的频率来换分,划分后的某个区间的频率数相同print(dataset.tail()datasetCategoricalAge=pd.cut(datasetAge,5,labels=0,1,2,3,4)returnfull_data特征选择defdata_feature_select(full_data):paramfull_data:全部数据集:return:Hintfor

32、data_setinfull_data:drop_list=PassengerId,Name,Age,Fare,Ticket,Cabindata_set.drop(drop_list,axis=1,inplace=True)train_y=np.array(full_dataOSurvived)train=full_data0.drop(Survived,axis=1,inplace=False)print(train.head()train_X=np.array(train)test_X=np.array(full_data1)returntrainX,trainy,testX4.2XGBo

33、ost参数介绍要熟练的使用XGBoost库一方面需要对XGBoost原理的了解,另一方面需要对XGBoost库的API参数的了解。此处参考了别人的博客。4.2.1通用参数booster,基分类器的模型gbtree和gblinernthread,线程数4.2.2booster参数(gbtree提升树对应的参数)learning_rate,梯度下降的学习率,一般为0.010.2min_child_weight,最小叶子节点样本权重和,用于避免过拟合,一般为1max_depth,决策树的最大深度,默认为6max_leaf_nodes,树上最大的叶子数量gamma,节点分裂时候和损失函数变化相关,具体

34、可参考XGBoost中决策树节点分裂时的代价函数的公式subsample和colsample_bytree,随机森林中的两种随机,也是XGBoost中的trick,用于防止过拟合,值为0.51,随机采样所占比例,随机列采样比例。lambda,L2正则化项,可调参实现。scale_pos_weight,在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。4.2.3学习目标函数objective,指定分类回归问题。如binary:logisticeval_metric,评价指标seeds随机数种子,调整参数时,随机取同样的样本集。4.3XGBoos调参主要是五个步骤,按照参数的

35、重要性依次调整。step1确定学习速率和迭代次数n_estimators,即集分类器的数量setp2调试的参数是min_child_weight以及max_depthstep3gamma参数调优step4调整subsample和colsample_bytree参数step5正则化参数调优defxgboost_change_param(train_X,train_y):Xgboos调I参stepl确定学习速率和迭代次数.estimators,即集分类器的数量xgbl=XGBClassifier(learning_rate=0.1,booster=gbtree,n_estimators=300,m

36、ax_depth=4,min_child_weight=1,gamma=0,subsample=0.8,colsample_bytree=0.8,objective=binary:logistic,nthread=2,scale_pos_weight=1,seed=10)最佳n_estimators=59,learning_rate=0.1modelfit(xgb1,train_X,train_y,early_stopping_rounds=45)setp2周试的参数是nin_child_weight以及max_depthparam_test1=max_depth:range(3,8,1),m

37、in_child_weight:range(1,6,2)gsearch1=GridSearchCV(estimator=XGBClassifier(learning_rate=0.1,n_estimators=59,max_depth=4,min_child_weight=1,gamma=0,subsample=0.8,colsample_bytree=0.8,objectiv&binary:logistic,nthread=2,scale_pos_weight=1,seed=10),param_gri=param_test1,coring=roc_auciin_jobs=licv=5gsea

38、rch1.fit(train_X,train_y)printgsearch1.best_params_,gsearch1.best_score_最佳max_depth=7,min_child_weight=3modelfit(gsearch1.best_estimator_最佳模型为:gsearch1.best_estimator_step3gamma参数调优param_test2=gamma:i/10.0foriinrange(0,5)gsearch2=GridSearchCV(estimator=XGBClassifier(learning_rate=0.1,n_estimators=59

39、,max_depth=7,min_child_weight=3,gamma=0,subsample=0.8,colsample_bytree=0.8,objective=binary:logistic,nthread=2,scale_pos_weight=1,seed=10),param_grid=param_test2,scoring=roc_auc,cv=5)gsearch2.fit(train_X,train_y)printgsearch2.best_params_,gsearch2.best_score_最佳gamma=0.3modelfit(gsearch2.best_estimator_)step调整subsample和colsample_bytree参数param_test3=subsample:i/10.0foriinrange(6,10),colsample_bytree:i/10.0foriinrange(6,10)gsearch3=GridSearchCV(estimator=XGBClassifier(learning_rate=0.1,n_estimators=59,max_depth=7,min_child_weight=3,gamma=0.3,subsample=0.8,colsample_bytree=0.8

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论