黄磊 副教授

个人信息Personal Information


出生日期:1987-05-29

入职时间:2015-08-28

学历:博士研究生毕业

办公地点:交大犀浦校区第三号教学楼30439室

性别:

在职信息:在岗

主要任职:Associate Professor

其他任职:Supervisor of graduate students

毕业院校:新加坡国立大学

学科:数学. 统计学

所在单位:数学学院

报考该导师研究生的方式

欢迎你报考黄磊老师的研究生,报考有以下方式:

1、参加西南交通大学暑期夏令营活动,提交导师意向时,选择黄磊老师,你的所有申请信息将发送给黄磊老师,老师看到后将和你取得联系,点击此处参加夏令营活动

2、如果你能获得所在学校的推免生资格,欢迎通过推免方式申请黄磊老师研究生,可以通过系统的推免生预报名系统提交申请,并选择意向导师为黄磊老师,老师看到信息后将和你取得联系,点击此处推免生预报名

3、参加全国硕士研究生统一招生考试报考黄磊老师招收的专业和方向,进入复试后提交导师意向时选择黄磊老师。

4、如果你有兴趣攻读黄磊老师博士研究生,可以通过申请考核或者统一招考等方式报考该导师博士研究生。

点击关闭

教师博客

当前位置: 中文主页 >> 教师博客

数据会聊天之用Python实现逻辑回归

## 本期是基于binary.csv数据来展示Python如何进行逻辑回归建模、预测和评估的工作。


## 载入所需程序包

from sklearn.model_selection import train_test_split # sklearn是一个机器学习程序包,这里使用它里面一个训练集和测试集分割函数

import pandas as pd #数据分析工具包

import statsmodels.api as sm #常用的统计学模型程序包

import pylab as pl #交互作图程序包

import numpy as np #数组与矩阵运算包

import seaborn as sbn #数据可视化包

from sklearn import metrics # metrics可以计算各种模型评估度量,如ROC曲线,AUC, R2,MSE, MAE,精确度等


## 读取数据

df=pd.read_csv("D:/mypy/binary.csv")  #我存在自己D盘mypy文件夹里,数据从附件解压

df.head  #观看部分数据结构


df.columns=["admit","gre","gpa","prestige"] #对变量命名,Y=admit 是否录取;X1=gre; X2=gpa; X3=prestige 为模型解释变量


## 初等统计量

df.describe() #描述统计, 均值,标准差,分位数,输出结果见下图

df.std() # 标准差

df.mean() #均值

pd.crosstab(df['admit'], df['prestige'], rownames=['admit']) #是否录取与毕业学校声望的列联表

df.hist() # 直方图,如下

pl.show()  


##构造哑变量

dummy_ranks = pd.get_dummies(df['prestige'], prefix='prestige') #把多分类变量prestige变成哑变量

dummy_ranks.head() #看看哑变量结构

cols_to_keep = ['admit', 'gre', 'gpa'] #响应变量+另外两个数值型变量

data = df[cols_to_keep].join(dummy_ranks.ix[:, 'prestige_2':]) # 新设计矩阵包含gre+gpa以及三个哑变量(四分类变量只能用三个哑变量)

data.head()#看看结构

data['intercept']=1#为设计矩阵添加元素为1的列向量,用来估计截距项,放在最后一列


##全样本拟合模型

train_cols=data.columns[1:] # python 中0代表第一个数,因此"[1:]"表示第二列及以后

logit=sm.Logit(data["admit"],data[train_cols]) #响应变量Y在前面,设计矩阵X在后

result=logit.fit() #调取拟合结果

result.summary()#查看拟合结果

result.conf_int() # 参数的区间估计

np.exp(result.params) # 计算exp(β)


##训练和测试

X=data[train_cols] 

y=data['admit']

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=23) #将原数据集分为占比0.8的训练集和0.2的测试集

logit=sm.Logit(y_train,X_train)#训练集上拟合模型

result=logit.fit() # 调取拟合结果

y_p=result.predict(X_test) # 测试集上预测,这里y_p就是概率P(Y=1|X)

y_pre=(y_p>0.5) # 用阈值0.5来分类,这里python返回True or False的逻辑值

y_pred=np.array(y_pre,int) #逻辑值转换为整数值


##分类精度及热力图

confusion_mat=pd.crosstab(y_test, y_pred, rownames=['Actual'],colnames=['Prediction'])#真实值和预测值列联表,也称混淆矩阵

confusion_mat #展示结果

pl.figure()#创建新的图形窗口

sbn.heatmap(confusion_mat,annot=True)#画热力图,如下

print('Accuracy:', metrics.accuracy_score(y_test, y_pred))# 准确度计算


##这里准确度计算值为0.7,并不高,比瞎猜强一些。你也可以调整测试集占比test_size,或者调整随机数种子random_state,看看不同结果。当然,我们是知道的,逻辑回归更注重解释力,预测能力不是它的强项,后期我们会介绍一个比逻辑回归预测能力强的常用机器学习方法。


附件: