Python数据分析学习笔记,今天分享下利用Python进行逻辑回归,预测泰坦尼克号乘客生存情况。
#导入2个Python常用数据分析的库 import numpy as np import pandas as pd
#将数据源文件读取 #注意Windows环境下,需要用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()
结果:用describe函数可以进行描述性数据统计,即我们常见的均值、标准差、中位数等。
#查看每一列数据类型和数据总数 #Survived、Age、Fare、Cabin、Embarked有缺失 full.info()
结果:用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()
#看到量最多的是S,因此用它来填充确实项 full['Embarked'] = full['Embarked'].fillna('S')
#因Cabin缺失较多,用新的‘U’来表示(Unknow) full['Cabin'] = full['Cabin'].fillna('U')
#再次观察一下数据,发现除Survived之外,都已经填充完成 full.info()
#Sex为字符型字段,需要转换为数值型数据便于处理 sex_mapDict = {'male':1,'female':0} #建立一个字典 full['Sex'] = full['Sex'].map(sex_mapDict) #运用maple函数对Sex这一列进行重新编码 full.head()
#使用数据框的get-dummies( )对登船港口进行one-hot编码 embarkeddf = pd.DataFrame() #存放提取后的特征 embarkeddf = pd.get_dummies(full['Embarked'],prefix='Embarked') #使用get_dummies进行one-hot编码,列名前缀是Embarked embarkeddf.head(10)
结果:get_dummies函数的作用是将该列出现值的类型再重新划分为子列,通过子列里的布尔类型标识它的类型。
full = pd.concat([full,embarkeddf],axis=1) #添加one-hot编码产生的虚拟变量(dummy variable)到full中 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编码,列名前缀是Pclass full = pd.concat([full,pclassdf],axis=1) #添加one-hot编码产生的虚拟变量(dummy variable)到full中 full.drop('Pclass',axis=1,inplace=True) #将原Pclass列删除 full.head()
#对姓名和头衔做编码处理 #定义一个函数,从姓名中提取头衔 def gettitle(name): str1=name.split(',')[1] str2=str1.split('.')[0] str3=str2.strip() #strip用于移除字符串头尾指定字符(默认为空格) return str3 titleDf=pd.DataFrame() #存放提取后的特征 titleDf['title']=full['Name'].map(gettitle) titleDf.head()
结果:
titleDf['title'].value_counts() #查询头衔的类别和数量
结果:
#有些头衔并不是常见头衔,而且出现频率比较低 #这样不利于机器学习,可将头衔分为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数据分析 | 泰坦尼克逻辑回归(下):https://developer.aliyun.com/article/1512113