1.读取数据——pandas

#利用pandas读取数据
import pandas as pd
data = pd.read_csv(r"H:\Python\data\adult.data")
cols = ['age','education_num','capital_gain','capital_loss','hours_per_week','label']
data = data[cols]
data.head(8)

运行结果:

2.数据转换及可视化——pandas

#利用pandas进行数据转换和可视化,pandas可以将文字型类别变量转换为数字变量
data["label_code"] = pd.Categorical(data.label).codes #在原数据上生成一个变量“label_code”,这个变量只有两个值:0表示“<=50K”,1表示“>50K”
data[["label","label_code"]].head(8)
import matplotlib.pyplot as plt
data[["age","hours_per_week","education_num","label_code"]].hist()
plt.show(block=False)

运行结果:

3.数据的基本统计信息——pandas

#利用DataFrame的describe函数可以得到数据的基本统计信息,如平均值,均方差等。
#默认的describe智慧显示数值型变量的统计信息,如果想要得到全部变量的统计信息,可使用“describe(include='all')”
data.describe()

运行结果:

4.计算交叉报表

#计算education_num,label交叉报表
#pd.crosstab(pd.qcut(data["education_num"],[0,0.25,0.5,0.75,1]))表示将变量“education_num”按分位数划分为4个区间
cross1 = pd.crosstab(pd.qcut(data["education_num"],[0,0.25,0.5,0.75,1]),data["label"])
print(cross1)
#将交叉图标图像化
from statsmodels.graphics.mosaicplot import mosaic
mosaic(cross1.stack())

运行结果:

5.计算交叉报表,并归一化

#计算hours_per_week,label交叉报表
cross2 = pd.crosstab(pd.cut(data["hours_per_week"],5),data["label"])
#将交叉表归一化,利于分析数据
cross2_norm = cross2.div(cross2.sum(1).astype(float),axis=0)
cross2_norm.plot(kind="bar")
plt.show(block=False)

运行结果:

6.理解模型结果

#理解模型结果
def interpreModel(re):"""理解模型结果参数---re:BinaryResults,训练好的逻辑回归模型"""conf = re.conf_int()conf['OR'] = re.params#计算各个变量对时间发生比的影响#以conf里面的3列,分别对应着估计值的下界、上界和估计值本身conf.colums = ['2.5%','97.5','OR']print("各个变量对事件发生比的影响: ")print(np.exp(conf))#计算各个变量的边际效应print("各个变量的边际效应:")print(re.get_margeff(at="overall").summary())

运行结果:

7. 评估模型效果

#评估模型效果
def makePrediction(re,testSet,alpha=0.5):"""使用训练好的模型对预测数据作预测"""#计算事件发生的概率testSet["prob"] = re.predict(testSet)print("事件发生概率(预测概率)大于0.6的数据个数:")print(testSet[testSet["prob"]>0.6].shape[0])  print("事件发生概率(预测概率)大于0.5的数据个数:")print(testSet[testSet["prob"]>0.5].shape[0])#根据预测的概率,得出最终的预测testSet["pred"] = testSet.apply(lambda x:1 if x["prob"]>alpha else 0,axis=1)return testSet

运行结果:

8.查准率与查全率评估指标

def evaluation(re):"""计算预测结果的查准查全率以及f1参数----re :DataFrame,预测结果,里面包含两列:真实值‘lable_code’、预测值‘pred’"""bins = np.array([0, 0.5, 1])label = re["label_code"]pred = re["pred"]tp, fp, fn, tn = np.histogram2d(label, pred, bins=bins)[0].flatten()precision = tp / (tp + fp)  # 0.951recall = tp / (tp + fn)  # 0.826f1 = 2 * precision * recall / (precision + recall)  # 0.884print("查准率: %.3f, 查全率: %.3f, f1: %.3f" % (precision, recall, f1))

运行结果:

完整版代码,使用第三方库Statsmodels搭建模型

import matplotlib.pyplot as plt
import pandas as pd
import os
import numpy as np
import statsmodels.api as sm
from statsmodels.graphics.mosaicplot import mosaic  #将交叉图标图像化
from sklearn.model_selection import train_test_split  #将数据集划分为训练集和测试集,防治过拟合def readData(path): #利用pandas读取数据data = pd.read_csv(path)cols = ['age','education_num','capital_gain','capital_loss','hours_per_week','label']return data[cols]def logitRegression(data):"""逻辑回归模型分析步骤展示参数---data:DataFrame,建模数据"""data = transLabel(data)visualData(data)analyseData(data)#将数据分为训练集和测试集trainSet,testSet = train_test_split(data,test_size=0.2, random_state=2310)#测试集占20%#训练模型并分析模型效果re = trainModel(trainSet)modelSummary(re)interpreModel(re)re = makePrediction(re,testSet,alpha=0.5)evaluation(re)def transLabel(data):"""将文字变量转化为数字变量"""data["label_code"] = pd.Categorical(data.label).codesreturn datadef visualData(data):data[["age","hours_per_week","education_num","label_code"]].hist()plt.show(block=False)def analyseData(data):"""通过统计方法,了解数据性质"""# 在Windows下运行此脚本需确保Windows下的命令提示符(cmd)能显示中文print("显示基本统计信息:")print(data.describe(include="all"))# 计算education_num, label交叉报表cross1 = pd.crosstab(pd.qcut(data["education_num"],  [0, .25, .5, .75, 1]), data["label"])print("显示education_num, label交叉报表:")print(cross1)# 将交叉报表图形化props = lambda key: {"color": "0.45"} if ' >50K' in key else {"color": "#C6E2FF"}mosaic(cross1[[" >50K", " <=50K"]].stack(), properties=props)# 计算hours_per_week, label交叉报表cross2 = pd.crosstab(pd.cut(data["hours_per_week"], 5), data["label"])# 将交叉报表归一化,利于分析数据cross2_norm = cross2.div(cross2.sum(1).astype(float), axis=0)print("显示hours_per_week, label交叉报表:")print(cross2_norm)# 图形化归一化后的交叉报表cross2_norm.plot(kind="bar", color=["#C6E2FF", "0.45"], rot=0)plt.show()def trainModel(data):"""搭建逻辑回归模型,并训练模型"""formula = "label_code ~ age + education_num + capital_gain + capital_loss + hours_per_week"model = sm.Logit.from_formula(formula,data=data)re = model.fit()return redef modelSummary(re):"""分析逻辑回归模型的统计性质"""#整体统计分析结果print(re.summary())#用f test 检验education_num的系数是否显著print("检验假设education_num的系数等于0:")print(re.f_test("education_num=0"))#用f test检验两个假设是否同时成立print("检验假设education_num的系数等于0.32和hours_per_week的系数等于0.04同时成立")print(re.f_test("education_num=0.32,hours_per_week=0.04"))#理解模型结果
def interpreModel(re):"""理解模型结果参数---re:BinaryResults,训练好的逻辑回归模型"""conf = re.conf_int()conf['OR'] = re.params#计算各个变量对时间发生比的影响#以conf里面的3列,分别对应着估计值的下界、上界和估计值本身conf.colums = ['2.5%','97.5','OR']print("各个变量对事件发生比的影响: ")print(np.exp(conf))#计算各个变量的边际效应print("各个变量的边际效应:")print(re.get_margeff(at="overall").summary())#评估模型效果
def makePrediction(re,testSet,alpha=0.5):"""使用训练好的模型对预测数据作预测"""#计算事件发生的概率testSet["prob"] = re.predict(testSet)print("事件发生概率(预测概率)大于0.6的数据个数:")print(testSet[testSet["prob"]>0.6].shape[0])  print("事件发生概率(预测概率)大于0.5的数据个数:")print(testSet[testSet["prob"]>0.5].shape[0])#根据预测的概率,得出最终的预测testSet["pred"] = testSet.apply(lambda x:1 if x["prob"]>alpha else 0,axis=1)return testSet#评估指标
def evaluation(re):"""计算预测结果的查准查全率以及f1参数----re :DataFrame,预测结果,里面包含两列:真实值‘lable_code’、预测值‘pred’"""bins = np.array([0, 0.5, 1])label = re["label_code"]pred = re["pred"]tp, fp, fn, tn = np.histogram2d(label, pred, bins=bins)[0].flatten()precision = tp / (tp + fp)  # 0.951recall = tp / (tp + fn)  # 0.826f1 = 2 * precision * recall / (precision + recall)  # 0.884print("查准率: %.3f, 查全率: %.3f, f1: %.3f" % (precision, recall, f1))if __name__ == "__main__":# 设置显示格式pd.set_option('display.width', 1000)homePath = os.path.dirname(os.path.abspath(__file__))# Windows下的存储路径与Linux并不相同if os.name == "nt":dataPath = "%s\\data\\adult.data" % homePathelse:dataPath = "%s/data/adult.data" % homePathdata = readData(dataPath)logitRegression(data)

注:出现这个错误,更新自己的statsmodels库,我更新到0.9.0版本就好了

二元分类问题搭建逻辑回归模型相关推荐

  1. 聚类分析、线性回归分析与分类分析(逻辑回归模型)

    文章目录 前言 一.了解数据概况 二.单变量分析 三.可视化 四.建立模型 1.线性回归模型 ①导库.读取数据 ②了解数据概况且对后续建模进行数据处理 ③建立线性回归模型 2.逻辑回归模型 ①统计预测 ...

  2. 推荐系统 | 基础推荐模型 | 逻辑回归模型 | LS-PLM | PyTorch实现

    基础推荐模型--传送门: 推荐系统 | 基础推荐模型 | 协同过滤 | UserCF与ItemCF的Python实现及优化 推荐系统 | 基础推荐模型 | 矩阵分解模型 | 隐语义模型 | PyTor ...

  3. 机器学习第四章之逻辑回归模型

    逻辑回归模型 4.1 逻辑回归模型算法原理 4.1.1 逻辑回归模型的数学原理(了解) 4.1.2 逻辑回归模型的代码实现(重要) 4.1.3 逻辑回归模型的深入理解 4.2 案例实战 - 股票客户流 ...

  4. R语言分类模型:逻辑回归模型LR、决策树DT、推理决策树CDT、随机森林RF、支持向量机SVM、Rattle可视化界面数据挖掘、分类模型评估指标(准确度、敏感度、特异度、PPV、NPV)

    R语言分类模型:逻辑回归模型LR.决策树DT.推理决策树CDT.随机森林RF.支持向量机SVM.Rattle可视化界面数据挖掘.分类模型评估指标(准确度.敏感度.特异度.PPV.NPV) 目录

  5. R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型、分类预测器(分类变量)被自动替换为一组虚拟编码变量、summary函数查看检查模型、使用table函数计算混淆矩阵评估分类模型性能

    R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型(Logistic regression).分类预测器(分类变量)被自动替换为一组虚拟编码变量.summary函数查看检查模型.使用t ...

  6. r语言logistic回归_R语言多分类logistic逻辑回归模型在混合分布模拟单个风险损失值评估的应用...

    原文链接 :http://tecdat.cn/?p=14017​tecdat.cn 通常,我们在回归模型中一直说的一句话是" 请查看一下数据 ". 在上一篇文章中,我们没有查看数据 ...

  7. Lesson 4.1-4.2 逻辑回归模型构建与多分类学习方法逻辑回归参数估计

    Lesson 4.1 逻辑回归模型构建与多分类学习方法 首先我们来讨论关于逻辑回归的基本原理,当然,在此过程中,我们也将进一步补充机器学习数学理论基础. 逻辑回归的基本原理,从整体上来划分可以分为两个 ...

  8. r 多元有序logistic回归_R语言多分类logistic逻辑回归模型在混合分布模拟单个风险损失值评估的应用...

    原文链接 拓端数据科技 / Welcome to tecdat​tecdat.cn 通常,我们在回归模型中一直说的一句话是" 请查看一下数据 ". 在上一篇文章中,我们没有查看数据 ...

  9. R语言编写自定义函数计算分类模型评估指标:准确度、特异度、敏感度、PPV、NPV、数据数据为模型预测后的混淆矩阵、比较多个分类模型分类性能(逻辑回归、决策树、随机森林、支持向量机)

    R语言编写自定义函数计算分类模型评估指标:准确度.特异度.敏感度.PPV.NPV.数据数据为模型预测后的混淆矩阵.比较多个分类模型分类性能(逻辑回归.决策树.随机森林.支持向量机) 目录

最新文章

  1. 使用WINAPI获得磁盘空间信息
  2. cd1101d 树形dp
  3. 开源内容管理系统 php mysql_十大免费PHP+MySql平台内容管理系统推荐
  4. 【youcans 的 OpenCV 例程 200 篇】102. 陷波带阻滤波器的传递函数
  5. linux创建django项目,Ubuntu 16.04下配置Django项目
  6. 【MySQL】添加多个字段
  7. mergesort unrecursive 归并排序的非递归实现
  8. mysql dump 拒绝访问_Delphi开发的数据库程序在C:\PDOXUSRS.NET生成文件,拒绝访问及读写权限...
  9. webpack5学习与实战-(八)-配置打包后的文件名
  10. cadence中集成hspice
  11. 腾讯产品笔试策划+经验​
  12. 什么叫DMZ区?DMZ区它有什么作用?
  13. mysql 临时表权限_MySQL临时表浅析
  14. Java华氏度与摄氏度之间的转换
  15. Segment Routing MPLS学习笔记
  16. hdu 6609
  17. 三种快排及四种优化方式
  18. 在windows下编译erlang内建函数(nif)的dll文件
  19. 工欲善其事,必先利其器之—使用ImageMagick处理图片
  20. Java系列技术之Hibernate5操作数据库-钟洪发-专题视频课程

热门文章

  1. Swift Codeable协议
  2. electron 解压zip_如何在Electron Framework中提取.zip文件的内容(解压缩)
  3. 单片机控制继电器电路 程序就很简单了 做一个口的输出就可以了
  4. be carefull in c
  5. iptables详解(二)
  6. Arduino基础项目一:控制LED灯闪烁
  7. Android调用天气预报所对应的城市Id
  8. mysql定时任务,每天定时执行
  9. 2020-05-07
  10. 石头剪刀布php源码,原创:微信小程序源码解说:石头剪刀布(附源码下载)