kaggle入门题Titanic

集成开发环境:Pycharm

python版本:2.7(anaconda库)

用到的库:科学计算库numpy,数据分析包pandas,画图包matplotlib,机器学习库sklearn

大体步骤分为三步:

1.数据分析

2.交叉验证

3.预测并输出结果

导入库函数

import numpy as np
import pandas as pa
import matplotlib.pyplot as pl
from sklearn.linear_model import LogisticRegression
from sklearn import model_selection
# 最后一个库是原来cross_validation的替代,原来那个过时了,再用会有警告,其实里边的函数都没变

第一步:数据分析

1.1通过画图分析出数据中对预测影响很小的特征值,忽略这些特征可以减小工作量

 1 # pandas库里的read_csv可以把csv文件读取为dataFrame对象,这个对象就是很多列(数组)共享一个index,这个index 是真的存在的且可以指定,每一列都有name
 2 # 其形状大小是真实数据的形状,不包括index和name
 3 # 路径可以是绝对路径和相对路径,注意路径中的反斜线是两根,或者一根/
 4 train_obj = pa.read_csv(‘train.csv‘)
 5 test_obj = pa.read_csv(‘test.csv‘)
 6
 7 # 首先把一看就知道对结果没有影响的数据去掉
 8 # DataFrame对象的drop方法:删除行或者列,可以多行,drop(‘行名或者列名‘,axis=0/1(0是行,1是列)),多个行名或者列名:[‘‘,‘‘]
 9 trainData = train_obj.drop([‘Name‘, ‘Ticket‘, ‘Cabin‘], axis=1)
10 testData = test_obj.drop([‘Name‘, ‘Ticket‘, ‘Cabin‘], axis=1)
11
12 # 下面用画图的形式对其他变量对最后结果的影响作出判断:
13 # 首先考察船舱和性别,用groupby函数对的数据进行分类,groupby(‘列名‘),根据给出的列,把具有相同数值的合为一组,组数为列值的种数
14 # 如果groupby([‘列名1‘,‘列名2‘]),则列1为分大类,大类中再根据列2进行分类
15 train_group1 = trainData.groupby([‘Sex‘, ‘Pclass‘])  # 返回类型是Groupby类型,里边有key1*key2组
16 # sum()是将各组内每个特征的所有数据相加,返回也是key1*key2组,只不过每组里只有一行数据,是所有数据之和
17 # count()是统计各组每个特征的数据量(由于有缺失数据,所以各个特征间是不一定一样的)
18 rate = (train_group1.sum() / train_group1.count())[‘Survived‘]  # 有6组,每组都只有一个值,生存率
19
20 # 下面开始画图,柱状图
21 x = np.array([1, 2, 3])
22 wi = 0.3
23 # bar(left,height,width,color)用来化柱状图,参数分别是每个柱子的左侧位置坐标,高度(一般就是数据),宽度,颜色,前三个一般都是集合
24 pl.bar(x, rate.female, wi, color=‘r‘)
25 pl.bar(x, rate.male, wi, color=‘b‘)
26 pl.title("survived rate")
27 # 坐标轴名称
28 pl.xlabel("Pclass")
29 pl.ylabel("rate")
30 # 指定网格线格式
31 pl.grid(True, linestyle=‘-‘, color=‘0.7‘)
32 # 轴的刻度
33 pl.xticks([1, 2, 3])
34 # arange(起点,终点,间隔),创建一个等差序列
35 pl.yticks(np.arange(0.0, 1.1, 0.1))
36 # 对不同的柱做标记
37 pl.legend([‘female‘, ‘male‘])
38 # pl.show()
39 # 接下来的过程和上边差不多,分别是判断了年龄、上船地点、船上亲属人数

1.2数据预处理,将特征中比较相似的直接相加作为一个,非数值类型转为数值类型,对缺失值进行处理

 1 # 船上的亲属人数就是把两个代表家属的变量相加
 2 trainData[‘family‘] = trainData[‘SibSp‘] + trainData[‘Parch‘]
 3 # pandas中的map()函数一般是用来进行数据转换的,参数是函数或者字典,一个series调用map(),会对照字典用的key,将series中的key全部改成相应的value,map()函数返回一个新的,对源对象不操作
 4 trainData[‘Sex‘] = trainData[‘Sex‘].map({‘female‘: 0, ‘male‘: 1})
 5 trainData[‘Embarked‘] = trainData[‘Embarked‘].map({‘C‘: 0, ‘Q‘: 1, ‘S‘: 2})
 6 # numpy.isnan()函数的作用是返回一个Boolean数组,对应input的下标,若当前位置是nan那么就是true,否则false
 7 # 对一个数组挑选时可以用array[True,False,True...]True就是选择
 8 # 挑选出age为nan的,这个集合不用age这个特征,做四特征预测
 9 train_age_nan = trainData[np.isnan(trainData[‘Age‘])]
10 # 挑选出age不为空的数据,直接调用dropna(),这个方法会去掉输入数组中有nan特征的数据,挑选后的具备所有特征,所以可以用所有特征
11 train_all = trainData.dropna()
12 # 对于以上两个数据集分别挑选出需要的特征组成训练集,因为之前已经确认了有的是对结果没有影响的,所以可以只挑选有用的
13 # dataframe选取列的格式是两个方括号,[[‘列名‘,‘列名‘]]
14 train_five = train_all[[‘Sex‘, ‘Embarked‘, ‘family‘, ‘Age‘, ‘Pclass‘]]
15 train_four = train_age_nan[[‘Sex‘, ‘Embarked‘, ‘family‘, ‘Pclass‘]]
16
17 # 两个数据集的标记数组
18 train_five_label = train_all[‘Survived‘]
19 train_four_label = train_age_nan[‘Survived‘]
20
21 # 至此处理数据工作全部完成,接下来就是训练模型

2.交叉验证

 1 # 使用分类器类
 2 classifier = LogisticRegression(C=10000)  # 这个作为5特征分类器,这里的c是正则化系数,防止系统由于过于复杂而产生过拟合
 3 # 调用cross_validation.cross_val_score(分类器,data,target,cv),这个函数返回每次交叉验证的准确率,方法是StratifiedKFold,具体看http://blog.sina.com.cn/s/blog_6a90ae320101a5rc.html
 4 # 函数返回一个数组
 5 score = model_selection.cross_val_score(classifier, train_five, train_five_label, cv=5)  # 交叉验证
 6 classifier2 = LogisticRegression()  # 这个作为4特征分类器
 7 score2 = model_selection.cross_val_score(classifier2, train_four, train_four_label, cv=5)  # 交叉验证
 8 # 查看平均值
 9 print score.mean()
10 print score2.mean()

3.输出结果

 1 # 下面开始输出结果
 2
 3 # 首先处理测试集
 4 testData[‘Sex‘] = testData[‘Sex‘].map({‘female‘: 0, ‘male‘: 1})
 5 testData[‘Embarked‘] = testData[‘Embarked‘].map({‘C‘: 0, ‘Q‘: 1, ‘S‘: 2})
 6 testData[‘family‘] = testData[‘SibSp‘] + testData[‘Parch‘]
 7 # 这里不能用两个数据集,因为如果将数据分开分别判断,那么无法和乘客号对应
 8 # 读取官方结果
 9 answer = pa.read_csv(‘gender_submission.csv‘)
10
11 # 训练分类器
12 classifier.fit(train_five, train_five_label)
13 classifier2.fit(train_four, train_four_label)
14
15 # 输出测试集结果
16 passengers = pa.DataFrame(testData[‘PassengerId‘])
17 # 这里必须先创建一个列,直接赋值会出错
18 passengers[‘Survived‘] = ‘‘
19 # isnan()是numpy库里的函数
20 #这里有个问题就是如果直接对passengers[‘Survived‘][i]每行赋值的话会有SettingCopyWarning警告,正确的方法是先生成一个数组temp,然后把数组赋值给列,直接添加会有警告
21 temp = np.zeros(passengers.shape[0])
22 for i in range(len(testData)):
23     if np.isnan(testData[‘Age‘][i]):
24         # 这里也有一个问题:由于需要一个一个做预测,但是predict函数要求输入二维数组,单行数据是一维的
25         #所以要把数据转为numpy中的array,然后转为二维数组
26         #reshape()函数可以利用原数组数据改变数组的尺寸,但是主要新旧数组数据量相同,而reshape(1,-1)可以将[xxx]转为[[xxx]]这种,就可以用了
27         temp[i] = classifier2.predict(np.array( testData[[‘Pclass‘, ‘Sex‘, ‘Embarked‘, ‘family‘]].ix[i].dropna()).reshape(1,-1))
28     else:
29         temp[i] = classifier.predict(np.array(testData[[‘Sex‘, ‘Embarked‘, ‘family‘, ‘Age‘, ‘Pclass‘]].ix[i]).reshape(1,-1))
30 passengers[‘Survived‘] = temp
31 # 结算准确率
32 acc = 1 - float(sum(abs(answer[‘Survived‘] - passengers[‘Survived‘]))) / len(passengers)
33 print acc
34 # 输出文件
35 passengers.to_csv(‘result.csv‘,encoding=‘utf-8‘,index=False)

  

时间: 2024-10-09 06:52:14

kaggle入门题Titanic的相关文章

kaggle入门之Titanic生存预测

比赛说明 RMS泰坦尼克号沉没是历史上最臭名昭着的沉船之一.1912年4月15日,在她的处女航中,泰坦尼克号在与冰山相撞后沉没,在2224名乘客和机组人员中造成1502人死亡.这场耸人听闻的悲剧震惊了国际社会,并为船舶制定了更好的安全规定. 造成海难失事的原因之一是乘客和机组人员没有足够的救生艇.尽管幸存下沉有一些运气因素,但有些人比其他人更容易生存,例如妇女,儿童和上流社会. 在这个挑战中,我们要求您完成对哪些人可能存活的分析.特别是,我们要求您运用机器学习工具来预测哪些乘客幸免于悲剧. 目标

[kaggle入门] Titanic Machine Learning from Disaster

Titanic Data Science Solutions¶ https://www.kaggle.com/startupsci/titanic-data-science-solutions 数据挖掘竞赛七个步骤:¶ Question or problem definition. Acquire training and testing data. Wrangle, prepare, cleanse the data. Analyze, identify patterns, and explo

大数据竞赛平台——Kaggle 入门

大数据竞赛平台--Kaggle 入门篇 这篇文章适合那些刚接触Kaggle.想尽快熟悉Kaggle并且独立完成一个竞赛项目的网友,对于已经在Kaggle上参赛过的网友来说,大可不必耗费时间阅读本文.本文分为两部分介绍Kaggle,第一部分简单介绍Kaggle,第二部分将展示解决一个竞赛项目的全过程.如有错误,请指正! 1.Kaggle简介 Kaggle是一个数据分析的竞赛平台,网址:https://www.kaggle.com/ 企业或者研究者可以将数据.问题描述.期望的指标发布到Kaggle上

hdu 2767 Proving Equivalences(强连通入门题)

1 /************************************************* 2 Proving Equivalences(hdu 2767) 3 强连通入门题 4 给个有向图,求至少加多少条边使得图是所有点都是强连通的 5 由a->b->c->a易知n个点至少要n条边,每个出度和入度都要大 6 于1.先求所有所有强连通分量,把每个强连通分量看成一个点 7 在找每个点的出度和入度,最后还差的出度和入度的最大值就是 8 答案. 9 10 ************

hdu 5001 walk 概率dp入门题

Description I used to think I could be anything, but now I know that I couldn't do anything. So I started traveling. The nation looks like a connected bidirectional graph, and I am randomly walking on it. It means when I am at node i, I will travel t

hdu1796:容斥入门题

简单的容斥入门题.. 容斥基本的公式早就知道了,但是一直不会写. 下午看到艾神在群里说的“会枚举二进制数就会容斥”,后来发现还真是这样.. 然后直接贴代码了 #include <iostream> #include <stdio.h> #include<string.h> #include<algorithm> #include<string> #include<ctype.h> using namespace std; long l

hdu1695 GCD(莫比乌斯入门题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意: 给出n.m.k ,求出1<=x<=n, 1<=y<=m 且gcd(x,y) == k 的(x,y)的对数 解析: 显然就是求 [1,n/k] 与 [1, m/k]有多少数对的最大公约数是1 莫比乌斯入门题 我们设 为满足且和的的对数 为满足且和的的对数 那么,很显然,反演后得到 我们所需要的答案便是  f(1) = ∑i=1μ(i)*(n/i)*(m/i)  ,求解这个式

网络流最经典的入门题 各种网络算法都能AC。

Drainage Ditches 题目抽象:给你m条边u,v,c.   n个定点,源点1,汇点n.求最大流.  最好的入门题,各种算法都可以拿来练习 (1):  一般增广路算法  ford() 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <string&g

hdu 1754:I Hate It(线段树,入门题,RMQ问题)

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 33726    Accepted Submission(s): 13266 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的要求