首页 > 编程知识 正文

泰坦尼克号的逻辑回归模型是什么,泰坦尼克号仿真模型

时间:2023-05-03 06:43:13 阅读:262118 作者:4951

逻辑回归算是机器学习中最基础的模型了,回归模型在做分类问题中有着较好的效果。下面介绍下利用sklearn做逻辑回归模型 做模型一般分为:提取数据---->了解数据(所谓的探索性数据)---->数据预处理(包括但不限于填充缺失值,特征提取,转换哑变量)---->选择模型---->验证模型---->模型优化

下面先简单介绍下逻辑回归的原理:

说到逻辑回归就不得不提一下线性回归,线性回归用wiki百科的定义来解释就是:在统计学中,线性回归是一种用来建立响应标量(因变量)和一个或多个解释变量(自变量)之间的模型关系的线性方法。线性回归分为一元线性回归和多元线性回归。均方误差是回归模型中常用的度量方法。一般用最小二乘法来最小化均方误差。 线性回归用的最多的是做预测,而逻辑回归最适合的有二分预测,比如是否垃圾邮件,广告是否点击等等;今天的模型用kaggle比赛中的泰坦尼克预测数据集来做逻辑回归模型,故此次我们做的是监督学习。

1.在数据集从kaggle中下载后我们先读取数据和数据预览:

通过DataFrame的函数info(),我们可以详细看到数据的分布等情况

import pandas as pd train=pd.read_csv('D:\pycm\kaggle\titanic\train.csv',index_col=0) #read train datatest=pd.read_csv('D:\pycm\kaggle\titanic\test.csv',index_col=0) #read test dataprint(train.info()) #show the information about train data,including counting values of null

2.了解数据:

查看数据中的缺失值

print(train.isnull().sum()

发现数据中缺失数据Age有177个,Cabin 有687个,Embarked 有2个;由于Cabin 缺失数据占比太大了,我们看下这列数据缺失部分和有值部分对是否获救的情况是如何的,来判断该特征是否需要直接删除。c=train.Cabin.value_counts() #get the value of Cabin print(c)train.drop(labels=Cabin,axis=1)

3.数据处理:

看了下结果发现都是一些客舱号,由于不具有很大的参考意义,在这里我直接把这个特征舍弃掉。

另一个列Embarked是登船的港口,有2个缺失值,我们用出现频率最多的值来填充

train.Embarked=train.Embarked.fillna('S')Em=train.Embarked.value_counts()print(Em)

接下来是Age有177个缺失值,

由于年龄和姓名相关,我们首先把未缺失的值按照姓名的简称来做下均值分类

train['cc']=train.Name.map(lambda x: str(re.compile(r',(.*).').findall(x)))#获取名字中的简称字样Mr,Miss,Mrs,Master,Dr等值#替换上面的写法:train['cc']=train['Name'].apply(lambda x:x.split(',')[1].split('.')[0].strip())c=train.loc[:,['cc','Age']].query('Age>0').groupby('cc').mean() #按照名称辅助列看下各年龄的均值

最后我们看到结果如下:

在这里我们对缺失值的年龄填充根据姓名简称的均值来进行填充

train['Age']=train['Age'].fillna(0)#先对缺失值进行0填充for i in range(1,891): if train['Age'][i]==0 and train['cc'][i]=="[' Mr']": train.loc[i, 'Age']=32 if train['Age'][i]==0 and train['cc'][i] =="[' Mrs']": train.loc[i, 'Age']= 35 if train['Age'][i]==0 and train['cc'][i] == "[' Miss']": train.loc[i, 'Age']=20 if train['Age'][i]==0 and train['cc'][i] == "[' Master']": train.loc[i, 'Age']= 4 if train['Age'][i]==0 and train['cc'][i] == "[' Dr']": train.loc[i,'Age']=42

另一种写法,如下:

value=['Mr','Miss','Mrs','Master','Dr']for v in value: train.loc[(train.Age==0)&(train.cc==v),'Age']=c.loc[v,'Age']

到这里我们就把缺失值处理完了,下面我们对类别值进行处理,我们先看下目前有哪些特征是类别

categore=train.dtypes[train.dtypes==‘object’].index

结果为:

我们看到,目前有年龄,船票和登船口是类别型的,这里我们对年龄和登船口做变量赋值

train=train.replace({'Sex':{'male':1,'female':2}, 'Embarked':{'S':1,'C':2,'Q':3}} )

后面我们把Name,Ticket等无意义的字段直接删掉

data=data.drop(labels=[‘cc’,‘Name’,‘Ticket’],axis=1)

到这里就数据处理完啦。由于kaggle数据都是直接把train,test给我们的,所以我一般会前期把train数据集和test数据集放一起做数据处理。这里前面我们可以在最初做数据拼接操作

data=pd.concat([train,test],keys=([‘train’,‘test’]))

最后对所有的数据处理完后把数据分开

train_data=data.xs('train')#分开得到level 为train的测试数据test_data=data.xs('test').drop(labels='Survived',axis=1)x_train=train_data.drop(labels='Survived',axis=1)y_train=train_data['Survived']test_data=test_data.fillna(0)

4.选择模型

本次的特征较少,我们就不做特别的特征选取了, 对数据处理完后就直接进入模型阶段,这次我们在这里讲解Logistics回归模型。

首先对模型做均一化处理

from sklearn.preprocessing import StandardScalerfrom sklearn.linear_model import LogisticRegressionS=StandardScaler()S.fit(x_train)x_train_stand=S.transform(x_train)x_test_stand=S.transform(test_data)Log=LogisticRegression(C=10)Log.fit(x_train_stand,y_train) #训练模型prediction=Log.predict(x_test_stand) #用训练的模型Log来预测测试数据result=pd.DataFrame({'PassengerId':test_data.index,'Survived':prediction.astype(np.int32)}) #这里需要注意把prediction的数据转换成Int型不然系统判定不了,得分会为0 result.to_csv('D:\pycm\kaggle\titanic\result.csv',index=False) #设置不输出Index

最后将得到的结果提交,就完成啦,

后面还可以对模型进行优化,调参,我们放到下一期来进行讲解。这期讲解逻辑回归就先到这里,我们以一个是否生存的预测问题结尾。

最后附上完整代码:

import pandas as pdimport numpy as npimport seaborn as snsimport matplotlibimport matplotlib.pyplot as pltimport refrom sklearn.preprocessing import StandardScalerfrom sklearn.linear_model import LogisticRegressionfrom sklearn.ensemble import RandomForestClassifier train=pd.read_csv('D:\pycm\kaggle\titanic\train.csv',index_col=0) #读文件test=pd.read_csv('D:\pycm\kaggle\titanic\test.csv',index_col=0)data=pd.concat([train,test],keys=(['train','test']))print(data.info())data.Embarked=data.Embarked.fillna('S')data=data.drop(labels='Cabin',axis=1)#data['cc']=data.Name.map(lambda x: str(re.compile(r',(.*).').findall(x)))data['cc']=data['Name'].apply(lambda x:x.split(',')[1].split('.')[0].strip())c=data.loc[:,['cc','Age']].query('Age>0').groupby('cc').mean()print(c.loc['Miss','Age'])value=['Mr','Miss','Mrs','Master','Dr']data['Age']=data['Age'].fillna(0)for v in value: data.loc[(data.Age==0)&(data.cc==v),'Age']=c.loc[v,'Age']data=data.drop(labels=['cc','Name','Ticket'],axis=1) data=data.replace({'Sex':{'male':1,'female':2}, 'Embarked':{'S':1,'C':2,'Q':3}} ) train_data=data.xs('train')test_data=data.xs('test').drop(labels='Survived',axis=1)x_train=train_data.drop(labels='Survived',axis=1)y_train=train_data['Survived']test_data=test_data.fillna(0) S=StandardScaler()S.fit(x_train)x_train_stand=S.transform(x_train)x_test_stand=S.transform(test_data)Log=RandomForestClassifier(oob_score=True,random_state=10)Log.fit(x_train_stand,y_train)prediction=Log.predict(x_test_stand)result=pd.DataFrame({'PassengerId':test_data.index,'Survived':prediction.astype(np.int32)})result.to_csv('D:\pycm\kaggle\titanic\result.csv',index=False)

————————————————
版权声明:本文为CSDN博主「幸运的Alina」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_27575895/article/details/80936508

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。