基于tflearn和全连接神经网络方法做kaggle上 titanic的题目

在我学习用tflearn过程中,发现,其实在tflearn官网上由example,就是做一个titanic的题目。


那么言归正传,我们首先从kaggle上下载下来列train.csv和test.csv两个文件,使用tflearn中的load_csv来读取train.csv文件

如何读取文件的代码如下:

import numpy as np
import tflearn
import csv

# Load CSV file, indicate that the first column represents labels
from tflearn.data_utils import load_csv
data, labels = load_csv('train.csv', target_column=1,
                        categorical_labels=True, n_classes=2)
target_column=1,就是csv文件读取的第二列(=0为第一列),为标签;categorical_labels=True意思是是否有标题行(csv文件中有标题行),n_class=2意思两类。


接下来是数据预处理过程,其实数据预处理过程比构建网络麻烦。我建立了几个函数:

def preprocess(data):
    
    print data[0]
    
    data=np.delete(data,[],axis=1)   
    
    for i in range(len(data)):
        if data[i][3]=='male':
            data[i][3]=1
        else:
            data[i][3]=0

    #上船港口转为数字,缺失众数补足
    for i in range(len(data)):
        if data[i][10]=='S':
            data[i][10]=1
        elif data[i][10]=='C':
            data[i][10]=2
        elif data[i][10]=='Q':
            data[i][10]=3
        else:
            data[i][10]=1
    
    print data[0]

    #年龄缺失,平均数补足
    data[:,4]=supple(data[:,4])
    #船票价格平均数补足
    data[:,8]=supple(data[:,8])
    
    
    #0:ID 1:客仓等级 2:姓名 3:性别 4:年龄 5:亲朋 6:至亲 7:船票编号 8:价格 9:客仓位置 10:上船口
    #最后去掉不相关的ID、姓名、船票编号、客舱位置
    data=np.delete(data,[0,2,7,8,9,10],axis=1)   
    
    return data


def supple(data):
    age_sum=0
    age_num=0
    #求平均
    for i in range(len(data)):
        if data[i]!='':
            age_num += 1
            age_sum += float(data[i])
    age_mean=age_sum/age_num
    #空白处平均补充
    for i in range(len(data)):
        if data[i]=='':
            data[i]=age_mean
    return data

可以知道,根据读取的数据(出去标签列),每一列都代表着一类特征:

0:ID 1:客仓等级 2:姓名 3:性别 4:年龄 5:亲朋 6:至亲 7:船票编号 8:价格 9:客仓位置 10:上船口

在process函数中,将male和female量化为1和0; 将上船港口数字量化,缺失数据众数补齐(我看了一眼,感觉1为众数,就最后都补1);其他诸如价格、年龄都使用平均数补足数据缺失(平均数补足函数supple),最后在process函数中detele掉无关的类别。


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------下面是构建网络和训练部分

data=preprocess(data)


# Build neural network

net = tflearn.input_data(shape=[None, 5])
net = tflearn.fully_connected(net, 8)
net = tflearn.fully_connected(net, 32)
net = tflearn.fully_connected(net, 64,activation='relu')
net = tflearn.fully_connected(net, 16)
net = tflearn.fully_connected(net, 2, activation='softmax')
net = tflearn.regression(net)

'''
net = tflearn.input_data(shape=[None, 5])
net = tflearn.fully_connected(net, 10)
net = tflearn.fully_connected(net, 32)
net = tflearn.fully_connected(net, 10)
net = tflearn.fully_connected(net, 2, activation='softmax')
net = tflearn.regression(net,optimizer='adam',
                     loss='softmax_categorical_crossentropy',
                     learning_rate=0.01)

'''


# Define model
model = tflearn.DNN(net,tensorboard_verbose=3)
# Start training (apply gradient descent algorithm)
model.fit(data, labels, n_epoch=16, batch_size=16, show_metric=True)
#model.save('titanic_model.tflearn')
#model.load('titanic_model.tflearn')
没什么好解释的,用tflearn构建网络就是快哈。


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

接下来是测试部分

测试集csv我稍微处理列一下,因为测试集里没有label,所以我添加了一列test_label,读取和测试并写入csv文件代码如下:

test_data ,test_labels= load_csv('test.csv',target_column=1,
                                 categorical_labels=True, n_classes=1)
test_data=preprocess(test_data)

a=[]
b=[]
c=[]
for i in range(len(test_data)):
    pred = model.predict([test_data[i]])

    
    if pred[0][1]>0.5:
        a.append(1)
    else:
        a.append(0)
    b.append(892+i)

c=[b,a]
c=np.transpose(c)    


with open("answer.csv","w") as csvfile: 
    writer = csv.writer(csvfile)
    
    writer.writerow(["PassengerId","Survived"])
    for r in c:
        writer.writerows([r])
同样的,测试及数据也需要经过预处理,和训练集中的一样。得到测试结果后,设立阈值,大于0.5的为1,小于等于0.5的为0,写入名字为anseer.csv的文件中。即可以上传到kaggle中去测试




备注:

多次训练得到的结果会不相同,同时网络改变,激活函数、训练次数等超参数的改变也会产生一些影响。这就需要不断尝试了。

由于数据量不多,而且生死的问题也不是靠数据就能够真实反应的,所以用几个数据取判断是否生存还是挺难确切的,不知道kaggle上那些100%正确的人是怎么做到的。

代码和数据集上传到github中了:https://github.com/moshuilanting/titanic


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值