小白kaggle竞赛(1)----Titanic

官网提供了三个数据文件

gender_submission.csv
train.csv
test.csv

第一个文件暂时没看出来有什么作用..

其它两个文件分别为训练数据和测试数据  我们需要对训练数据中的属性特征和存活关系进行分析 从中选择合适的特征用于模型训练

特征大多数是参照网上的分析完成的 等熟悉之后再添加一些新的东西=。=

用到python中的数据分析模块

import numpy as np
import pandas as pd
from pandas import Series,DataFrame

第一部分:数据分析

加载数据

data_train = pd.read_csv('F:\data\Kaggle\data\\titanic\\train.csv')
#共有891名乘客
     PassengerId  Survived  Pclass    ...         Fare        Cabin  Embarked
0              1         0       3    ...       7.2500          NaN         S
1              2         1       1    ...      71.2833          C85         C
2              3         1       3    ...       7.9250          NaN         S
3              4         1       1    ...      53.1000         C123         S
4              5         0       3    ...       8.0500          NaN         S
5              6         0       3    ...       8.4583          NaN         Q

使用python中的print打印出的数据显示不全  在网上查询有的说是编译器的问题=。= 这里用的是sublimetext3 

不过不影响啦 可以从excel中看

是有下面的方法查看数据的详细信息

data_train.info()
data_train.describe()
#详细信息
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB
None
Survived     count    891.000000
             mean       0.383838
             std        0.486592
             min        0.000000
             25%        0.000000
             50%        0.000000
             75%        1.000000
             max        1.000000

从这些可以看出  train.csv中Age、Embarked、Cabin属性都是有缺失的  

平均存活率为38...% 平均年龄29.69 等等等 

仅从这些不好进行分析  使用python第三方模块matplotlib对数据进行了可视化 可以更直观的观察特征和类别的关系

import matplotlib.pyplot as plt

python自带IDLE画布上无法显示中文 需要引入第三方模块

from pylab import * #识别中文字体
matplotlib.rcParams['font.sans-serif'] = ['SimHei']#w
fig = plt.figure()
fig.set(alpha = 0.2)#设定图表颜色alpha参数

plt.subplot(2, 3, 1)#将画布分为两行三列。在第一个位置画图
data_train.Survived.value_counts().plot(kind = 'bar')#柱状图
plt.title('存活情况(1表示获救)')
plt.ylabel('人数')
plt.tight_layout()#设置默认间距

plt.subplot(2, 3, 2)
data_train.Pclass.value_counts().plot(kind = 'bar')
plt.title('乘客等级')
plt.ylabel('人数')
plt.tight_layout()

plt.subplot(2, 3, 3)
plt.scatter(data_train.Survived, data_train.Age)#散点图
#scatter参数 (x, y, s(size), c(color), marker(markerStyle))
plt.ylabel('年龄')
plt.grid(b = True, which = 'major', axis = 'y')
plt.title('按年龄看获救分布')
plt.tight_layout()

plt.subplot(2, 3, (4, 5))
data_train.Age[data_train.Pclass == 1].plot(kind = 'kde')#密度图
data_train.Age[data_train.Pclass == 2].plot(kind = 'kde')
data_train.Age[data_train.Pclass == 3].plot(kind = 'kde')
plt.xlabel('年龄')
plt.ylabel('密度')
plt.title('各等级的乘客年龄分布')
plt.legend(('头等舱','二等舱','三等舱'), loc = 'best')
plt.tight_layout()

plt.subplot(2, 3, 6)
data_train.Embarked.value_counts().plot(kind = 'bar')
plt.title('各登船口岸上船人数')
plt.ylabel('人数')

plt.show()


观察客舱等级和乘客是否获救的关系

class_Survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts()
class_Survived_1 = data_train.Pclass[data_train.Survived == 1].value_counts()
pd.DataFrame({u'获救': class_Survived_1, u'未获救': class_Survived_0}).plot(kind = 'bar', stacked = True)
plt.title(u'各乘客等级的获救情况')
plt.xlabel(u'乘客等级')
plt.ylabel(u'人数')
plt.show()


可以看出 有钱人获救比例大些 客舱等级和获救有一定关联 可以把该特征作为训练特征之一

然后看性别和获救的关联:

sex_sur_0 = data_train.Sex[data_train.Survived == 0].value_counts()
sex_sur_1 = data_train.Sex[data_train.Survived == 1].value_counts()
pd.DataFrame({u'获救': sex_sur_1, u'未获救': sex_sur_0}).plot(kind = 'bar', stacked = True)
plt.title('按性别看获救情况')
plt.xlabel(u'性别')
plt.ylabel(u'人数')
plt.show()

可以看出 女性获救比例大些 

embark_sur_0 = data_train.Embarked[data_train.Survived == 0].value_counts()
embark_sur_1 = data_train.Embarked[data_train.Survived == 1].value_counts()
pd.DataFrame({'获救': embark_sur_1, '未获救': embark_sur_0}).plot(kind = 'bar', stacked = True)
plt.title('按登船口岸看获救情况')
plt.xlabel('登船口岸')
plt.ylabel('人数')
plt.show()


综合客舱等级和性别查看获救情况

fig = plt.figure()
fig.set(alpha = 0.2)
plt.title('根据客舱等级和性别的获救情况')

ax1 = fig.add_subplot(141)
data_train.Survived[data_train.Sex == 'female'][data_train.Pclass != 3].value_counts().plot(kind = 'bar', label = 'female highclass')
ax1.set_xticklabels(['获救','未获救'], rotation = 0)
ax1.legend(['女性/高级舱'], loc = 'best')
plt.tight_layout()

ax2 = fig.add_subplot(142, sharey = ax1)
data_train.Survived[data_train.Sex == 'female'][data_train.Pclass == 3].value_counts().plot(kind = 'bar', label = 'female highclass')
ax2.set_xticklabels(['获救','未获救'], rotation = 0)
ax2.legend(['女性/低级舱'], loc = 'best')
plt.tight_layout()

ax3 = fig.add_subplot(143, sharey = ax1)
data_train.Survived[data_train.Sex == 'male'][data_train.Pclass != 3].value_counts().plot(kind = 'bar', label = 'female highclass')
ax3.set_xticklabels(['获救','未获救'], rotation = 0)
ax3.legend(['男性/高级舱'], loc = 'best')
plt.tight_layout()

ax4 = fig.add_subplot(144, sharey = ax1)
data_train.Survived[data_train.Sex == 'male'][data_train.Pclass == 3].value_counts().plot(kind = 'bar', label = 'female highclass')
ax4.set_xticklabels(['获救','未获救'], rotation = 0)
ax4.legend(['男性/低级舱'], loc = 'best')
plt.tight_layout()
plt.show()


可以看出 上流社会的男性比较绅士 lady first践行的很好=。= 低级舱就稍微差一点了

下面再看一下有堂兄弟姐妹和父母小孩的人获救情况

##有堂兄弟姐妹的人的获救情况
sib_sur_0 = data_train.SibSp[data_train.Survived == 0].value_counts()
sib_sur_1 = data_train.SibSp[data_train.Survived == 1].value_counts()
pd.DataFrame({'获救': sib_sur_1, '未获救': sib_sur_0}).plot(kind = 'bar', stacked = True)
plt.title('有堂兄弟姐妹人的获救情况')
plt.xlabel('堂兄弟姐妹数')
plt.ylabel('人数')
plt.show()


##带父母小孩的人的获救情况
par_sur_0 = data_train.Parch[data_train.Survived == 0].value_counts()
par_sur_1 = data_train.Parch[data_train.Survived == 1].value_counts()
pd.DataFrame({'获救': par_sur_1, '未获救': par_sur_0}).plot(kind = 'bar', stacked = True)
plt.title('带父母小孩人的获救情况')
plt.xlabel('带父母小孩数')
plt.ylabel('人数')
plt.show()


可以看出 人越少越好逃脱 

至此 对于感兴趣的特征基本全部分析完了 下面对数据进行预处理

第二部分:数据预处理

第一部分对数据分析中 可以发现存在缺失值的情况  对缺失值可以补全或者丢弃 

这里选择对缺失值进行补全

#使用skleran中的RondomForest来拟合缺失的年龄数据
from sklearn.ensemble import RandomForestRegressor
def set_missing_ages(df):

	#提取已有的数值型特征 放入RandomForestRegressor
	age_df = df[['Age', 'Fare', 'Parch', 'SibSp', 'Pclass']]

	#将乘客分为已知年龄和未知年龄两部分
	known_age = age_df[age_df.Age.notnull()].as_matrix()
	unknown_age = age_df[age_df.Age.isnull()].as_matrix()

	# y即目标年龄
	y = known_age[:, 0]
	# x即特征属性值
	X = known_age[:, 1:]

	# fit到RandomForestRegressor之中
	rfr = RandomForestRegressor(random_state = 0, n_estimators = 2000,
		n_jobs = -1)
	rfr.fit(X, y)

	#用得到的模型进行未知年龄结果预测
	predictedAges = rfr.predict(unknown_age[:, 1::])

	#用得到的预测结果填补原缺失数据
	df.loc[(df.Age.isnull()), 'Age'] = predictedAges

	return df, rfr

def set_Cabin_type(df):
	df.loc[(df.Cabin.notnull()), 'Cabin'] = 'Yes'#将Cabin有值的替换为Yes
	df.loc[(df.Cabin.isnull()), 'Cabin'] = 'No'  #将Cabin空值的替换为No
	return df

data_train, rfr = set_missing_ages(data_train)
data_train = set_Cabin_type(data_train)
#========================特征因子化========================
#以Cabin为例
#原本Cabin取值为yes的,在此处的”Cabin_yes”下取值为1,在”Cabin_no”下取值为0
#原本Cabin取值为no的,在此处的”Cabin_yes”下取值为0,在”Cabin_no”下取值为1
#使用pandas的'get_dummies'来完成,并拼接在原来的'data_train'上
dummies_Cabin = pd.get_dummies(data_train['Cabin'], prefix = 'Cabin')
dummies_Embarked = pd.get_dummies(data_train['Embarked'], prefix = 'Embarked')
dummies_Sex = pd.get_dummies(data_train['Sex'], prefix = 'Sex')
dummies_Pclass = pd.get_dummies(data_train['Pclass'], prefix = 'Pclass')

df = pd.concat([data_train, dummies_Cabin, dummies_Embarked,
	dummies_Sex, dummies_Pclass], axis = 1)
df.drop(['Pclass', 'Name', 'Sex', 'Ticket', 'Cabin', 'Embarked'], axis = 1, 
	inplace = True)
#========================特征缩放========================
#使用preprocessing模块中的scaling
import sklearn.preprocessing as preprocessing

df['Age_scaled'] = preprocessing.scale(df['Age'])#scale方法缩放之后差距还是很大 上下5左右
df['Fare_scaled'] = preprocessing.scale(df['Fare'])
print(df)
#处理后的数据
     PassengerId  Survived     ...       Age_scaled  Fare_scaled
0              1         0     ...        -0.561380    -0.502445
1              2         1     ...         0.613171     0.786845
2              3         1     ...        -0.267742    -0.488854
3              4         1     ...         0.392942     0.420730
4              5         0     ...         0.392942    -0.486337

python跑数据实在是太慢了...为了提高速度 方便对模型进行训练 这里把预处理后的数据存为了文件 以便下次直接加载

df.to_csv('predata.txt', index = False)
##缩放之前的fare和age先丢弃
df.drop(['Age', 'Fare'], axis = 1, inplace = True)
df.to_csv('predata2.txt', index = False)

之后对测试集test.csv进行相同的预处理

第三部分:模型训练

这里直接调用了sklearn中的LogisticsRegression

加载数据

#加载训练数据集
path_train = 'F:\code\kaggle\predata2.txt'
data = np.loadtxt(path_train, dtype = float, encoding = 'utf-8', delimiter = ',')
#PassengerId,Survived,SibSp,Parch,Cabin_No,Cabin_Yes,Embarked_C,Embarked_Q,Embarked_S,
#Sex_female,Sex_male,Pclass_1,Pclass_2,Pclass_3,Age_scaled,Fare_scaled
X = data[:, 2:]
y = data[:, 1]

训练

clf = linear_model.LogisticRegression(C = 1.0, penalty = 'l1', tol = 1e-6)
clf.fit(X, y)

使用测试集进行测试 并将结果保存为csv文件

data_test = np.loadtxt(path_test, dtype = float, encoding = 'utf-8', delimiter = ',')

X_test = data_test[:, 1:]

predict = clf.predict(X_test)
result = pd.DataFrame({'PassengerId': range(892, 1310),
	'Survived': predict})
print(result)

#把结果保存到本地
result.to_csv('titanic_result.csv', index = False, encoding = 'utf-8')

Q.这里遇到了一个问题

clf.predict后的结果为浮点数  显示为

     PassengerId  Survived
0            892       0.0
1            893       0.0
2            894       0.0
3            895       0.0
4            896       1.0
5            897       0.0

这样在本地看没有什么问题 但是在kaggle中submit时 得分为0.0

将浮点数转换为int型后 提交后得分不是零了[ye]

predict = predict.astype(np.int)


============第一次先写到这里================

==============第二次更新==================

交叉验证

题目给的测试集没有survived  所以把训练集分成了两部分 用测试集部分来对模型准确率进行了测试

测试结果还是逻辑回归的准确率最高


用自己写的逻辑回归算法进行了一下训练  准确度0.5xx... 还不如sk里的baseline model



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值