这几天开始在Kaggle上实践一下一些机器学习的算法,这次用的是决策树(没有剪枝)。
题目意思是给出一部分泰坦尼克号上乘员的信息(几等舱,名字,性别。。。)和是否存活,要求预测另一部分人的生存情况
不论用什么算法,首先都要做数据处理:
1、名字:
外国人的名字中包含了本人身份和年龄信息(也就是‘Mr,Miss’这些),所以可以通过综合两个数据集统计其种类再对所有的名字归类
def initTicketSet(data):
global ticketList
ticketSet = set(ticketList)
for row in data:
temStr = str(row[-4])
if not temStr.isdigit() and len(temStr) > 0:
prefix = temStr.split()[0].replace('.', '')
ticketSet.add(prefix)
ticketList = list(ticketSet)
上面是统计部分的代码
2、几等舱,亲戚数量,性别
这三者也是重要参考因素,因为头等舱生存概率大的多而且在逃亡时人数会影响速度最终可能GG
至于性别,可以简单的统计发现妇女存活率会高很多
由于数据本身格式已经可以用了所以不加处理
3、年龄
首先考虑年龄与体力,以及道德素养间的关系再加上粗略的生存率统计可以发现年龄对生存率有极大的影响。
本文将年龄分为5种(0~10, 10~18, 18~35, 35~50, 50~100)。。全凭直觉分的。。
由于数据较为残缺,所以通过(几等舱, 名字特征, 亲朋, 家属, 票价)这几项建立决策树对年龄进行预测
4、票价
有网友说票价和生存率有线性关系,而且可以脑补的是有钱的仓位一定不错
通过Excel画图统计大概讲票价分为(0~10, 10~20, 20~40, 40~100, 100~600)
5、仓位,上船地点,票的编号
仓位对生存率有重要的影响,接近救生艇的仓位更容易活下来 。但是仓位信息非常残缺,所以又通过(上船地点,票的编号。。)这些建树预测
实际模型:
不知是什么原因加上仓位后的模型正确率还不如不加。。
所以实际模型只包含(1, 2, 3, 4)
分类函数代码:
def classify(tree, fetureNames, inX, defaultVal):
firstStr = tree.keys()[0]
fetureIndex = fetureNames.index(firstStr)
childDict = tree[firstStr]
classLabel = defaultVal
flag = False
for child in childDict.keys():
if inX[fetureIndex] == child:
if type(childDict[child]).__name__ == 'dict':
classLabel = int(classify(childDict[child], fetureNames, inX, defaultVal))
else :
classLabel = int(childDict[child])
flag = True
break
if not flag:
tem = [0] * 50
for child in childDict.keys():
if type(childDict[child]).__name__ == 'dict':
tem[classify(childDict[child], fetureNames, inX, defaultVal)] += 1
else :
tem[int(childDict[child])] += 1
y = sorted(tem, reverse=True)
if y[0] > y[1]:
classLabel = tem.index(y[0])
return classLabel
总计25次提交,最高0.78469