跟我一起机器学习系列文章将首发于公众号:月来客栈,欢迎搜索关注!
0 前言
在上一讲中,笔者通过五篇文章来详细的介绍了线性回归模型,那么本讲开始继续介绍下一个经典的机器学习算法逻辑回归(Logistics Regression)。
如图所示为逻辑回归模型学习的大致路线,同样也分为三个阶段。在第一个阶段结束后,我们也就大致掌握了逻辑回归的基本原理。下面就开始正式进入逻辑回归模型的学习。
1 引例
通常来讲,一个新算法的诞生要么用来改善已有的算法模型,要么就是首次提出用来解决一个新的问题。而线性回归模型恰恰属于后者,是用来解决一类新的问题——分类(Classification)。那什么又是分类问题呢?
如图所示有两堆样本点,即二分类问题(Binary Classification),现在需要你建立一个模型来对新输入的样本进行预测,判断其应该属于那个类别。对于这个问题的描述用线性回归来解决肯定是不行的,因为两者本就属于不同类型的问题。退一步讲,即使是用线性回归来建模得到的估计也就是一条向右倾斜的直线,而我们这里需要的却是一条向左倾斜的直线。同时,回归模型的预测值都是位于预测曲线上的,而无法做到区分直线两边的东西。那既然用已有的线性回归解决不了,那我们可不可以在此基础上做一点改进以实现分类的目的呢?答案是当然可以。
2 建立模型
2.1 如何建立模型
既然是解决分类问题,那么我们完全可以通过建立一个模型用来预测每个样本点属于其中一个类别的概率
前面线性回归中,我们通过建模
其中
注:回归模型一般来说都是指对连续值预测的一类模型,而分类模型都是指对离散值(类标)预测的一类模型。但是由于历史的原因虽然逻辑回归被称为回归,但它却是一个分类模型,这算是一个例外。
2.2 如何求解模型
当我们建立好模型之后就需要找到一种方法来求解模型中的未知参数。同线性回归一样,此时我们也需要通过一种间接的方式,即通过目标函数来刻画预测标签(label)与真实标签之间的差距。当最小化目标函数后,我们便能得到需要求解的参数
其中,
由公式(2)可以知道,当函数
3 Scikit-learn建模
- 制作数据集
def make_data():
num_points = 200
centers = [[1, 1], [2, 2]] # 指定中心
x, y = make_blobs(n_samples=num_points, centers=centers, cluster_std=0.2, random_state=np.random.seed(10))
index_pos, index_neg = (y == 1), (y == 0)
x_pos, x_neg = x[index_pos], x[index_neg]
plt.scatter(x_pos[:, 0], x_pos[:, 1], marker='o', label='positive')
plt.scatter(x_neg[:, 0], x_neg[:, 1], marker='s', label='negative')
plt.legend(fontsize=15)
plt.show()
return x, y
生成下图所示的数据集:
- 模型训练与预测
def decision_boundary(x, y):
########### 模型求解并预测
model = LogisticRegression()
model.fit(x, y)
pred = model.predict([[1, 0.5], [3, 1.5]])
print("样本点(1,0.5)所属的类标为{}n样本点(3,1.5)所属的类标为{}".format(pred[0], pred[1]))
########### 绘制决策面
x_min, x_max = x[:, 0].min() - .5, x[:, 0].max() + .5
y_min, y_max = x[:, 1].min() - .5, x[:, 1].max() + .5
h = .02 # step size in the mesh
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
x_new = np.hstack([xx.reshape(-1, 1), yy.reshape(-1, 1)])
Z = model.predict(x_new)
Z = Z.reshape(xx.shape)
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)
########### 绘制原始样本点
index_pos, index_neg = (y == 1), (y == 0)
x_pos, x_neg = x[index_pos], x[index_neg]
plt.scatter(x_pos[:, 0], x_pos[:, 1], marker='o', label='positive')
plt.scatter(x_neg[:, 0], x_neg[:, 1], marker='s', label='negative')
plt.legend(fontsize=15)
plt.show()
if __name__ == '__main__':
x, y = make_data()
decision_boundary(x, y)
#结果:
#样本点(1,0.5)所属的类标为0
#样本点(3,1.5)所属的类标为1
训练完成之后,我们便可以绘制出如下所示的一个决策面,用于样本点的分类。
4 总结
在这篇文章中,①笔者首先通过一个例子引入了什么是分类,然后说了为什么不能用线性回归模型进行建模的原因;②其次,通过对线性回归的改进得到逻辑回归模型,并直接的给出了目标函数;③最后通过开源的sklearn框架搭建了一个简单的逻辑回归模型,并对决策面进行了可视化。虽然内容不多,也不复杂但却包含了逻辑回归算法的核心思想。同时,余下的内容也会在后续的文章中进行介绍。本次内容就到此结束,感谢阅读!
若有任何疑问,请发邮件至moon-hotel@hotmail.com并附上文章链接,青山不改,绿水长流,月来客栈见!
引用
- 示例代码:关注公众号回复“示例代码”即可直接获取!