数据挖掘matlab泰坦尼克对比分析_数据挖掘matlab泰坦尼克对比分析


介绍:通过逻辑回归算法,解决kaggle网站上的泰坦尼克生存情况预测问题,准确率在80%左右。

一、提出问题

什么样的人在泰坦尼克号中更容易存活?

二、理解数据

2.1 数据来源

数据来自kaggle,为方便大家联习,已经上传至百度云,点击下载就即可。

链接:https://pan.baidu.com/s/1N_rSAUxJRDm02wtWv4_jBQ

提取码:g474

2.2 导入数据


#忽略警告提示
import warnings
warnings.filterwarnings('ignore')

#导入数据
import pandas as pd 
train_file = pd.read_csv('Titanic-master/Titanic-master/train.csv')
test_file = pd.read_csv('Titanic-master/Titanic-master/test.csv')

#数据集信息
train_file.shape
print("训练数据集信息",train_file.shape,'测试数据集信息',test_file.shape)


数据挖掘matlab泰坦尼克对比分析_数据_02


测试数据集比训练数据集少一列,是因为测试数据集里没有生存情况这一列,这一列是需要我们通过构建模型进行预测的。


#将两个表合并一起处理数据
full_data=train_file.append(test_file,ignore_index = True)
full_data.info()


数据挖掘matlab泰坦尼克对比分析_titanic数据集_03


各个字段信息对应的意思如下


数据挖掘matlab泰坦尼克对比分析_大数据测试数据集_04


三、数据集清理

包括数据预处理和特征工程两部分。

首先进行数据预处理:

  1. 选择子集,导入研究问题需要的变量
  2. 列名重命名(如果列名不符合使用习惯)
  3. 缺失值处理
  4. 数据类型转换(比如将字符串类型的销售数量转换为数值类型)
  5. 数据排序(排序可以帮助我们发现更多有价值的信息)
  6. 异常值处理(比如数值超过定义范围)

从上文对数据集的初步分析可以知道,只需要对数据集中的缺失值和异常值进行处理即可,因为机器学习中的特征的传入值不能是空值。


# 数据的清洗  
#缺失值的填充   
#age 用平均值填充  fillna 需要返回一个值  
full_data['Age']  = full_data['Age'].fillna(full_data['Age'].mean())
full_data.info()


数据挖掘matlab泰坦尼克对比分析_titanic数据集_05


#embarked 缺少较少,用最大众数填充
full_data['Embarked'].value_counts()

#S 填充空值
full_data['Embarked']=full_data['Embarked'].fillna('S')
full_data['Embarked'].shape


数据挖掘matlab泰坦尼克对比分析_titanic数据集_06


#cabin 缺失值较大,用unknow的u填充
full_data['Cabin']=full_data['Cabin'].fillna('U')
full_data['Cabin'].shape


数据挖掘matlab泰坦尼克对比分析_数据挖掘matlab泰坦尼克对比分析_07


因为生存情况Survived属于标签,是用来做学习预测的,所以不需要进行处理。

接下来进行特征工程:

特征工程就是最大限度的从原始数据中提取特征,以供机器学习算法和模型使用。

“数据和特征决定了机器学习的上限,模型和算法只是逼近这个上限”


#sex 男 0 女 1
sex_number ={'male': 0,'female':1}
full_data['Sex']=full_data['Sex'].map(sex_number)
full_data.head()


数据挖掘matlab泰坦尼克对比分析_大数据测试数据集_08


登船港口Embarked:

使用数据框的get_dummies对登船港口进行one-hot编码


#embarked
embarked_onehot=pd.DataFrame()
embarked_onehot=pd.get_dummies(full_data['Embarked'],prefix='Embarked')
embarked_onehot.head()


数据挖掘matlab泰坦尼克对比分析_数据挖掘matlab泰坦尼克对比分析_09


#将embarked添加到表中
full_data.drop('Embarked',axis =1,inplace=True)
full_data=pd.concat([full_data,embarked_onehot],axis=1)
full_data.head()


#pclsss
pclass_onehot=pd.DataFrame()
pclass_onehot=pd.get_dummies(full_data['Pclass'],prefix='Pclass')
pclass_onehot.head()


数据挖掘matlab泰坦尼克对比分析_数据挖掘matlab泰坦尼克对比分析_10


#将pclass并入到表中
full_data=pd.concat([full_data,pclass_onehot],axis=1)

full_data.drop('Pclass',axis=1,inplace = True)
full_data.head()


cabin,需要提取首字母,可以看出船舱号首字母是船舱类别,可以提取出首字母作为船舱类别。


# cabin 需要截取第一个作为特征
full_data['Cabin']=full_data['Cabin'].map(lambda x:x[0:1])
cabin_onehot = pd.DataFrame()
cabin_onehot=pd.get_dummies(full_data['Cabin'],prefix='Cabin')
cabin_onehot.head()


数据挖掘matlab泰坦尼克对比分析_数据_11


#合并
full_data=pd.concat([full_data,cabin_onehot],axis=1)
#删除cabin列
full_data.drop('Cabin',axis= 1,inplace= True)
full_data.head()


家庭大小familysize:除了以上比较明显的分类数据之外,还可以通过对数据进行处理得到新的分类数据,比如通过计算家庭成员的多少来进行家庭大小分类。

有两个变量SibSp(同代直系亲属数),Parch(不同代直系亲属数),将这两个变量相加,再加上乘客自己,就可以得到家庭人数。

首先定义一个空的数据框,用来存放处理之后的家庭类别数据,再通过map()函数和lambda条件判断,得出家庭类别


# 称呼对应头衔
#忽略 Name 这一块
#继续处理家庭的大小 = Parch+SibSp+1

family_df = pd.DataFrame()
family_df['family_size']=full_data['Parch']+full_data['SibSp']+1
family_df.describe()


数据挖掘matlab泰坦尼克对比分析_数据挖掘matlab泰坦尼克对比分析_12


# family_single 一个人    family_normal 2-4人    family_large >5
family_df['family_single']=family_df['family_size'].map(lambda x: 1 if x == 1 else 0)
family_df['family_normal']=family_df['family_size'].map(lambda x : 1 if x >=2 and x<=4 else 0)
family_df['family_large']=family_df['family_size'].map(lambda x: 1 if x >=5 else 0)
family_df.head()


数据挖掘matlab泰坦尼克对比分析_数据挖掘matlab泰坦尼克对比分析_13


#合并
full_data=pd.concat([full_data,family_df],axis=1)
# 特征提取后的结果
full_data.shape


数据挖掘matlab泰坦尼克对比分析_大数据测试数据集_14


2 特征选择

特征提取已经完成,接下来进行特征选取,这里用最简单的方法:相关系数方法,来筛选特征。

首先用df.corr()生成相关系数矩阵


#生成相关系数矩阵
full_corr=full_data.corr()
full_corr.head()


数据挖掘matlab泰坦尼克对比分析_titanic数据集_15


#排序
full_corr['Survived'].sort_values(ascending=False)


数据挖掘matlab泰坦尼克对比分析_数据挖掘matlab泰坦尼克对比分析_16


#合并正相关和负相关比较大的特征
full_s=pd.concat([full_data['Sex'],full_data['Fare'],pclass_onehot,family_df,cabin_onehot,embarked_onehot],axis=1)
full_s.head()


四、 构建模型

Kaggle上提供了两个数据集train.csv和test.csv。实质上train.csv是作为原始数据,供我们来训练模型评估模型的,test.csv为预测数据,里面没有包含生存情况,需要我们用模型进行预测并将结果提交给kaggle的。为了后文分析方便,将train.csv称为原始数据集sourse,test.csv称为预测数据集predict。


# 构建模型
# 提取 source 原始数据  predict 测试数据
print('训练数据的大小:',train_file.shape,'测试数据的大小:',test_file.shape)


数据挖掘matlab泰坦尼克对比分析_大数据测试数据集_17


source_x=full_s.loc[0:890,:]
source_y=full_data.loc[0:890,'Survived']
predict_x=full_s.loc[891:,:]
print('原始数据大小',source_x.shape,'预测数据大小',predict_x.shape)


数据挖掘matlab泰坦尼克对比分析_测试数据_18


再从原始数据中拆分出训练数据和测试数据:


from sklearn.cross_validation import train_test_split
#将测试数据分割成测试数据和训练数据 ,比例0.8
train_x,test_x,train_y,test_y=train_test_split(source_x,source_y,train_size=0.8)


通过查看原始数据的标签,可以发现泰坦尼克号的生存情况预测属于一个二分分类的情况,本文利用最简单的逻辑回归算法。


#导入逻辑回归模型
from sklearn.linear_model import LogisticRegression
#构建逻辑回归模型
model = LogisticRegression()
#训练模型
model.fit(train_x,train_y)


数据挖掘matlab泰坦尼克对比分析_大数据测试数据集_19


五 模型评估

测试数据查看模型准确率:


#查看准确度
model.score(test_x,test_y)


数据挖掘matlab泰坦尼克对比分析_数据_20


用模型对预测数据进行预测:


#模型评估
#预测survived
predict_x.head()
predict_y=model.predict(predict_x)
predict_y=predict_y.astype(int)
#合并表
passage_id=full_data.loc[891,'PassengerId']
predf= pd.DataFrame({'PassengerId':passage_id,'Survived':predict_y})
predf.head()
predf.shape
#导出csv
predf.to_csv('titanic_pred.csv',index=False)


数据挖掘matlab泰坦尼克对比分析_大数据测试数据集_21


end.