多变量逻辑回归python_Python实现逻辑回归(LogisticRegression。。。

变量逻辑回归python_Python实现逻辑回归
(LogisticRegression。。。
本⽂基于yhat上Logistic Regression in Python,作了中⽂翻译,并相应补充了⼀些内容。本⽂并不研究逻辑回归具体算法实现,⽽是使⽤了⼀些算法库,旨在帮助需要⽤Python来做逻辑回归的训练和预测的读者快速上⼿。
逻辑回归是⼀项可⽤于预测⼆分类结果(binary outcome)的统计技术,⼴泛应⽤于⾦融、医学、犯罪学和其他社会科学中。逻辑回归使⽤简单且⾮常有效,你可以在许多机器学习、应⽤统计的书中的前⼏章中到个关于逻辑回归的介绍。逻辑回归在许多统计课程中都会⽤到。
我们不难到使⽤R语⾔的⾼质量的逻辑回归实例,如UCLA的教程R Data Analysis Examples: Logit Regression就是⼀个很好的资源。Python是机器学习领域最流⾏的语⾔之⼀,并且已有许多Python的资源涵盖了⽀持向量积和⽂本分类等话题,但少有关于逻辑回归的资料。
本⽂介绍了如何使⽤Python来完成逻辑回归。
简介
⽰例代码中使⽤了⼀些算法包,请确保在运⾏这些代码前,你的电脑已经安装了如下包:
numpy: Python的语⾔扩展,定义了数字的数组和矩阵
pandas: 直接处理和操作数据的主要package
statsmodels: 统计和计量经济学的package,包含了⽤于参数评估和统计测试的实⽤⼯具
pylab: ⽤于⽣成统计图
逻辑回归的实例
在此使⽤与Logit Regression in R相同的数据集来研究Python中的逻辑回归,⽬的是要辨别不同的因素对研究⽣录取的影响。
数据集中的前三列可作为预测变量(predictor variables):
gpa
gre分数
rank表⽰本科⽣母校的声望
第四列admit则是⼆分类⽬标变量(binary target variable),它表明考⽣最终是否被录⽤。
加载数据
使⽤ ad_csv加载数据,这样我们就有了可⽤于探索数据的DataFrame。
import pandas as pd
import statsmodels.api as sm
import pylab as pl
import numpy as np
# 加载数据
题库管理系统df = pd.read_csv("www.ats.ucla.edu/stat/data/binary.csv")
# 浏览数据集
print df.head()
# admit gre gpa rank
# 0 0 380 3.61 3
# 1 1 660 3.67 3
# 2 1 800 4.00 1
# 3 1 640 3.19 4
# 4 0 520 2.93 4
# 重命名'rank'列,因为dataframe中有个⽅法名也为'rank'
lumns
# array([admit, gre, gpa, prestige], dtype=object)
Python
注意到有⼀列属性名为rank,但因为rank也是pandas dataframe中⼀个⽅法的名字,因此需要将该列重命名为”prestige”.
统计摘要(Summary Statistics) 以及 查看数据
现在我们就将需要的数据正确载⼊到Python中了,现在来看下数据。我们可以使⽤pandas的函数describe来给出数据的摘要–describe 与R语⾔中的summay类似。这⾥也有⼀个⽤于计算标准差的函数std,但在describe中已包括了计算标准差。
我特别喜欢pandas的pivot_table/crosstab聚合功能。crosstab可⽅便的实现多维频率表(frequency tables)(有点像R语⾔中的table)。你可以⽤它来查看不同数据所占的⽐例。
# summarize the data
print df.describe()
# admit gre gpa prestige
# count 400.000000 400.000000 400.000000 400.00000
# mean 0.317500 587.700000 3.389900 2.48500
# std 0.466087 115.516536 0.380567 0.94446
# min 0.000000 220.000000 2.260000 1.00000
# 25% 0.000000 520.000000 3.130000 2.00000
# 50% 0.000000 580.000000 3.395000 2.00000中国体事件
# 75% 1.000000 660.000000 3.670000 3.00000
# max 1.000000 800.000000 4.000000 4.00000
# 查看每⼀列的标准差
print df.std()
# admit 0.466087
# gre 115.516536
二甲四氯# gpa 0.380567
HODGKINHUXLEY模型
# prestige 0.944460
# 频率表,表⽰prestige与admin的值相应的数量关系
sstab(df['admit'], df['prestige'], rownames=['admit'])
# prestige 1 2 3 4
# admit
# 0 28 97 93 55
# 1 33 54 28 12
# plot all of the columns
df.hist()
pl.show()
Python
运⾏代码后,绘制的柱状统计图如下所⽰:
使⽤pylab绘制的柱状统计图
虚拟变量(dummy variables)
虚拟变量,也叫哑变量,可⽤来表⽰分类变量、⾮数量因素可能产⽣的影响。在计量经济学模型,需要经常考虑属性因素的影响。例如,职业、⽂化程度、季节等属性因素往往很难直接度量它们的⼤⼩。只能给出它们的“Yes—D=1”或”No—D=0”,或者它们的程度或等级。为了反映属性因素和提⾼模型的精度,必须将属性因素“量化”。通过构造0-1型的⼈⼯变量来量化属性因素。
pandas提供了⼀系列分类变量的控制。我们可以⽤get_dummies来将”prestige”⼀列虚拟化。
get_dummies为每个指定的列创建了新的带⼆分类预测变量的DataFrame,在本例中,prestige有四个级别:1,2,3以及4(1代表最有声望),prestige作为分类变量更加合适。当调⽤get_dummies时,会产⽣四列的dataframe,每⼀列表⽰四个级别中的⼀个。
# 将prestige设为虚拟变量
dummy_ranks = pd.get_dummies(df['prestige'], prefix='prestige')
print dummy_ranks.head()
孝感学院新技术学院
# prestige_1 prestige_2 prestige_3 prestige_4
# 0 0 0 1 0
# 1 0 0 1 0
# 2 1 0 0 0
# 3 0 0 0 1
# 4 0 0 0 1
# 为逻辑回归创建所需的data frame
# 除admit、gre、gpa外,加⼊了上⾯常见的虚拟变量(注意,引⼊的虚拟变量列数应为虚拟变量总列数减1,减去的1列作为基准)
cols_to_keep = ['admit', 'gre', 'gpa']
data = df[cols_to_keep].join(dummy_ranks.ix[:, 'prestige_2':])
print data.head()
# admit gre gpa prestige_2 prestige_3 prestige_4
# 0 0 380 3.61 0 1 0
# 1 1 660 3.67 0 1 0
# 2 1 800 4.00 0 0 0
# 3 1 640 3.19 0 0 1
# 4 0 520 2.93 0 0 1
# 需要⾃⾏添加逻辑回归所需的intercept变量
data['intercept'] = 1.0
Python
这样,数据原本的prestige属性就被prestige_x代替了,例如原本的数值为2,则prestige_2为1,prestige_1、prestige_3、prestige_4都为0。
将新的虚拟变量加⼊到了原始的数据集中后,就不再需要原来的prestige列了。在此要强调⼀点,⽣成m个虚拟变量后,只要引⼊m-1个虚拟变量到数据集中,未引⼊的⼀个是作为基准对⽐的。
最后,还需加上常数intercept,statemodels实现的逻辑回归需要显式指定。
执⾏逻辑回归
实际上完成逻辑回归是相当简单的,⾸先指定要预测变量的列,接着指定模型⽤于做预测的列,剩下的就由算法包去完成了。
本例中要预测的是admin列,使⽤到gre、gpa和虚拟变量prestige_2、prestige_3、prestige_4。prestige_1作为基准,所以排除掉,以防⽌多元共线性(multicollinearity)和引⼊分类变量的所有虚拟变量值所导致的陷阱(dummy variable trap)。
# 指定作为训练变量的列,不含⽬标列`admit`
train_cols = lumns[1:]
# Index([gre, gpa, prestige_2, prestige_3, prestige_4], dtype=object)
logit = sm.Logit(data['admit'], data[train_cols])
# 拟合模型
result = logit.fit()
Python
在这⾥是使⽤了statesmodels的Logit函数,更多的模型细节可以查阅statesmodels的⽂档
使⽤训练模型预测数据
(本⼩节是博主补充的)通过上述步骤,我们就得到了训练后的模型。基于这个模型,我们就可以⽤来预测数据,代码如下:
# 构建预测集
# 与训练集相似,⼀般也是通过 pd.read_csv() 读⼊
# 在这边为⽅便,我们将训练集拷贝⼀份作为预测集(不包括 admin 列)
import copy
combos = copy.deepcopy(data)
# 数据中的列要跟预测时⽤到的列⼀致
predict_cols = lumns[1:]
# 预测集也要添加intercept变量
combos['intercept'] = 1.0
# 进⾏预测,并将预测评分存⼊ predict 列中
combos['predict'] = result.predict(combos[predict_cols])
# 预测完成后,predict 的值是介于 [0, 1] 间的概率值
# 我们可以根据需要,提取预测结果
# 例如,假定 predict > 0.5,则表⽰会被录取
# 在这边我们检验⼀下上述选取结果的精确度
total = 0
hit = 0
for value in combos.values:
# 预测分数 predict, 是数据中的最后⼀列
predict = value[-1]
# 实际录取结果
admit = int(value[0])
# 假定预测概率⼤于0.5则表⽰预测被录取
if predict > 0.5:
total += 1
# 表⽰预测命中
if admit == 1:
hit += 1
# 输出结果
print 'Total: %d, Hit: %d, Precision: %.2f' % (total, hit, 100.0*hit/total)
# Total: 49, Hit: 30, Precision: 61.22
Python
岩盐弹在这⾥,我是简单的将原始数据再作为待预测的数据进⾏检验。通过上述步骤得到的是⼀个概率值,⽽不是⼀个直接的⼆分类结果(被录取/不被录取)。通常,我们可以设定⼀个阈值,若 predict ⼤于该阈值,则认为是被录取了,反之,则表⽰不被录取。
在上⾯的例⼦中,假定预测概率⼤于 0.5 则表⽰预测被录取,⼀共预测有 49 个被录取,其中有 30 个预测命中,精确度为 61.22%。
结果解释
statesmodels提供了结果的摘要,如果你使⽤过R语⾔,你会发现结果的输出与之相似。
# 查看数据的要点
print result.summary()
Python
Logit Regression Results
==============================================================================
Dep. Variable: admit No. Observations: 400
Model: Logit Df Residuals: 394
Method: MLE Df Model: 5
Date: Sun, 03 Mar 2013 Pseudo R-squ.: 0.08292

本文发布于:2024-09-22 03:49:12,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/480084.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:预测   变量   数据   回归   逻辑
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议