Advertisement

python泰坦尼克号数据分析_Python数据分析|泰坦尼克逻辑回归

阅读量:

这是我的Python数据分析学习心得。今天做个经验分享:运用Python进行逻辑回归分析,并对泰坦尼克号乘客存活数据进行了预测。

#导入2个Python常用数据分析的库import numpy as npimport pandas as pd

特别提示:在Windows环境下,默认情况下无法直接打开带有路径的CSV文件。因此,请确保路径正确无误并使用r转义符处理 train = pd.read_csv(r"C:\ Users\ Administrator\ Desktop\ train.csv") test = pd.read_csv(r"C:\ Users\ Administrator\ Desktop\ test.csv") print('训练数据集:',train.shape,'测试数据集:',test.shape)

结果:该训练数据集共计891行、共12个特征;而测试数据集则包含418行、仅含有11个特征。值得注意的是,在测试集合中缺乏‘Survived’这一关键特征,并且我们随后计划利用逻辑回归模型来进行预测。

#初看数据概况#Pclass乘客舱位等级SibSp同行直系亲属数量Parch不同世代近亲数量Cabin房号Embarked上船地点Fare票价总额full.head()

结果:用head函数可以默认查看前5行数据,便于我们初步掌握数据概况。

#描述性数据统计full.describe()

分析结果显示,在进行数据预处理阶段时,基于描述性分析功能的应用能够有效提取关键特征参数。具体而言,在实际操作过程中通常会涉及的数据统计指标包括均值、标准差以及中位数等核心指标。

#检查每个字段的数据类型及其总数量# Survived, Age, Fare, Cabin, Embarked字段存在缺失 full.info()

通过info函数能够统计每列中的数据数量情况,从而帮助我们迅速识别出哪些列存在缺失数据

#数据预处理与缺失值填充策略#针对数据预处理阶段进行缺失值填充操作。对于数值型数据特征,则采用均值或中位数进行数值填补。例如年龄字段(Age)通常采用均值填补方式;同时费用字段(Fare)也遵循类似的填补策略。通过调用fillna函数对相应变量执行缺失值替换操作:具体而言是将年龄特征(full['Age'])的缺失值替换为其均值;并完成费用特征(full['Fare'])的相同操作。

分类数据采用众数类别进行替代;先通过调用value_counts函数获取该列各类别的出现次数full['Embarked'].value_counts()

观察到频率最高的类别是S,并因此选择用于填补full['Embarked']这个字段中的缺失值

#因Cabin缺失较多,用新的‘U’来表示(Unknow)full['Cabin'] = full['Cabin'].fillna('U')

#再次观察一下数据,发现除Survived之外,都已经填充完成full.info()

将性别字段转换为数值类型

sex_mapDict = {'male': 1, 'female': 0} # 创建一个映射字典
full['Sex'] = full['Sex'].map(sex_mapDict) # 使用该映射字典对'Sex'列进行重新编码
print("处理后的结果如下:")
print(full.head()) # 展示处理后的前五行数据

通过调用数据框中的函数get_dummies()对方程'Embarked'字段的数据执行one-hot编码转换, 创建一个新的空DataFrame对象embarkeddf, 并对方程'full[‘ Embark ed’] '的数据应用get_dummies函数, 并指定前缀为' Embark ed’, 最后显示该DataFrame对象的前10条记录

get_dummies函数的功能是用来将该列的数据值类型的各个情况进行细分,并利用若干个二进制标记来明确每个数据项所属的类别。

将one-hot编码产生的虚拟变量合并到full中,并使用head()方法查看其前几行数据

结果:通过concat函数将新增的列加到原数据表中。

full.drop('Embarked',axis=1,inplace=True) #将原Embarked列删除full.head()

#对客舱等级Pclass进行同样的one-hot编码策略pclassdf = pd.DataFrame()#存储提取后的特征pclassdf = pd.get_dummies(full['Pclass'], prefix='Pclass')#通过get_dummies函数执行one-hot编码操作,并设置前缀为Pclassfull = pd.concat([full, pclassdf], axis=1)#将编码生成的虚拟变量附加到原始数据中full.drop(columns='Pclass', inplace=True)#删除原始的Pclass列

#对姓名和头衔做编码处理#编写一个函数用于从姓名字段中提取职位信息def extract_title(name): parts = name.split(',') if len(parts)>=2: str1=parts[1] str2=str1.split('.') if len(str2)>=1: str3=str2[0].strip() return str3 else: return ''title_df=pd.DataFrame() #创建一个空的数据框用于存储提取后的特征title_df['Title']=full['Name'].map(extract_title)title_df.head()
结果:

titleDf['title'].value_counts() #查询头衔的类别和数量结果:

#某些职位名称并非常见类别且出现频率偏低#这些特殊职位会影响机器学习的效果。为此可将这些职位划分为六类包括军官(Officer)、王室成员(Royalty)、夫婦关系(Mrs/Mme)、未婚女性(Miss/Mlle)、男性(Mr)以及学童(Master)。具体映射关系如下:Capt、Col、Major、Dr及Rev均归为军官类别;Jonkheer及Don属于王室成员;Mme对应Married Woman、Mlle未婚女性、Ms与Mrs归为夫人类别;而Mr与Miss则分别代表男性未婚女性;Master单独列为学童类别。通过这种方式我们可以建立一个详细的职位映射字典:title_mapDict = {"Capt": "Officer","Col": "Officer","Major": "Officer","Dr": "Officer","Rev": "Officer","Jonkheer": "Royalty","Don": "Royalty","Sir": "Royalty","the Countess": “Royalty”,"Dona": “Royalty”,"Mme": “Mrs”,"Mlle": “Miss”,"Ms”: “Mrs”,"Mrs”: “Mrs”,"Mr”: “Mr”,"Miss”: “Miss”,"Master”: “Master”,“Lady”: “Royalty”。随后应用该映射字典对数据中的职位字段进行处理:titleDf['title']= titleDf['title'].map(title_mapDict)。最后统计处理后的职位分布情况如下:

titleDf = pd.get_dummies(titleDf['title'])titleDf.head()结果:

full = pd.concat([full,titleDf],axis=1) #将通过独热编码生成的虚拟变量(dummy variables)加入到full中 full.head()展示了数据预处理后的前几行结果:

#对船舱号Cabin进行同样的one-hot编码处理full['Cabin']=full['Cabin'].map(lambda c:c[0])#取船舱号的首位做标识符cabindf = pd.DataFrame()#存放提取后的特征cabindf = pd.get_dummies(full['Cabin'],prefix='Cabin')#使用get_dummies进行one-hot编码,列名前缀是Cabinfull = pd.concat([full,cabindf],axis=1)#添加one-hot编码产生的虚拟变量(dummy variable)到full中full.drop('Cabin',axis=1,inplace=True)#将原Cabin列删除full.head()结果:

#家庭数据Parch、SibSp:对于家庭数据选择计算家庭人数的方法提取特征familydf=pd.DataFrame()#存放提取后的特征familydf['family_size']=full['SibSp']+full['Parch']+1familydf['family_single']=familydf['family_size'].map(lambda a:1 if a==1 else 0)familydf['family_small']=familydf['family_size'].map(lambda a:1 if 2<=a<=4 else 0)familydf['family_large']=familydf['family_size'].map(lambda a:1 if 5<=a else 0)full = pd.concat([full,familydf],axis=1)#添加one-hot编码产生的虚拟变量(dummy variable)到full中full.head()结果:

full.info()结果:

#查看相关性,使用corr生成相关系数矩阵corrDf = full.corr()corrDf结果:

#分析各特征与存活率的关联性 corrDf['Survived'].sort_values(ascending=False) 的结果显示:

特征提取 full_x 赋值为将 titleDf、pclassdf、familydf、full['Fare']、cabindf、embarkeddf 和 full['Sex'] 按照列轴进行连接的结果;查看前五行结果:

print(full_x.shape)结果:

本模型基于包含有891条完整数据的原始数据集构建。源行数设置为891, 源样本的特征信息提取至source_x变量中, 源样本的标签信息提取为survived列, 预测样本的特征信息则存储于pre_x变量中, 并对源样本之后的数据进行处理以生成预测结果

#生成训练集和验证集
代码段:
from sklearn.model_selection import train_test_split
train_x, val_x, train_y, val_y = train_test_split(source_features, source_labels, test_size=0.2)
#数据规模
print(f'原始特征集合大小 {len(source_features)} 个样本')
print(f'训练样本数量 {len(train_x)} 个')
print(f'验证样本数量 {len(val_x)} 个')
print(f'原始标签集合大小 {len(source_labels)} 标签')
print(f'训练标签数量 {len(train_y)} 个')
print(f'验证标签数量 {len(val_y)} 个')

#导入机器算法from sklearn.linear_model import LogisticRegressionmodel=LogisticRegression()#创建逻辑回归模型model.fit(train_x,train_y)#训练模型#评估模型,查看正确率model.score(test_x,test_y)结果:可以看到这个正确率还是非常高的,可以用来后续的预测。

#基于机器学习模型用于对预测数据的生存情况做出推断# #将推断出的结果转换为整数形式# #提取对应行中的乘客ID信息:passenger_ID = full.loc[sourceRow:, 'PassengerId']# #提取对应行中的乘客姓名信息:passenger_Name = full.loc[sourceRow:, 'Name']# #构建包含以下字段的数据框:一个是'PassengerId'(即‘乘客ID’),一个是'Name'(即‘乘客姓名’),还有一个是'Survived'(即‘是否存活’)。具体实现如下:preDf = pd.DataFrame({'PassengerId': passenger_ID, 'Name': passenger_Name, 'Survived': pre_y});查看前几条记录以了解结果

#将文件保存到本地preDf.to_csv('tintanic_prd.csv',index=False)

全部评论 (0)

还没有任何评论哟~