最终会有多少只队伍益行家参加队伍kaggle的Titanic比赛

后使用快捷导航没有帐号?
查看: 1105|回复: 2
机器学习第11周大作业:Kaggle,
Titanic: Machine Learning from Disaster
中级会员, 积分 204, 距离下一级还需 296 积分
论坛徽章:6
& && & 本次作业做了Kaggle上的Titanic题目,该题目是入门级的学习性题目,网站上有详细的新手指导。& && & 题目网址为:
1.jpg (90.8 KB)
14:59 上传
& && & 泰坦尼克号沉没,造成上面的乘客过半的死亡。本题就是根据给出的乘客信息,判断乘客是生还还是遇难。因为在轮船沉没过程中,一般会存在优先照顾妇女儿童等行为,所以可以根据乘客的具体信息,通过对训练集的机器学习方法,来判断测试集中乘客的生还与否。& && & 训练集和测试集在Kaggle网站都可以下载到,训练集有891位乘客信息,测试集有418位乘客信息。& && &
2.jpg (132.83 KB)
14:59 上传
& && & 每位乘客信息各个特征分别为:PassengerID:乘客编号Survived& & 是否生还。测试集没有该字段。& && && && && & (0 = 遇难; 1 = 生还)Pclass& && && & 乘客等级& && && && && & (1 = 1等; 2 = 2等; 3 = 3等)Name& && && && &姓名Sex& && && && & 性别Age& && && && & 年龄SibSp& && && &&&同船的兄弟姐妹及配偶数量Parch& && && &&&同船的父母及子女数量Ticket& && && &&&票号Fare& && && && &船费Cabin& && && &&&仓位Embarked& && & 上船的港口& && && && && & (C = Cherbourg; Q = Q S = Southampton) & && & 数据有缺失,在用RandomForest前填补了缺失项。如用指定“S”填补了Embarked的缺失;用平均值填补了船费Fare的缺失;用回归树预测的方法填补了年龄Age的缺失。& && & 同时增加了两个特征,一个是FamilySize,等于SibSp+Parch+1;另一个是Title,在姓名Name中提取出了乘客的头衔,如Miss., Mr.等。& && & 详细R代码如下:library(randomForest) library(rpart) #读入数据train &-read.csv(&E:/DataGuru机器学习(第11期)/Kaggle-Titanic/train.csv&)test &-read.csv(&E:/DataGuru机器学习(第11期)/Kaggle-Titanic/test.csv&) test$Survived &- NA #合并训练集以及测试集数据,以便填补缺失数据all_data = rbind (train,test) #用”S”填补缺失的Embarked特征all_data$Embarked[c(62,830)] =&S&all_data$Embarked &-factor(all_data$Embarked) #用平均值填补缺失的Fare特征all_data$Fare[1044] &-median(all_data$Fare, na.rm=TRUE) #从Name中进一步创建出Title特征all_data$Name &-as.character(all_data$Name)all_data$Title &- sapply(all_data$Name,FUN=function(x) {strsplit(x, split='[,.]')[[1]][2]})all_data$Title &- sub(' ', '',all_data$Title)all_data$Title[all_data$Title %in% c('Mme','Mlle')] &- 'Mlle'all_data$Title[all_data$Title %in%c('Capt', 'Don', 'Major', 'Sir')] &- 'Sir'all_data$Title[all_data$Title %in%c('Dona', 'Lady', 'the Countess', 'Jonkheer')] &- 'Lady'all_data$Title &- factor(all_data$Title) #创建出FamilySize特征all_data$FamilySize &- all_data$SibSp +all_data$Parch + 1 #用回归树预测填补缺失的Age特征predicted_age &- rpart(Age ~ Pclass +Sex + SibSp + Parch + Fare + Embarked + Title + FamilySize, data=all_data[!is.na(all_data$Age),],method=&anova&)all_data$Age[is.na(all_data$Age)] &-predict(predicted_age, all_data[is.na(all_data$Age),]) #再分离训练集和测试集train &- all_data[1:891,]test &- all_data[892:1309,] #显示训练集和测试集特征str(train) str(test)
#设置随机数set.seed(111)
#用随机森林来训练my_forest &-randomForest(as.factor(Survived) ~ Pclass + Sex + Age + SibSp + Parch + Fare +Embarked + FamilySize + Title, data=train, importance = TRUE, ntree=1000)
#对测试集进行预测my_prediction &- predict(my_forest,test, &class&)
#将结果写入csv,以便在Kaggle上提交检验预测结果my_solution &- data.frame(PassengerId =test$PassengerId, Survived = my_prediction) write.csv(my_solution,file=&E:/DataGuru机器学习(第11期)&&/Kaggle-Titanic/my_solution_xhb.csv& , row.names=FALSE)
#作图varImpPlot(my_forest)
3.jpg (43.97 KB)
14:59 上传
& && & 该图表明各特征的重要性,可见Title是最重要的特征,其他特征的重要性也依次可见。& && & 结果在Kaggle上提交一下,正确率为0.78469。
4.jpg (19.44 KB)
14:59 上传
& & 用party包中的“条件推断决策树”(conditional inference trees)随机森林进行训练,set.seed(415)my_forest &- cforest(as.factor(Survived)~ Pclass + Sex + Age + SibSp + Parch + Fare + Embarked + Title + FamilySize,& && && && && &data = train, controls=cforest_unbiased(ntree=2000,mtry=3)) & & 预测结果提交Kaggle,准确率为0.79904,比普通的随机森林结果有所提高。
5.jpg (21.84 KB)
14:59 上传
& && & 大神们刷到100%的正确率,一时难以企及,大部分人用Python做的。
6.jpg (59.81 KB)
14:59 上传
& && & 通过《机器学习》这门课,虽然自己没有深入进去,但是感觉各种都了解了原理,对核心的概念胸有成竹,以后要在这方面继续精进也有了方向。& && & 大家共同学习共同进步!
中级会员, 积分 495, 距离下一级还需 5 积分
论坛徽章:9
很详细,学习了。 另外100%的预测正确率,这个也太夸张了吧。测试样本里一个离群点也没有?
注册会员, 积分 57, 距离下一级还需 143 积分
论坛徽章:1
觉得想出这个题目的人很有意思 居然能以泰坦尼克为题进行预测
扫一扫加入本版微信群最终会有多少只队伍参加kaggle的Titanic比赛?
上除了企业提供的题目,还会有一些给大家练手儿的题目,比如预测Titanic遇难人数的题目,题目在可以找到,Titanic的数据在很多学校统计课程中的都会用到,也在他的博客里介绍过这个,这次kaggle提供的数据更为详细,可以作为比赛的余热题目。
我最早看到这个题目时参数队伍有900多个,现在已经到了1200多个了,比赛还剩下8个多月的时间,我想预测一下最终会有多少个队伍参加这个比赛呢?
第一天看到这个比赛的时候参赛队伍有917个,那已经是比赛开始的第70天了,如果只有这一个数据如何预测?我想最简单的办法就是假设每天增长都是均匀的,比赛一共长366天,最终参加比赛的队伍用就是366&(917/70)=4795个。
2.进一步想如果能知道这个比赛每天参赛队伍数量,通过一系列的数据来预测最终参赛队伍的数量应该更合理,那就用一段R脚本,每天晚上执行,抽取题目介绍网页中的队伍数据,保存成csv文件以便分析,具体程序如下:
library(stringr)
data=data.frame(read.csv(file="teams.csv", header = TRUE))
&#读取上一天的记录
date=as.Date(Sys.time()) & &
&#获得当天的日期 & &
source_code=readLines('/c/titanic-gettingStarted',n=300)
teams_line=source_code[grep("Knowledge &
",source_code)]
teams_word=str_split(teams_line, " ")
teams=teams_word[[1]][length(teams_word[[1]])-1]
&#解析网页获得当天队伍数
data=rbind(data,c(date,teams))
write.csv(data,file="teams.csv",row.names=FALSE)
&#写入今天的队伍数
程序运行20多天后,看看成果,我们将具体的日期转换为比赛开始的日期数,画图看看队伍数增长的情况:
data=read.csv(file="teams.csv")
firstday=as.numeric(as.Date(""))
data$days=data$date-firstday+1
plot(data$days,data$teams)
从图形上看是比较接近均匀增长,可以先使用线性回归方法,从结果上看不错,R方达到97%,从系数上看平均每天参赛队伍数增长16个左右,预测一下最终的队伍数为5652个:
model=lm(teams~days,data=data)
summary(model)
abline(model)
newdata=data.frame(days=70:366)
teams.final=as.integer(predict(model,newdata))
3. 对于这种预测一般很难给出一个准确的数字,一般会给出一个区间,说明我们有多大的把握最终的队伍数会落在这个区间:
pred.w.plim &- predict(model, newdata,
interval="prediction")
matplot(newdata,pred.w.plim,type="l", ylab="predicted
从结果可以看到随着要预测时间的延后,区间越来越大,时间越远越难预测,到比赛的最后一天,我们可以说有95%的把握最终的队伍数会落在[]之间,大概有600个队伍的区间,还是比较大的,过几个月在修订这篇文章的时候,我们应该可以更准确的预测最终队伍的数量了。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。9814人阅读
机器学习(7)
因为最近模型上线收益没有符合预期,一直都没有时间搞,而且感觉Titanic的数据量太少了,做起来没意思,暂且优化到0.8的precision,排名700+
Kaggle上的一个入门题目,属于二分类问题。
泰坦尼克号中一个经典的场面就是豪华游艇倒了,大家都惊恐逃生,可是救生艇的数量有限,不可能让大家都同时获救,这时候副船长发话了:lady and kid first!这并不是一个随意安排的逃生顺序,而是某些人有优先逃生的特权,比如贵族,女人,小孩的。
那么现在问题来了:给出一些船员的个人信息以及存活状况,让参赛者根据这些信息训练出合适的模型并预测其他人的存活状况。
数据是csv格式,提醒一下:之前一直是这样解析数据的:
tmp = line.rstrip('\n').split(',')
有些字段中包含”,”,上面这个解析就出问题了。
数据包含的字段如下:
PassengerID
Survived(存活与否)
Pclass(客舱等级)
Name(姓名)
Sex(性别)
Age(年龄)
SibSp(亲戚和配偶在船数量)
Parch(父母孩子的在船数量)
Ticket(票编号)
Fare(价格)
Cabin(客舱位置)
Embarked(上船的港口编号)
比赛通过准确率指标评估模型优劣
precision=∑Ni=1I(y?&i==yi)N
y?&i表示预测值,yi表示实际值
模型以及特征选择
机器学习的关键部分无外乎是模型以及特征选择
常见的分类模型有:SVM,LR,Navie Bayesian,CART以及由CART演化而来的树类模型,Random Forest,GBDT,最近详细研究了GBDT,发现它的拟合能力近乎完美,而且在调整了参数之后可以降低过拟合的影响,据说高斯过程的拟合能力也比不过它,这次就决定直接采用GBDT来做主模型。
第一反应就是名字,Ticket,Cabin这些字段太零散,基本上每个人的都不一样,感觉并没有什么用。Cabin这一维度的特征更是缺失很严重,所以暂且不考虑Ticket,Cabin的这些特征
反观Name这个特征,看似并没有什么用,大家的名字都不一样,实际上从GBDT的调试过程来看,这个特征的使用频率很高的。通俗地说,Name可以给模型提供一定的泛化能力,比如一家人面临危机的时候,大家肯定都先找到自己的家人一起逃生,所以一家人的存活状况相关性肯定很高的。所以我引入名字特征的方式并不是直接引入名字,而是考虑和当前预测人的名字同姓的存活率。另外还有个背景问题,就是逃生的时候,女士优先逃生,这个时候家人就分开了,所以名字这个特征还要考虑性别,综合来说就是性别+姓的存活率作为一个特征。
另外,还增了相应类别的存活率这些特征,比如各种性别的存活率以及各种等级的存活率,之前请教过别人,这种把分类ID扔进模型之后有必要把所属ID的百分比扔进去吗?还是有必要的,前者是“是什么类别“的因素,后者是“有多少存活比例“的因素,是和有不能混为一谈。
数据中的某列特征丢失了在模型训练的时候是很正常的。目前了解到的解决方案是:
直接扔掉这行数据(数据多任性)
对于缺失的数据统一给一个新的label,让模型来学出给这种label多大的权值(感觉数据量大的情况才能训出来)
这个特征的缺失率很高
直接扔掉这列特征
搞一个模型来拟合这维度的特征
给一个默认值,这个值可以是均值,或者众数。(感觉这个方法其实和上一个方法的拟合很相似,通过均值or众数来拟合其实可理解为人工的最大似然。。。)
初步训了一版,提交上去之后精确度为0.75
age特征的调优
看到ID为611的预测值仅是0.44,可是对应的label是存活,看了下他的特征
船仓等级为class1,而且fare的费用相当高,应该具有相当高的优先权逃跑,只有可能是年龄影响了(数据量太少,年龄这一维度的特征特性GBDT并没有学习出来)于是乎,把年龄更换成是否是小孩这个标签
这个特征的值域更少了,顿时领悟:数据量实在不够,没有训练出来年龄的特性,因此降低候选特征的空间大小,在数据不够的时候,模型更能学习出来
本地自测0.812的precision,提交上去,涨了两个百分点
后面继续挑了几个case,感觉都是一些很明显的特征,模型应该能拟合出来,可是预估出来的值在0.5上下波动,于是乎:把训练集随机复制了几份扔回去一起训练,一下子提升到80+%的精确度,后面加了一些if-else规则,感觉用处不是很大,看来加规则的能力十分不足啊,这里抛出一个问题:感觉数据量不充足的时候,* GBDT中数据随机复制加倍的效果比增加迭代次数的效果更好*,我的见解是这样的:增加迭代次数的话,容易造成过拟合,而随机增加其中的数据,更容易让GBDT学习出数据的特性。
暂时没有下一步优化的想法,感觉可能就是比if-else,继续优化的意义不大,晚上断断续续搞了三个星期左右,占用自学的时间太多,以后打算还是多看论文,打算断断续续把NLP相关的知识体系连接起来。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:99276次
积分:1878
积分:1878
排名:千里之外
原创:78篇
评论:31条
(1)(3)(2)(1)(1)(1)(2)(2)(2)(2)(2)(1)(2)(9)(2)(26)(1)(6)(13)(3)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix't推荐:Kaggle竞赛 —— 泰坦尼克号(Titanic)
完整代码见kaggle kernel 或 NbViewer
比赛页面:/c/titanic
Titanic大概是kaggle上最受欢迎的项目了,有7000多支队伍参加,多年来诞生了无数关于该比赛的经验分享。正是由于前人们的无私奉献,我才能无痛完成本篇。
事实上kaggle上的很多kernel都聚焦于某个特定的层面(比如提取某个不为人知的特征、使用超复杂的算法、专做EDA画图之类的),当然因为这些作者本身大都是大神级别的,所以平日里喜欢钻研一些奇淫巧技。而我目前阶段更加注重一些整体流程化的方面,因此这篇提供了一个端到端的解决方案。
关于Titanic,这里先贴一段比赛介绍:
The sinking of the RMS Titanic is one of the most infamous shipwrecks in history. On April 15, 1912, during her maiden voyage, the Titanic sank after colliding with an iceberg, killing 1502 out of 2224 passengers and crew. This sensational tragedy shocked the international community and led to better safety regulations for ships.
One of the reasons that the shipwreck led to such loss of life was that there were not enough lifeboats for the passengers and crew. Although there was some element of luck involved in surviving the sinking, some groups of people were more likely to survive than others, such as women, children, and the upper-class.
In this challenge, we ask you to complete the analysis of what sorts of people were likely to survive. In particular, we ask you to apply the tools of machine learning to predict which passengers survived the tragedy.
主要是让参赛选手根据训练集中的乘客数据和存活情况进行建模,进而使用模型预测测试集中的乘客是否会存活。乘客特征总共有11个,以下列出。当然也可以根据情况自己生成新特征,这就是特征工程(feature engineering)要做的事情了。
PassengerId =& 乘客ID
Pclass =& 客舱等级(1/2/3等舱位)
Name =& 乘客姓名
Sex =& 性别
Age =& 年龄
SibSp =& 兄弟姐妹数/配偶数
Parch =& 父母数/子女数
Ticket =& 船票编号
Fare =& 船票价格
Cabin =& 客舱号
Embarked =& 登船港口
总的来说Titanic和其他比赛比起来数据量算是很小的了,训练集合测试集加起来总共891+418=1309个。因为数据少,所以很容易过拟合(overfitting),一些算法如GradientBoostingTree的树的数量就不能太多,需要在调参的时候多加注意。
下面我先列出目录,然后挑几个关键的点说明一下:
1. 数据清洗(Data Cleaning)2. 探索性可视化(Exploratory Visualization)3. 特征工程(Feature Engineering)4. 基本建模&评估(Basic Modeling & Evaluation)5. 参数调整(Hyperparameters Tuning)6. 集成方法(Ensemble Methods) 数据清洗(Data Cleaning) full.isnull().sum()
首先来看缺失数据,上图显示Age,Cabin,Embarked,Fare这些变量存在缺失值(Survived是预测值)。其中Embarked和Fare的缺失值较少,可以直接用众数和中位数插补。
Cabin的缺失值较多,可以考虑比较有Cabin数据和无Cabin数据的乘客存活情况。 pd.pivot_table(full,index=['Cabin'],values=['Survived']).plot.bar(figsize=(8,5)) plt.title('Survival Rate')
上面一张图显示在有Cabin数据的乘客的存活率远高于无Cabin数据的乘客,所以我们可以将Cabin的有无数据作为一个特征。
Age的缺失值有263个,网上有人说直接根据其他变量用回归模型预测Age的缺失值,我把训练集分成两份测试了一下,效果并不好,可能是因为Age和其他变量没有很强的相关性,从下面这张相关系数图也能看得出来。
所以这里采用的的方法是先根据‘Name’提取‘Title’,再用‘Title’的中位数对‘Age‘进行插补: full['Title']=full['Name'].apply(lambda x: x.split(',')[1].split('.')[0].strip()) full.Title.value_counts()
Title中的Master主要代表little boy,然而却没有代表little girl的Title,由于小孩的生存率往往较高,所以有必要找出哪些是little girl,再填补Age的缺失值。
先假设little girl都没结婚(一般情况下该假设都成立),所以little girl肯定都包含在Miss里面。little boy(Master)的年龄最大值为14岁,所以相应的可以设定年龄小于等于14岁的Miss为little girl。对于年龄缺失的Miss,可以用(Parch!=0)来判定是否为little girl,因为little girl往往是家长陪同上船,不会一个人去。
以下代码创建了“Girl”的Title,并以Title各自的中位数填补Age缺失值。 def girl(aa): if (aa.Age!=999)&(aa.Title=='Miss')&(aa.Age&=14): return 'Girl' elif (aa.Age==999)&(aa.Title=='Miss')&(aa.Parch!=0): return 'Girl' else: return aa.Title full['Title']=full.apply(girl,axis=1) Tit=['Mr','Miss','Mrs','Master','Girl','Rareman','Rarewoman'] for i in Tit: full.loc[(full.Age==999)&(full.Title==i),'Age']=full.loc[full.Title==i,'Age'].median()
至此,数据中已无缺失值。 探索性可视化(Exploratory Visualization)
普遍认为泰坦尼克号中女人的存活率远高于男人,如下图所示: pd.crosstab(full.Sex,full.Survived).plot.bar(stacked=True,figsize=(8,5),color=['#4169E1','#FF00FF']) plt.xticks(rotation=0,size='large') plt.legend(bbox_to_anchor=(0.55,0.9))
下图显示年龄与存活人数的关系,可以看出小于5岁的小孩存活率很高。
客舱等级(Pclass)自然也与存活率有很大关系,下图显示1号仓的存活情况最好,3号仓最差。 fig,axes=plt.subplots(2,3,figsize=(15,8)) Sex1=['male','female'] for i,ax in zip(Sex1,axes): for j,pp in zip(range(1,4),ax): PclassSex=full[(full.Sex==i)&(full.Pclass==j)]['Survived'].value_counts().sort_index(ascending=False) pp.bar(range(len(PclassSex)),PclassSex,label=(i,'Class'+str(j))) pp.set_xticks((0,1)) pp.set_xticklabels(('Survived','Dead')) pp.legend(bbox_to_anchor=(0.6,1.1))
5.png 特征工程(Feature Engineering)
我将‘Title‘、’Pclass‘,’Parch‘三个变量结合起来画了这张图,以平均存活率的降序排列,然后以80%存活率和50%存活率来划分等级(1,2,3),产生新的’MPPS‘特征。 TPP.plot(kind='bar',figsize=(16,10)) plt.xticks(rotation=40) plt.axhline(0.8,color='#BA55D3') plt.axhline(0.5,color='#BA55D3') plt.annotate('80% survival rate',xy=(30,0.81),xytext=(32,0.85),arrowprops=dict(facecolor='#BA55D3',shrink=0.05)) plt.annotate('50% survival rate',xy=(32,0.51),xytext=(34,0.54),arrowprops=dict(facecolor='#BA55D3',shrink=0.05))
6.png 基本建模&评估(Basic Modeling & Evaluation)
选择了7个算法,分别做交叉验证(cross-validation)来评估效果:
K近邻(k-Nearest Neighbors)
逻辑回归(Logistic Regression)
朴素贝叶斯分类器(Naive Bayes classifier)
决策树(Decision Tree)
随机森林(Random Forest)
梯度提升树(Gradient Boosting Decision Tree)
支持向量机(Support Vector Machine)
由于K近邻和支持向量机对数据的scale敏感,所以先进行标准化(standard-scaling): from sklearn.preprocessing import StandardScaler scaler=StandardScaler() X_scaled=scaler.fit(X).transform(X) test_X_scaled=scaler.fit(X).transform(test_X)
最后的评估结果如下: 逻辑回归,梯度提升树和支持向量机的效果相对较好。 # used scaled data names=['KNN','LR','NB','Tree','RF','GDBT','SVM'] for name, model in zip(names,models): score=cross_val_score(model,X_scaled,y,cv=5) print("{}:{},{}".format(name,score.mean(),score))
接下来可以挑选一个模型进行错误分析,提取该模型中错分类的观测值,寻找其中规律进而提取新的特征,以图提高整体准确率。
用sklearn中的KFold将训练集分为10份,分别提取10份数据中错分类观测值的索引,最后再整合到一块。 # extract the indices of misclassified observations rr=[] for train_index, val_index in kf.split(X): pred=model.fit(X.ix[train_index],y[train_index]).predict(X.ix[val_index]) rr.append(y[val_index][pred!=y[val_index]].index.values) # combine all the indices whole_index=np.concatenate(rr) len(whole_index)
先查看错分类观测值的整体情况:
下面通过分组分析可发现:错分类的观测值中男性存活率高达83%,女性的存活率则均不到50%,这与我们之前认为的女性存活率远高于男性不符,可见不论在男性和女性中都存在一些特例,而模型并没有从现有特征中学习到这些。
通过进一步分析我最后新加了个名为”MPPS”的特征。 full.loc[(full.Title=='Mr')&(full.Pclass==1)&(full.Parch==0)&((full.SibSp==0)|(full.SibSp==1)),'MPPS']=1 full.loc[(full.Title=='Mr')&(full.Pclass!=1)&(full.Parch==0)&(full.SibSp==0),'MPPS']=2 full.loc[(full.Title=='Miss')&(full.Pclass==3)&(full.Parch==0)&(full.SibSp==0),'MPPS']=3 full.MPPS.fillna(4,inplace=True) 参数调整(Hyperparameters tuning)
这部分没什么好说的,选定几个参数用grid search死命调就是了~ param_grid={'n_estimators':[100,120,140,160],'learning_rate':[0.05,0.08,0.1,0.12],'max_depth':[3,4]} grid_search=GridSearchCV(GradientBoostingClassifier(),param_grid,cv=5) grid_search.fit(X_scaled,y) grid_search.best_params_,grid_search.best_score_
({'learning_rate': 0.12, 'max_depth': 4, 'n_estimators': 100}, 0.18408)
通过调参,Gradient Boosting Decision Tree能达到85%的交叉验证准确率,迄今为止最高。 集成方法(Ensemble Methods)
我用了三种集成方法:Bagging、VotingClassifier、Stacking。
调参过的单个算法和Bagging以及VotingClassifier的总体比较如下: names=['KNN','LR','NB','CART','RF','GBT','SVM','VC_hard','VC_soft','VCW_hard','VCW_soft','Bagging'] for name,model in zip(names,models): score=cross_val_score(model,X_scaled,y,cv=5) print("{}: {},{}".format(name,score.mean(),score))
scikit-learn中目前没有stacking的实现方法,所以我参照了这两篇文章中的实现方法:/2016/04/rank-10-percent-in-first-kaggle-competition//arthurtok/introduction-to-ensembling-stacking-in-python
我用了逻辑回归、K近邻、支持向量机、梯度提升树作为第一层模型,随机森林作为第二层模型。 from sklearn.model_selection import StratifiedKFold n_train=train.shape[0] n_test=test.shape[0] kf=StratifiedKFold(n_splits=5,random_state=1,shuffle=True) def get_oof(clf,X,y,test_X): oof_train=np.zeros((n_train,)) oof_test_mean=np.zeros((n_test,)) oof_test_single=np.empty((5,n_test)) for i, (train_index,val_index) in enumerate(kf.split(X,y)): kf_X_train=X[train_index] kf_y_train=y[train_index] kf_X_val=X[val_index] clf.fit(kf_X_train,kf_y_train) oof_train[val_index]=clf.predict(kf_X_val) oof_test_single[i,:]=clf.predict(test_X) oof_test_mean=oof_test_single.mean(axis=0) return oof_train.reshape(-1,1), oof_test_mean.reshape(-1,1) LR_train,LR_test=get_oof(LogisticRegression(C=0.06),X_scaled,y,test_X_scaled) KNN_train,KNN_test=get_oof(KNeighborsClassifier(n_neighbors=8),X_scaled,y,test_X_scaled) SVM_train,SVM_test=get_oof(SVC(C=4,gamma=0.015),X_scaled,y,test_X_scaled) GBDT_train,GBDT_test=get_oof(GradientBoostingClassifier(n_estimators=120,learning_rate=0.12,max_depth=4),X_scaled,y,test_X_scaled) stack_score=cross_val_score(RandomForestClassifier(n_estimators=1000),X_stack,y_stack,cv=5) # cross-validation score of stacking stack_score.mean(),stack_score
Stacking的最终结果:
0.70062, array([ 0.....]))
总的来说根据交叉验证的结果,集成算法并没有比单个算法提升太多,原因可能是:
开头所说Titanic这个数据集太小,模型没有得到充分的训练
集成方法中子模型的相关性太强
集成方法可能本身也需要调参
我实现的方法错了???
最后是提交结果: pred=RandomForestClassifier(n_estimators=500).fit(X_stack,y_stack).predict(X_test_stack) tt=pd.DataFrame({'PassengerId':test.PassengerId,'Survived':pred}) tt.to_csv('submission.csv',index=False)
趋势报告、案例精选、最新洞察 第一时间与您分享
【拓端数据 】第三方数据服务提供商,提供全面的统计分析与数据挖掘咨询服务,为客户定制个性化的数据解决方案与行业报告等。
中国专业的统计分析和数据挖掘咨询服务商:拓端数据(商务合作请联系官网客服)
帅的小伙伴都关注了拓端数据团队^..^~
QQ交流群:
微信公众号:拓端数据
淘宝店铺:大数据部落
微信客服号:lico_9e
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点}

我要回帖

更多关于 s7参加队伍 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信