Logistic Regression其实也只是一种广义的线性回归,主要用于分类问题或者预测
原理
与线性回归原理差不多,只是在构造代价函数的时候有所区别,当然回归函数也因此有所改变
问题
假如你是某所学校的校长,请根据往年的录取情况(根据Exam 1 和Exam2 的成绩来确定),来预测今年的录取情况
数据集:
预测函数
因为只有两门考试内容,很明显该问题的预测函数是一个线性函数,毕竟考试分数越高,录取的概率越大,只是两门考试成绩所占权重不一样而已,所以设定预测函数 (x) :
+
*
+
*
= 0。如果测试集计算所得值为0,意味着该点正好在预测函数上;所得值大于0,则该点在预测函数之上;所得值小于0,则该点在预测函数之下。
决策函数
(z) =
/( 1 +
)
将预测函数的结果代入决策函数当中,即可实现分类问题。因为在决策函数中,一个很小的输入z,就可以得到一个很接近1或者0的值
代价函数
J(θ) = ( 1 / m )*[ -
log(
(
)) - (1 -
)log( 1 -
(
))]
代价函数主要计算误分类的代价,旨在用于更新我们的参数。当预测结果与实际结果相同时,则函数值为0;反之则产生代价。而我们的终极目标则是,选择合适的参数
,使得代价函数最小
梯度下降函数
如何求得合适的参数,使得代价函数最小呢?其实就是一个微分问题,以
为变量进行求导,从而使得一个极值。我们当然知道,极值不一定是最小值。而令我们开心的是,log(x)是一个凸函数,所以代价函数同样是一个凸函数,这样我们就确保了所求的极小值就是我们全局的最小值,这也是我们为什么代价函数选择log(x)的原因。(这是理论是的梯度下降函数,在实践当中我们没有必要去进行求导,只需要做到与求导相近的功能即可)
Python实现
说了这么多没用的东西,现在我们来进行实践,首先我们来看看我们的Logistic Regression的效果怎么样
可以看到,在误差允许范围内,表现还是很不错的,接下来我来介绍一下我们具体如何去实现
需要导入的库
InitData()
sigmoid()
grad_descent()
main()
结语
由于我放的是图片版,所以大家可能没办法直接ctrl+c ctrl+v,不过我还是建议大家去手动打代码,增加代码和Python的语法熟练度。反正我在写的时候,查询了很多关于上面两个库函数的功能和用法。还有,由于我也是网上借鉴相关代码,但是在运行后,发现学习效果太差了,基本上数据都在一侧,根本没有分类。我一度以为是我自己的问题,查看了很多博客,还是没什么效果。最后想到学习率和循环次数的问题,就尝试得降低学习率,增加循环次数,在一番调试后,最终拟合函数拟合得效果很好。