前言:
在学习了梯度下降和逻辑回归的基本算法后,选取此案例来进行实践练习,本次练习主要通过python中的三大块pandas、numpy和matplotlib来实现,基本不涉及到sklearn库的调用,一方面是自己编写公式时可以加深对推导公式的理解,另一方面也是为了复习numpy中的一些基本运算命令。
OK,Let's think !!!
本次练习所涉及到的算法理论及分析思路均参考自吴恩达老师的《机器学习》和唐宇迪老师的《机器学习实践》
研究背景:
根据两次考试的结果来决定每个申请人的录取机会。现有申请人的历史数据,我们可以用它作为逻辑回归的训练集。我们将建立一个分类模型,根据考试成绩来估计入学概率。
一、数据预处理
数据预处理的目的在于对样本数据形成初步认识,从而决定数据清晰的内容
- 数据预览
import
df.head()
从表中可以看出样本中有三行,分别是
Exam1(第一次考是成绩)
Exam2(第二次考是成绩)
Admitted(是否呗录取) 0表示不录取,1表示录取
2. 可视化预览
逻辑回归是典型的分类问题,从表中并不能直观的看出Admitted是否有明显的边界,因此可视化是个很好的方法。在可视化之前,我们先对Admitted定义新标签positive/negative
这里我是将positive和negative分别提取出来,然后画在同一个图中,当然也可以先groupby然后直接用Pandas画图:
#设定标签
positive=df[df['Admitted']==1] #'Admitted'==1 为正向类
negative=df[df['Admitted']==0] #'Admitted'==0 为负向类
#可视化数据预览
fig=plt.figure(figsize=(10,6))
ax=fig.add_subplot(1,1,1)
plt.scatter(x=positive['Exam 1'],y= positive['Exam 2'],marker='x',s=50,label='positive')
plt.scatter(x=negative['Exam 1'],y= negative['Exam 2'],marker='o',s=50,label='negative')
plt.legend()
ax.set_xlabel('Exam 1')
ax.set_ylabel('Exam 2')
从图中可以清晰的观察到positive和negative之间存在这明显的分界线,可以通过逻辑回归来拟合出一条回归线。
二、建立模型
1. 逻辑回归模型的假设函数(hypothesis)如下:
#sigmoid函数
def sigmoid(z):
return 1/(1+np.exp(-z))
#假设函数h(x)
def model(X,theta):
return sigmoid(np.dot(X,theta.T))
这里我们需要添加一列x0(x0=1)的值,并把特征矩阵X和观测值y提取出来
#添加x0的特征值为1
df.insert(0,'ones',1)
#转化为矩阵matrix
data=df.as_matrix()
cols=data.shape[1] #计算data的列数
X=data[:,:cols-1]
y=data[:,cols-1:cols] #这里必须设置cols-1:cols,否则y的shape不对
#建立theta的矩阵
theta=np.zeros([1,3])