二元分类问题搭建逻辑回归模型
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.线性回归模型 ①导库.读取数据 ②了解数据概况且对后续建模进行数据处理 ③建立线性回归模型 2.逻辑回归模型 ①统计预测 ...
- 推荐系统 | 基础推荐模型 | 逻辑回归模型 | LS-PLM | PyTorch实现
基础推荐模型--传送门: 推荐系统 | 基础推荐模型 | 协同过滤 | UserCF与ItemCF的Python实现及优化 推荐系统 | 基础推荐模型 | 矩阵分解模型 | 隐语义模型 | PyTor ...
- 机器学习第四章之逻辑回归模型
逻辑回归模型 4.1 逻辑回归模型算法原理 4.1.1 逻辑回归模型的数学原理(了解) 4.1.2 逻辑回归模型的代码实现(重要) 4.1.3 逻辑回归模型的深入理解 4.2 案例实战 - 股票客户流 ...
- R语言分类模型:逻辑回归模型LR、决策树DT、推理决策树CDT、随机森林RF、支持向量机SVM、Rattle可视化界面数据挖掘、分类模型评估指标(准确度、敏感度、特异度、PPV、NPV)
R语言分类模型:逻辑回归模型LR.决策树DT.推理决策树CDT.随机森林RF.支持向量机SVM.Rattle可视化界面数据挖掘.分类模型评估指标(准确度.敏感度.特异度.PPV.NPV) 目录
- R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型、分类预测器(分类变量)被自动替换为一组虚拟编码变量、summary函数查看检查模型、使用table函数计算混淆矩阵评估分类模型性能
R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型(Logistic regression).分类预测器(分类变量)被自动替换为一组虚拟编码变量.summary函数查看检查模型.使用t ...
- r语言logistic回归_R语言多分类logistic逻辑回归模型在混合分布模拟单个风险损失值评估的应用...
原文链接 :http://tecdat.cn/?p=14017tecdat.cn 通常,我们在回归模型中一直说的一句话是" 请查看一下数据 ". 在上一篇文章中,我们没有查看数据 ...
- Lesson 4.1-4.2 逻辑回归模型构建与多分类学习方法逻辑回归参数估计
Lesson 4.1 逻辑回归模型构建与多分类学习方法 首先我们来讨论关于逻辑回归的基本原理,当然,在此过程中,我们也将进一步补充机器学习数学理论基础. 逻辑回归的基本原理,从整体上来划分可以分为两个 ...
- r 多元有序logistic回归_R语言多分类logistic逻辑回归模型在混合分布模拟单个风险损失值评估的应用...
原文链接 拓端数据科技 / Welcome to tecdattecdat.cn 通常,我们在回归模型中一直说的一句话是" 请查看一下数据 ". 在上一篇文章中,我们没有查看数据 ...
- R语言编写自定义函数计算分类模型评估指标:准确度、特异度、敏感度、PPV、NPV、数据数据为模型预测后的混淆矩阵、比较多个分类模型分类性能(逻辑回归、决策树、随机森林、支持向量机)
R语言编写自定义函数计算分类模型评估指标:准确度.特异度.敏感度.PPV.NPV.数据数据为模型预测后的混淆矩阵.比较多个分类模型分类性能(逻辑回归.决策树.随机森林.支持向量机) 目录
最新文章
- 使用WINAPI获得磁盘空间信息
- cd1101d 树形dp
- 开源内容管理系统 php mysql_十大免费PHP+MySql平台内容管理系统推荐
- 【youcans 的 OpenCV 例程 200 篇】102. 陷波带阻滤波器的传递函数
- linux创建django项目,Ubuntu 16.04下配置Django项目
- 【MySQL】添加多个字段
- mergesort unrecursive 归并排序的非递归实现
- mysql dump 拒绝访问_Delphi开发的数据库程序在C:\PDOXUSRS.NET生成文件,拒绝访问及读写权限...
- webpack5学习与实战-(八)-配置打包后的文件名
- cadence中集成hspice
- 腾讯产品笔试策划+经验​
- 什么叫DMZ区?DMZ区它有什么作用?
- mysql 临时表权限_MySQL临时表浅析
- Java华氏度与摄氏度之间的转换
- Segment Routing MPLS学习笔记
- hdu 6609
- 三种快排及四种优化方式
- 在windows下编译erlang内建函数(nif)的dll文件
- 工欲善其事,必先利其器之—使用ImageMagick处理图片
- Java系列技术之Hibernate5操作数据库-钟洪发-专题视频课程