陈强-机器学习及Python应用-5.9 逻辑回归案例


前言

入门机器学习,第一次在CSDN上写学习笔记,如有错误请多指正。
参考书目:机器学习及Python应用
参考了赛博机器喵【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归


一、数据处理

1.导入模块和数据文件

案例采用了titanic数据,该数据包括了泰坦尼克号乘客的存活数据。

import pandas as pd
import numpy as np
titanic=pd.read_csv('D:\数据集\\MLPython_Data\\titanic.csv')

titanic数据框如下:

   Class     Sex    Age Survived  Freq
0    1st    Male  Child       No     0
1    2nd    Male  Child       No     0
2    3rd    Male  Child       No    35
3   Crew    Male  Child       No     0
4    1st  Female  Child       No     0
5    2nd  Female  Child       No     0
6    3rd  Female  Child       No    17
7   Crew  Female  Child       No     0
8    1st    Male  Adult       No   118
9    2nd    Male  Adult       No   154
10   3rd    Male  Adult       No   387
11  Crew    Male  Adult       No   670
12   1st  Female  Adult       No     4
13   2nd  Female  Adult       No    13
14   3rd  Female  Adult       No    89
15  Crew  Female  Adult       No     3
16   1st    Male  Child      Yes     5
17   2nd    Male  Child      Yes    11
18   3rd    Male  Child      Yes    13
19  Crew    Male  Child      Yes     0
20   1st  Female  Child      Yes     1
21   2nd  Female  Child      Yes    13
22   3rd  Female  Child      Yes    14
23  Crew  Female  Child      Yes     0
24   1st    Male  Adult      Yes    57
25   2nd    Male  Adult      Yes    14
26   3rd    Male  Adult      Yes    75
27  Crew    Male  Adult      Yes   192
28   1st  Female  Adult      Yes   140
29   2nd  Female  Adult      Yes    80
30   3rd  Female  Adult      Yes    76
31  Crew  Female  Adult      Yes    20

2.展开数据框

将数据框完全展开,根据变量Freq让不同观测值在数据框中以相应频次出现。

freq=titanic.Freq.to_numpy()#将Freq变为数组
index=np.repeat(np.arange(32),freq)#将np.arange(32)中元素按freq频率重复
titanic=titanic.iloc[index,:]#利用数据框索引,输出新样本
titanic=titanic.drop('Freq',axis=1)#在新样本中去除Freq;axis=1时,数组变化是横向的,体现列增加和减少

新样本如下所示:

   Class     Sex    Age Survived
2    3rd    Male  Child       No
2    3rd    Male  Child       No
2    3rd    Male  Child       No
2    3rd    Male  Child       No
2    3rd    Male  Child       No
..   ...     ...    ...      ...
31  Crew  Female  Adult      Yes
31  Crew  Female  Adult      Yes
31  Crew  Female  Adult      Yes
31  Crew  Female  Adult      Yes
31  Crew  Female  Adult      Yes

3.数据概况

print(pd.crosstab(titanic.Sex,titanic.Survived))#考察不同性别存亡人数

print(pd.crosstab(titanic.Sex,titanic.Survived,normalize='index'))
#考察不同性别存活率,normalize='index'表示行标准化

print(pd.crosstab(titanic.Age,titanic.Survived,normalize='index'))#不同年龄存活率

print(pd.crosstab(titanic.Class,titanic.Survived,normalize='index'))#不同仓位存活率

结果如下:

Survived    No  Yes
Sex                
Female     126  344
Male      1364  367

Survived        No       Yes
Sex                         
Female    0.268085  0.731915
Male      0.787984  0.212016

Survived        No       Yes
Age                         
Adult     0.687380  0.312620
Child     0.477064  0.522936

Survived        No       Yes
Class                       
1st       0.375385  0.624615
2nd       0.585965  0.414035
3rd       0.747875  0.252125
Crew      0.760452  0.239548

4.对数据进行抽样、处理

from sklearn.model_selection import train_test_split
import statsmodels.api as sm
from patsy import dmatrices
#导入模块

train,test=train_test_split(titanic,test_size=0.3,stratify=titanic.Survived,random_state=0)
#抽取训练集和测试集样本
#test_size=0.3表示测试集占30%
#stratify=titanic.Survived表示根据titanic.Survived进行分层抽样,确保每个类别在训练集和测试集比重相同
y_train,X_train=dmatrices('Survived~Class+Sex+Age',data=train,return_type='dataframe')
#dmatrices()函数使字符型分类变量转化为数值型分类变量
#return_type='dataframe'表示返回数据库,默认返回矩阵
#此命令表示根据训练集train,通过公式'Survived~Class+Sex+Age',生成响应变量y_train和数据X_train

考察y_train, X_train前5个观测值

pd.options.display.max_columns=10#最大显示列数为10
print(X_train.head())
print(y_train.head())

输出结果如下:

    Intercept  Class[T.2nd]  Class[T.3rd]  Class[T.Crew]  Sex[T.Male]  \
11        1.0           0.0           0.0            1.0          1.0   
27        1.0           0.0           0.0            1.0          1.0   
22        1.0           0.0           1.0            0.0          0.0   
11        1.0           0.0           0.0            1.0          1.0   
27        1.0           0.0           0.0            1.0          1.0   

    Age[T.Child]  
11           0.0  
27           0.0  
22           1.0  
11           0.0  
27           0.0 
#以上为X_train观测值

    Survived[No]  Survived[Yes]
11           1.0            0.0
27           0.0            1.0
22           0.0            1.0
11           1.0            0.0
27           0.0            1.0
#以上为y_train观测值

由于y_train包含两个虚拟变量,仅保留Survived[Yes]

y_train=y_train.iloc[:,1]

对测试集也进行类似操作

y_test,X_test=dmatrices('Survived~Class+Sex+Age',data=test,return_type='dataframe')
y_test=y_test.iloc[:,1]

二.逻辑回归

1.调用statsmodels模块的Logit类进行逻辑回归

model=sm.Logit(y_train,X_train)#创建Logit实例
results=model.fit()

结果如下:

Optimization terminated successfully.
         Current function value: 0.501935#损失函数值
         Iterations 6#迭代6次,算法收敛

2.考察回归系数估计值

print(results.params)
Intercept        2.023452
Class[T.2nd]    -1.045877
Class[T.3rd]    -1.869105
Class[T.Crew]   -0.882650
Sex[T.Male]     -2.355785
Age[T.Child]     1.126943
dtype: float64

由于变量为离散变量,可用几率比对系数进行解释

print(np.exp(results.params))#将回归系数转化为几率比
Intercept        7.564391
Class[T.2nd]     0.351384#当乘客仓位由一等舱变为二等舱时,其存活新几率是原几率的0.35倍
Class[T.3rd]     0.154262#当乘客仓位由一等舱变为三等舱时,其存活新几率是原几率的0.15倍
Class[T.Crew]    0.413685#当乘客仓位由一等舱变为船员时,其存活新几率是原几率的0.41倍
Sex[T.Male]      0.094819#当乘客由女性变为男性时,其存活新几率是原几率的0.09倍
Age[T.Child]     3.086208#当乘客由成年变为小孩时,其存活新几率是原几率的3.09倍
dtype: float64

3.平均边际效应

margeff=results.get_margeff()
print(margeff.summary())
Logit Marginal Effects       
=====================================
Dep. Variable:          Survived[Yes]
Method:                          dydx
At:                           overall
=================================================================================
                   dy/dx    std err          z      P>|z|      [0.025      0.975]
---------------------------------------------------------------------------------
Class[T.2nd]     -0.1708      0.037     -4.595      0.000      -0.244      -0.098
Class[T.3rd]     -0.3053      0.031     -9.788      0.000      -0.366      -0.244
Class[T.Crew]    -0.1442      0.031     -4.711      0.000      -0.204      -0.084
Sex[T.Male]      -0.3848      0.021    -18.409      0.000      -0.426      -0.344
Age[T.Child]      0.1841      0.046      3.980      0.000       0.093       0.275
=================================================================================

三.预测

1.计算测试集误差

prob=results.predict(X_test)#测试集中个体存货概率
pred=(prob>=0.5)#以存活概率0.5作为门槛,预测测试集个体是否存活
table=pd.crosstab(y_test,pred,colnames=['Preicted'])#展示混淆矩阵
print(table)

输出:

Preicted       False  True 
Survived[Yes]              
0.0              415     32
1.0              110    104

计算混淆矩阵一系列指标,考察测试集预测效果:

table=np.array(table)#为便于计算,将数据框变为数组
TN=table[0,0]#真阴性
FN=table[0,1]#假阴性
FP=table[1,0]#假阳性
TP=table[1,1]#真阳性
Accuracy=(TN+TP)/np.sum(table)#准确率
Error_rate=1-Accuracy#错误率
Sensitivity=TP/(FP+TP)#灵敏率或真阳率
Specificity=TN/(TN+FN)#特异度或真阴率
Recall=TP/(FN+TP)#查全率或召回率
print(Accuracy)
print(Error_rate)
print(Sensitivity)
print(Specificity)
print(Recall)

输出结果如下:

0.7851739788199698
0.21482602118003025
0.48598130841121495
0.9284116331096197
0.7647058823529411

2.ROC曲线图

from sklearn.metrics import roc_curve,RocCurveDisplay,roc_auc_score
import matplotlib.pyplot as plt
#导入计算模块和画图模块
fpr,tpr,thresholds=roc_curve(y_test,prob)
#传入样本真实标签和样本属于正类的概率,计算真阳率和假阳率
auc_score=roc_auc_score(y_test,prob)
#计算ROC曲线下面积
RocCurveDisplay(fpr=fpr, tpr=tpr,roc_auc=auc_score).plot()
plt.title('ROC Curve')
plt.show()

在这里插入图片描述

3.计算科恩kappa指标

from sklearn.metrics import cohen_kappa_score
print(cohen_kappa_score(y_test,pred))

输出:

0.4578900555613312

预测值和实际值具备中等一致性

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习Python应用》是由陈强撰写的一本针对机器学习Python编程的教程。本书主要介绍了机器学习的基本理论和算法,并通过Python编程语言实现了这些算法。 首先,本书从机器学习的基本概念开始讲解,介绍了监督学习、无监督学习和强化学习等不同的学习任务。然后,详细介绍了机器学习中常用的算法,例如线性回归、逻辑回归、支持向量机、决策树、随机森林和深度学习等。每个算法的原理和应用场景都有详细的说明,并通过代码实例演示了如何使用Python实现这些算法。 此外,本书还介绍了机器学习的评估方法和调参技巧。作者详细解释了模型评估的常用指标,例如准确率、精确率、召回率和F1得分等,并介绍了交叉验证和网格搜索等调参方法。这些内容帮助读者更好地评估和优化机器学习模型。 值得一提的是,本书的代码示例都是使用Python编写的。Python是一种简单易学的编程语言,并且有许多优秀的机器学习库,如Scikit-learn、TensorFlow和Keras等,可以方便地实现机器学习算法。通过本书的学习,读者不仅可以掌握机器学习的基本理论和算法,还可以学会使用Python编程语言来应用这些算法解决实际问题。 总而言之,《机器学习Python应用》是一本专门介绍机器学习Python编程的教程。通过学习本书,读者可以全面了解机器学习的基本概念和算法,并且可以通过Python编程语言实现和应用这些算法。无论是初学者还是有一定编程基础的人士,都可以通过本书掌握机器学习Python编程的基本技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值