#导入2个Python常用数据分析的库import numpy as npimport pandas as pd
#将数据源文件读取#注意Windows环境下,需要用r转义一下,不然读取不进来train = pd.read_csv(r"C:甥敳獲AdministratorDesktoprain.csv")test = pd.read_csv(r"C:甥敳獲AdministratorDesktopest.csv")print('训练数据集:',train.shape,'测试数据集:',test.shape)




python逻辑回归泰坦尼克号_测试数据


结果:表示训练数据集为891行,12列;测试数据集为418行,11列,测试集少了一列Survived即我们后续需要通过逻辑回归进行预测的。

#初步观察数据情况#Pclass客舱等级#SibSp同代直系亲属数#Parch不同代直系亲属数#Cabin客舱号#Embarked登船港口#Fare船票价格full.head()


python逻辑回归泰坦尼克号_数据集_02


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

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


python逻辑回归泰坦尼克号_python 逻辑回归准确率是1_03


结果:用describe函数可以进行描述性数据统计,即我们常见的均值、标准差、中位数等。

#查看每一列数据类型和数据总数#Survived、Age、Fare、Cabin、Embarked有缺失full.info()


python逻辑回归泰坦尼克号_python 逻辑回归准确率是1_04


结果:用info函数可以查看各列的数据个数,便于我们快速定位那些列有缺失值。

#数据预处理,缺失值填充#数值型数据用均值或中位数填充,如Age#应用fillna函数,用于填充缺失值full['Age'] = full['Age'].fillna(full['Age'].mean())full['Fare'] = full['Fare'].fillna(full['Fare'].mean())
#分类型数据用最常见类别进行填充#先通过value_counts函数,查询一下该列出现的各类型总数full['Embarked'].value_counts()


python逻辑回归泰坦尼克号_数据集_05


#看到量最多的是S,因此用它来填充确实项full['Embarked'] = full['Embarked'].fillna('S')
#因Cabin缺失较多,用新的‘U’来表示(Unknow)full['Cabin'] = full['Cabin'].fillna('U')
#再次观察一下数据,发现除Survived之外,都已经填充完成full.info()


python逻辑回归泰坦尼克号_python 逻辑回归准确率是1_06


#Sex为字符型字段,需要转换为数值型数据便于处理sex_mapDict = {'male':1,'female':0}    #建立一个字典full['Sex'] = full['Sex'].map(sex_mapDict)    #运用maple函数对Sex这一列进行重新编码full.head()


python逻辑回归泰坦尼克号_数据集_07


#使用数据框的get-dummies( )对登船港口进行one-hot编码embarkeddf = pd.DataFrame()    #存放提取后的特征embarkeddf = pd.get_dummies(full['Embarked'],prefix='Embarked')    #使用get_dummies进行one-hot编码,列名前缀是Embarkedembarkeddf.head(10)


python逻辑回归泰坦尼克号_测试数据_08


结果:get_dummies函数的作用是将该列出现值的类型再重新划分为子列,通过子列里的布尔类型标识它的类型。

full = pd.concat([full,embarkeddf],axis=1)    #添加one-hot编码产生的虚拟变量(dummy variable)到full中full.head()


python逻辑回归泰坦尼克号_数据集_09


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

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


python逻辑回归泰坦尼克号_python 逻辑回归准确率是1_10


#对客舱等级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)    #添加one-hot编码产生的虚拟变量(dummy variable)到full中full.drop('Pclass',axis=1,inplace=True)    #将原Pclass列删除full.head()


python逻辑回归泰坦尼克号_数据集_11


#对姓名和头衔做编码处理#定义一个函数,从姓名中提取头衔def gettitle(name):    str1=name.split(',')[1]    str2=str1.split('.')[0]    str3=str2.strip()    #strip用于移除字符串头尾指定字符(默认为空格)    return str3titleDf=pd.DataFrame()    #存放提取后的特征titleDf['title']=full['Name'].map(gettitle)titleDf.head()

结果:


python逻辑回归泰坦尼克号_数据集_12


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

结果:


python逻辑回归泰坦尼克号_数据_13


#有些头衔并不是常见头衔,而且出现频率比较低#这样不利于机器学习,可将头衔分为6类Officer,Royalty,Mrs,Miss,Mr,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['title'].value_counts()

结果:


python逻辑回归泰坦尼克号_测试数据_14


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

结果:


python逻辑回归泰坦尼克号_数据集_15


full = pd.concat([full,titleDf],axis=1)    #添加one-hot编码产生的虚拟变量(dummy variable)到full中full.head()

结果:


python逻辑回归泰坦尼克号_测试数据_16


#对船舱号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()

结果:


python逻辑回归泰坦尼克号_python逻辑回归泰坦尼克号_17


#家庭数据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()

结果:


python逻辑回归泰坦尼克号_数据_18


full.info()

结果:


python逻辑回归泰坦尼克号_数据集_19


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

结果:


python逻辑回归泰坦尼克号_数据集_20


#查看各个特征与生存情况的相关性corrDf['Survived'].sort_values(ascending=False)

结果:


python逻辑回归泰坦尼克号_数据集_21


#特征选择full_x=pd.concat([titleDf,pclassdf,familydf,full['Fare'],cabindf,embarkeddf,full['Sex']],axis=1)full_x.head()

结果:


python逻辑回归泰坦尼克号_数据集_22


print(full_x.shape)

结果:


python逻辑回归泰坦尼克号_python 逻辑回归准确率是1_23


#构建模型#原始数据集有891条数据sourceRow=891#原始数据集特征source_x=full_x.loc[0:sourceRow-1,:]#原始数据集标签source_y=full.loc[0:sourceRow-1,'Survived']#预测数据集特征pre_x=full_x.loc[sourceRow:,:]    #取sourceRow之后的数据source_x.head()

结果:


python逻辑回归泰坦尼克号_测试数据_24


#建立训练数据和测试数据from sklearn.model_selection import train_test_splittrain_x,test_x,train_y,test_y=train_test_split(source_x,source_y,train_size=0.8)#数据集大小print('原始数据集特征',source_x.shape,      '训练数据集特征',train_x.shape,      '测试数据集特征',test_x.shape)print('原始数据集标签',source_y.shape,      '训练数据集标签',train_y.shape,      '测试数据集标签',test_y.shape)

结果:


python逻辑回归泰坦尼克号_python逻辑回归泰坦尼克号_25


#导入机器算法from sklearn.linear_model import LogisticRegressionmodel=LogisticRegression()    #创建逻辑回归模型model.fit(train_x,train_y)    #训练模型#评估模型,查看正确率model.score(test_x,test_y)

结果:


python逻辑回归泰坦尼克号_测试数据_26


#通过机器学习模型,对预测数据生存情况进行预测pre_y=model.predict(pre_x)#将预测结果转换为整数型pre_y=pre_y.astype(int)#乘客IDpassenger_ID=full.loc[sourceRow:,'PassengerId']#乘客名字passenger_Name=full.loc[sourceRow:,'Name']#数据框:乘客ID,预测结果preDf=pd.DataFrame({'PassengerId':passenger_ID,'Name':passenger_Name,'Survived':pre_y})preDf.head()

结果:


python逻辑回归泰坦尼克号_python 逻辑回归准确率是1_27


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