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

#导入2个Python常用数据分析的库

import numpy as np
import pandas as pd
#将数据源文件读取
#注意Windows环境下,需要用r转义一下,不然读取不进来

train = pd.read_csv(r"C:UsersAdministratorDesktoptrain.csv")
test = pd.read_csv(r"C:UsersAdministratorDesktoptest.csv")
print('训练数据集:',train.shape,'测试数据集:',test.shape)

75df62ba68bb08474de93928098519aa.png

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

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

full.head()

7399ad42b2f9968a7bee7ab489ed78f3.png

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

#描述性数据统计

full.describe()

7d969099c177506f5b920ad7fcd1d9bf.png

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

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

full.info()

2d6e84c1337e9386da8c32c990f5cd71.png

结果:用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()

14fac0ffaf79a4dd8858e97945a1859b.png
#看到量最多的是S,因此用它来填充确实项

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

full['Cabin'] = full['Cabin'].fillna('U')
#再次观察一下数据,发现除Survived之外,都已经填充完成

full.info()

6aa4673a13fbf6021884326f7c012b91.png
#Sex为字符型字段,需要转换为数值型数据便于处理

sex_mapDict = {'male':1,'female':0}    #建立一个字典
full['Sex'] = full['Sex'].map(sex_mapDict)    #运用maple函数对Sex这一列进行重新编码
full.head()

c529175c787af5beaa8860d534590042.png
#使用数据框的get-dummies( )对登船港口进行one-hot编码

embarkeddf = pd.DataFrame()    #存放提取后的特征
embarkeddf = pd.get_dummies(full['Embarked'],prefix='Embarked')    #使用get_dummies进行one-hot编码,列名前缀是Embarked
embarkeddf.head(10)

8e76f7436de1ad1e783109e2c9bf1c2e.png

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

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

98c9a98a454697e2687ecdfb502db180.png

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

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

49d876af928154c0facf132814eb36af.png
#对客舱等级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()

c496f420ebbcc931814b46ad19ad943c.png
#对姓名和头衔做编码处理

#定义一个函数,从姓名中提取头衔
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()

结果:

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

结果:

90cfc45f3b500f1d9abca5b47ed043c2.png
#有些头衔并不是常见头衔,而且出现频率比较低
#这样不利于机器学习,可将头衔分为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() 

结果:

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

结果:

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

结果:

1f2260e45ca1f545da0727fbdc7b9c0c.png
#对船舱号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编码,列名前缀是Cabin
full = pd.concat([full,cabindf],axis=1)    #添加one-hot编码产生的虚拟变量(dummy variable)到full中
full.drop('Cabin',axis=1,inplace=True)    #将原Cabin列删除
full.head()

结果:

797b50b29c559a95674e50dad2230516.png
#家庭数据Parch、SibSp:对于家庭数据选择计算家庭人数的方法提取特征

familydf=pd.DataFrame()    #存放提取后的特征
familydf['family_size']=full['SibSp']+full['Parch']+1
familydf['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()

结果:

edf9bd4fafcd4c52f5da66784356e228.png
full.info()

结果:

26e5428ce7cf2d89f8a7215e2c873993.png
#查看相关性,使用corr生成相关系数矩阵

corrDf = full.corr()
corrDf

结果:

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

结果:

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

结果:

327ddf421f1dbcef705d85b550969ddd.png
print(full_x.shape)

结果:

73c2f476b608fde5d684f9e8d441ed21.png
#构建模型

#原始数据集有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()

结果:

3d107cd171c632c5434cea0ecf68a451.png
#建立训练数据和测试数据

from sklearn.model_selection import train_test_split

train_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)

结果:

7dc44ed6790acd20884bdbbdf4054c8b.png
#导入机器算法

from sklearn.linear_model import LogisticRegression

model=LogisticRegression()    #创建逻辑回归模型
model.fit(train_x,train_y)    #训练模型

#评估模型,查看正确率

model.score(test_x,test_y)

结果:

98637b2e7f3d34448a279f9ca1c0b928.png
#通过机器学习模型,对预测数据生存情况进行预测
pre_y=model.predict(pre_x)

#将预测结果转换为整数型
pre_y=pre_y.astype(int)

#乘客ID
passenger_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()

结果:

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

参考资料:

https://zhuanlan.zhihu.com/p/108969064

https://zhuanlan.zhihu.com/p/84353059

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值