预备资源
Python的几个包:
- numpy: Python的语言扩展,定义了数字的数组和矩阵
- pandas: 直接处理和操作数据的主要package
- statsmodels: 统计和计量经济学的package,包含了用于参数评估和统计测试的实用工具
- pylab: 用于生成统计图
安装参考:传送门
实例
实验目标
通过分析不同的因素对研究生录取的影响来预测一个人是否会被录取。
数据
数据来源
数据的格式如下:
row_num | admit | gre | gpa | rank |
---|---|---|---|---|
0 | 0 | 380 | 3.61 | 3 |
1 | 1 | 660 | 3.67 | 3 |
- admit :表示是否被录取(目标变量)
- gre: 预测变量
- gpa:预测变量
- rank:母校排名(预测变量)
读取数据
通过pandas.read_csv("文件路径")读取数据
import pandas as pd
import statsmodels.api as sm
import pylab as pl
import numpy as np
df = pd.read_csv("./binary.csv")
print df.head()
# 重命名'rank'列,因为dataframe中有个方法名也为'rank'
df.columns = ["admit", "gre", "gpa", "prestige"]
print df.columns
# array([admit, gre, gpa, prestige], dtype=object)
结果:

统计摘要绘图
pandas库提供函数describe来对数据进行统计,其中包括最值,均值,标准差等,计算标准差我们也可以用padans.dataframe.std()来求标准差,我们可以通过padans.dataframe.hist()来画柱状图,通过pylab.show来展示
print df.describe()
print df.std()
print pd.crosstab(df['admit'], df['prestige'], rownames=['admit'])
df.hist()
pl.show()


虚拟变量
虚拟变量,也叫哑变量,可用来表示分类变量、非数量因素可能产生的影响。在计量经济学模型,需要经常考虑属性因素的影响。例如,职业、文化程度、季节等属性因素往往很难直接度量它们的大小。只能给出它们的“Yes—D=1”或”No—D=0”,或者它们的程度或等级。为了反映属性因素和提高模型的精度,必须将属性因素“量化”。通过构造0-1型的人工变量来量化属性因素。
pandas提供一个一个分类变量的控制功能,我们可以通过get_dummies来对一列进行虚拟化。本例中将prestige虚拟化实现,以实现量化
#将prestige虚拟化实现,量化
dummy_ranks = pd.get_dummies(df['prestige'],prefix='prestige')
print dummy_ranks.head()
clos_to_keep=['admit','gre','gpa']
#合并虚拟项与原数据得到完成LR的dataframe
data = df[clos_to_keep].join(dummy_ranks.ix[:,'prestige_2':])
print data.head()
#自行添加逻辑回归需要的intercept变量(常数项)
data['intercept']=1.0

将新的虚拟变量加入到原始的数据集中就不需要原来的prestige列了,生成m个虚拟变量只需要引入m-1个虚拟变量到数据集中,未引入的一个是作为基准对比的。将虚拟变量与"admit,gre,gpa"合并后就得到了实现逻辑的dataframe。除此之外。我们还需要显示的加上常数intercept
执行逻辑回归
在之前我们已经将准备工作做就绪,那么接下来就可以执行逻辑回归了。
- 首先要指定预测变量的列和模型用于做预测的列。
- 调用算法包执行算法。
在本例中预测admit,使用gre,gpa,以及虚拟变量p2,p3,p4做预测变量。
#指定作为训练变量的列,不含目标列‘admit’
train_cols=data.columns[1:]
#执行逻辑回归
logit = sm.Logit(data['admit'],data[train_cols])
#拟合参数
result = logit.fit()
statasmodels库中提供了许多的机器学习的算法,详情参见:传送门
使用模型进行预测
- 构造预测集,读入方式与训练集相同pandas.read_csv()读入,这里为了方便直接取了训练集(剔除admit列)。
- 通过result.predict("参数的值")进行预测
- 分析结果,求得命中率等相关值。
#拷贝训练集数据
combos = copy.deepcopy(data)
predict_cols = combos.columns[1:]
#设置参数的常量
combos['intercept']=1.0
#进行预测
combos['predict']=result.predict(combos[predict_cols])
tot = 0
hit = 0;
for value in combos.values:
predict = value[-1]
admit = int(value[0])
if predict >=0.5:
tot+=1
if admit == 1:
hit+=1
print 'Total: %d ,Hit: %d ,Precision: %.2f'%(tot,hit,100.0*hit/tot)
结果分析
通过result.summary()方法查看相关信息。
print result.summary()

通过这个表我们可以看到模型的参数的值,以及总的拟合质量
查看每个参数的置信区间
# 查看每个系数的置信区间
print result.conf_int()
# 0 1
# gre 0.000120 0.004409
# gpa 0.153684 1.454391
# prestige_2 -1.295751 -0.055135
# prestige_3 -2.016992 -0.663416
# prestige_4 -2.370399 -0.732529
# intercept -6.224242 -1.755716
Summary
Python库中几乎包含了常见机器学习中我们需要做的所有操作,在训练机器学习模型的时候我们只用学会如何使用它就好。
网友评论