kaggle笔记02: Titanic: Machine Learning from Disaster(二)

参考:https://www.kaggle.com/ldfreeman3/a-data-science-framework-to-achieve-99-accuracy

5. 模型建立

  • 如何选择模型?
    sklearn官网上算法粗略选择图:
    在这里插入图片描述

  • 根据上图,考虑SVC和ensemble clasifiers。本例建议从决策树、bagging、随机森林和boosting开始,因为好理解好调试,然后是SVC。数据量小所以交叉验证,所得结果表格如下。

colu = ['name','parameter','train_accuracy','test_accuracy']
MLA_compare = pd.DataFrame(columns=colu)
MLA=[ensemble.AdaBoostClassifier(),ensemble.RandomForestClassifier(),\
     ensemble.BaggingClassifier(),ensemble.ExtraTreesClassifier(),\
     ensemble.GradientBoostingClassifier(),svm.SVC(),svm.NuSVC()]

data_ = pd.concat([data['Isalone'],data_dummy],axis=1)
x_train,x_test,y_train,y_test = train_test_split(data_,target,test_size=0.3)

row_index = 0
for alg in MLA:   
    MLA_compare.loc[row_index,'name'] = alg.__class__.__name__ 
    MLA_compare.loc[row_index,'parameter'] = str(alg.get_params())
    MLA_compare.loc[row_index,'train_accuracy'] = model_selection.cross_val_score(alg,x_train,y_train,cv=4).mean()
    MLA_compare.loc[row_index,'test_accuracy'] = model_selection.cross_val_score(alg,x_test,y_test,cv=4).mean()   
    row_index +=1
MLA_compare.sort_values(by=['train_accuracy'],ascending=False,inplace=True)
MLA_compare

在这里插入图片描述

5.1 模型评估

  • 构建决策树,推测是否存活。
  • 多元素存活率。
pivot = data1[data1['Sex']=='female'].groupby(['Sex','Pclass','FareBin'])['Survived'].mean()
pivot1 = data1[data1['Sex']=='male'].groupby(['Sex','Pclass','FareBin','Title'])['Survived'].mean()

在这里插入图片描述
在这里插入图片描述

女性中,一等舱及二等舱存活率高于90%,三等舱仅为50%。男性中,一等舱及二等舱中title是master或fare高的存活率很高。由此,选择树模型更合理。

5.12 超参数调整

  • 决策树优点:易于理解,数据准备少,对数级消耗。白盒模型,可解释,利用统计实验可验证模型。
  • 决策树缺点:容易过拟合。
  • 选择gradientboosting分类算法,进行参数网格搜索。
param_grid={'loss':['deviance','exponential'],'learning_rate':[0.1,0.2],'n_estimators':[100,200],'max_depth':[3,4]}
tune_model = model_selection.GridSearchCV(ensemble.GradientBoostingClassifier(),param_grid=param_grid,scoring = 'roc_auc')
tune_model.fit(data_,target)
print(tune_model.best_params_)
print(tune_model.cv_results_['mean_train_score'][tune_model.best_index_]*100) #得分90.18
print(tune_model.cv_results_['mean_test_score'][tune_model.best_index_]*100) #得分86.19

5.13 特征选择

dtree = ensemble.GradientBoostingClassifier()
dtree_rfe = feature_selection.RFECV(dtree,step=1,scoring='accuracy')
dtree_rfe.fit(data_,target)
X_rfe = data_.columns.values[dtree_rfe.get_support()]
rfe_tune_model = model_selection.GridSearchCV(dtree,param_grid=param_grid,scoring='roc_auc')
rfe_tune_model.fit(data_[X_rfe],target) #测试得分86.45

测试集预测,上传得到准确率78.9%,成绩还可以。

6. 多模型投票
同时考虑AdaBoost、Bagging、GradientBoosting及Random分类,利用多模型投票。上传结果,准确率提升到79.4%,9000+队伍中排进前2000名了。利用网格搜索超参数,成绩并没提升,暂时先这样吧。

vote_est=[('ada',ensemble.AdaBoostClassifier()),
          ('bc',ensemble.BaggingClassifier()),
          ('gbc',ensemble.GradientBoostingClassifier()),
          ('rfc',ensemble.RandomForestClassifier())]
vote_soft = ensemble.VotingClassifier(estimators=vote_est,voting='soft')
vote_soft.fit(data_,target)

猜你喜欢

转载自blog.csdn.net/qq_33476409/article/details/83059311
今日推荐