在我学习用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