本文是机器学习实战片,例子是kaggle上老经典的例子了,Titanic生存预测 目的是了解机器学习的大体流程。文末百度网盘链接中包含本文用到的数据集和代码。
环境 win8, python3,jupyter notebook
目录
项目背景
数据概览
数据预处理
特征分析
特征工程
构建模型
1.项目背景 泰坦尼克号是当时世界上体积最庞大内部设施最豪华的客运轮船,当时泰坦尼克号的乘船事件可谓轰动全球,相信大家都看过那部经典电影。泰坦尼克号将乘客分为三个等级: 三等舱位于船身较下层也最便宜,一等舱是整艘船最为昂贵奢华的部分,二等舱在其中间。在这次灾难中能否幸存下来难免会有些运气成分, 但是有些人比其他人更可能生存下来, 比如妇女, 儿童和上层阶级。在电影中出现过让”女人和孩子先走“的台词。
2.数据概览 项目共提供了两份数据,train.csv文件作为训练集构建与生存相关的模型;另一份test.csv文件则用作测试集, 用我们构建出来的模型预测生存情况.
字段
字段含义
PassengerId
乘客编号
Survived
是否生还,0表示未生还,1表示生还
Pclass
船票种类,折射处乘客的社会地位,1表示上层阶级,2表示中层阶级,3表示底层阶级
Sex
性别,男性为male,女性为female
Age
年龄,不满1岁的年龄为小数
SibSp
该乘客同船的兄弟姐妹及配偶的数量
Parch
该乘客同船的父母以及儿女的数量
Ticket
船票编号
Fare
买票的费用
Cabin
船舱编号
Embarked
代表在哪里上的船
2.1读取数据: 1 2 3 import pandas as pd train = pd.read_csv('..\train.csv')test = pd.read_csv('..\test.csv')
2.2查看前五行数据
2.3查看数据表整体信息 1 2 train.info () test.info ()
3.数据预处理 训练集中 Age Embarked Cabin有缺省值 测试集中 Age Fare Cabin有缺省值 但根据经验常识Cabin船舱编号排除在特征外
train['Embarked'].value_counts()
3.1对缺失值进行填充 1 2 3 4 train['Embarked' ] .fillna ('S' ,inplace=True) train['Age' ] .fillna (train['Age' ] .mean (),inplace=True) test['Age' ] .fillna (test['Age' ] .mean (),inplace=True) test['Fare' ] .fillna (test['Fare' ] .mean (),inplace=True)
3.2类型转换 数据类型转换格式如下:运用函数astype()
1 train['Age' ] = train['Age' ] .astype (int)
4.特征分析 在11个特征中, 哪些是和幸存相关的呢?
Sex 在泰坦尼克号的电影中,有句台词是让女人和小孩先走,这里的性别肯定相关性高了,我们看看数据
1 2 3 4 5 6 7 8 9 import seaborn as snsimport matplotlib.pyplot as pltfrom pylab import mpl mpl.rcParams['font.sans-serif' ] = ['SimHei' ] #解决seaborn中文字体显示问题 plt.rcParams["figure.dpi" ] =mpl.rcParams['axes.unicode_minus' ] = False # 解决保存图像是负号'-' 显示为方块的问题 %matplotlib inline train[train['Survived' ]==1 ].groupby('Sex' )['Survived' ].value_counts() sns.barplot(x='Sex' ,y='Survived' ,data=train)
可以从柱状图中看出男女的生成比例很明显的不一样。所以Sex是一个强特征。
Pclass 对于船舱等级, 一等舱是整个船最昂贵奢华的地方, 有钱人才能享受, 想必一等舱的有钱人比三等舱的穷人更容易幸存, 到底是不是呢? 用数据说话
1 2 sns.pointplot (x='Pclass' ,y='Survived' ,hue='Sex' ,data=train ,palette={'male' :'blue' ,'female' :'pink' },markers=['*' ,'o' ] ,linestyles=['-' ,'--' ] )
可以看到一等舱人员的幸存机会远大于三等舱, 果然和船舱等级相关.
Age 可以看到女人普遍存活率都很高,男性在0-10岁之间存活率高,显然年龄是有影响的。
SibSp 从之前的描述性统计了解到, 兄弟姐妹与配偶的人数最多为8, 最少为0, 哪个更容易生存呢? 可以看出关键时候,有兄弟姐妹和配偶的会提高存活几率,1到2个为宜,多了容易全部die
Parch 该乘客同船的父母以及儿女的数量,看看船上有父母孩子的存活率会不会更高呢? 由上图可以看吹1-3个存活率会更高,毕竟人多力量大。但这个力量也不能太大,太大容易翻船哈哈哈。
5.特征工程 对分类特征进行向量化
1 2 3 4 5 6 7 8 from sklearn.feature_extraction import DictVectorizer dict_vec = DictVectorizer(sparse =False ) X_train = dict_vec.fit_transform(X_train.to_dict(orient ='record' )) X_test = dict_vec.fit_transform(X_test.to_dict(orient ='record' ))
6.构建模型 使用随机森林和Xgboost分别进行模型训练
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #从sklearn.ensemble中导入RandomForestClassifier from sklearn.ensemble import RandomForestClassifier #使用默认配置初始化RandomForestClassifier rfc = RandomForestClassifier () #使用默认配置的RandomForestClassifier进行预测操作 rfc.fit (X_train,y_train) rfc_y_predict = rfc.predict (X_test) rfc_submission = pd.DataFrame ({'PassengerId' :test['PassengerId' ] ,'Survived' :rfc_y_predict}) rfc_submission.to_csv ('D:\\Pywork\\Titanic\\rfc_submission.csv' ,index=False) from sklearn.cross_validation import cross_val_score #使用5 折交叉验证的方法在训练集上分别对默认配置的RandomForestClassifier以及XGBClassifier进行性能评估,并获得平均分类准确性的得分cross_val_score (rfc,X_train,y_train,cv=5 ) .mean () #从流行包xgboost中导入XGBClassifier进行交叉验证 from xgboost import XGBClassifier xgbc = XGBClassifier ()cross_val_score (xgbc,X_train,y_train,cv=5 ) .mean ()
使用并行网络的方式寻找更好的超参数组合,以期待进一步提高XGBClassifier的预测性能
1 2 3 4 5 6 from sklearn.grid_search import GridSearchCV params = {'max_depth' :[i for i in range(2,7)] ,'n_estimators' :[j for j in range(100,1100,200)] ,'learning_rate' :[0.05,0.1,0.25,0.5,0.1] } xgbc_best = XGBClassifier () gs = GridSearchCV (xgbc_best,params,n_jobs=-1 ,cv=5 ,verbose=1 ) gs.fit (X_train,y_train)
检查优化完成后的超参数配置 print(gs.best_score_) print(gs.best_params_)
最后进行模型预测
1 2 3 4 5 xgbc_best_y_predict = gs.predict(X_test) xgbc_best_submission = pd.DataFrame({'PassengerId' :test['PassengerId' ],'Survived' :xgbc_best_y_predict}) xgbc_best_submission.to_csv('D:\\Pywork\\Titanic\\xgbc_best_submission.csv' ,index =False )
想要以上涉及到的源代码可以联系我 邮箱:yuting9597@163.com 百度网盘:https://pan.baidu.com/s/1vGq4Et2gReM58Dr_1O-v3Q 密码:uoqv
参考文章: