机器学习逻辑回归模型总结——从原理到sklearn实践
来源:互联网 发布:mac上玩穿越火线 编辑:程序博客网 时间:2024/05/16 08:14
0x00 基本原理
逻辑回归算法,从名字上看似乎是个回归问题,但实际上逻辑回归是个典型的分类算法。
对于分类问题,一般都是一些离散变量,且y的取值如下:
以二元分类问题开始讨论,y的取值为“类别1,类别2”,为了表示清楚,这里使用0和1来表示二元分类中的两个类别,即y的取值为:
和线性回归问题一样,我们规定假设函数为:
在逻辑回归中,实际上对于假设函数,使用了一种逻辑函数的概念,函数如下:
称为S型函数,或者逻辑函数。取值范围为(0,1),符合我们上面对假设函数的要求。通常,设置阈值为0.5,如果训练样本输入到假设函数中,得到的值大于0.5,则认为分类为1,否则分类为0:
相应的,我们的损失函数(Cost Function)为:
如果这里计算折损的形式还是和线性回归一样平方损失函数:
所以在计算折损值的时候,逻辑回归中使用了对数损失函数来获得一个凸函数的J,整理得到的最终损失函数形式如下,其中省略了若干数学推导:
我们再次使用梯度下降算法来求出最优的参数向量,梯度下降在逻辑回归中表现如下:
可能有人发现,这不和线性拟合问题中的梯度下降公式一样吗?实际上,由于逻辑回归模型中采用了逻辑函数来表示假设函数,所以这两种模型中的梯度下降表达式是完全不同的两回事儿。
有了梯度下降算法,我们就可以使用训练集来求出最优的参数向量。逻辑回归中,为了消除过度拟合问题,有正则化方法,这里就不再赘述。
0x01 算法实现
根据Andrew Ng所提供的资料,我们依旧选择Octave来实现逻辑回归算法。
首先是sigmoid函数(逻辑函数)的表达:
function g = sigmoid(z)g = zeros(size(z));g = 1 ./ (1+exp(-z));end
Cost Function的实现:
function [J, grad] = costFunction(theta, X, y)% 初始化m = length(y);J = 0;grad = zeros(size(theta));% 损失函数的计算temp = sigmoid(X*theta);temp = temp(:,size(temp, 2));J = (1/m) * sum((-y.*log(temp))-((1-y).*log(1-temp))) ;% 损失函数的导数计算for i=1:size(theta,1), grad(i) = (1/m) * sum((temp - y).*X(:,i));end;end
由于资料中所给的不是直接使用梯度下降算法,而是使用了Octave中的优化方法来求最优参数向量,所以只需要返回损失函数J和各个损失函数的导数grad
。实际上,如果改成直接使用梯度下降的话,只需要在求grad的过程中,同步更新我们各个参数即可。
预测函数如下,这里一般选择阈值为0.5,所以大于0.5的假设函数返回值,我们就判断类别为1。
function p = predict(theta, X)m = size(X, 1); p = zeros(m, 1);% 计算类别,使用p向量返回for i=1:m, prop = sigmoid(X(i,:)*theta) ; if prop >= 0.5, p(i) = 1; end;end;end;
0x02 算法运行
运行算法,可以看到可视化的决策边界:
0x03 sklearn库实践
清楚了逻辑回归模型的原理,我们使用python进行机器学习演练,使用sklearn机器学习库,可以很方便地进行实践。
数据集为学生的两次考试成绩以及是否通过大学申请,我们用逻辑回归进行分类,以后给出一个样本,输出成功通过大学申请的概率。
#!/usr/bin/env python# -*- coding: utf-8 -*-from __future__ import divisionimport numpy as npimport matplotlib.pyplot as pltimport pandas as pdfrom sklearn.cross_validation import train_test_splitfrom sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import classification_report from sklearn.metrics import precision_recall_curve, roc_curve, auc data = pd.read_csv('ex2data1.txt', sep=',', \ skiprows=[2], names=['score1','score2','result'])score_data = data.loc[:,['score1','score2']]result_data = data.resultp = 0for i in xrange(10): x_train, x_test, y_train, y_test = \ train_test_split(score_data, result_data, test_size = 0.2) model = LogisticRegression(C=1e9) model.fit(x_train, y_train) predict_y = model.predict(x_test) p += np.mean(predict_y == y_test)# 绘制图像pos_data = data[data.result == 1].loc[:,['score1','score2']]neg_data = data[data.result == 0].loc[:,['score1','score2']]h = 0.02x_min, x_max = score_data.loc[:, ['score1']].min() - .5, score_data.loc[:, ['score1']].max() + .5y_min, y_max = score_data.loc[:, ['score2']].min() - .5, score_data.loc[:, ['score2']].max() + .5xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))Z = model.predict(np.c_[xx.ravel(), yy.ravel()])# 绘制边界和散点Z = Z.reshape(xx.shape)plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)plt.scatter(x=pos_data.score1, y=pos_data.score2, color='black', marker='o')plt.scatter(x=neg_data.score1, y=neg_data.score2, color='red', marker='*')plt.xlim(xx.min(), xx.max())plt.ylim(yy.min(), yy.max())plt.show()# 模型表现answer = model.predict_proba(x_test)[:,1] precision, recall, thresholds = precision_recall_curve(y_test, answer) report = answer > 0.5 print(classification_report(y_test, report, target_names = ['neg', 'pos'])) print("average precision:", p/100)
运行结果如下:
画出了决策边界之后,就可以看到我们最后的分类结果。
当然也可以使用precision_call_curve
方法自动计算召回率精度等数据:
precision recall f1-score support neg 0.88 0.88 0.88 8 pos 0.92 0.92 0.92 12avg / total 0.90 0.90 0.90 20('average precision:', 0.089999999999999997)
精度达到了90%,模型效果还不错。
0x04 总结
逻辑回归模型实际上是一个典型的监督学习分类算法,配合sklearn库可以很方便的进行逻辑回归处理。前提是要真正理解逻辑回归模型的原理和推导过程。
实战中,机器学习和信息安全结合越来越紧密了,所以这也是我为啥开始学习机器学习的原因,就逻辑回归而言,完全可以用在防爬检测,扫描器检测,恶意URL提取的应用上,实战的前提是了解原理:)
- 机器学习逻辑回归模型总结——从原理到sklearn实践
- 机器学习逻辑回归模型总结——从原理到sklearn实践
- 【机器学习 sklearn】逻辑斯蒂回归模型--Logistics regression
- 机器学习(6)——从线性回归到逻辑斯特回归
- 机器学习-sklearn逻辑回归分析
- 机器学习----从线性回归到逻辑斯特回归
- 机器学习总结(二)——逻辑斯谛回归和最大熵模型
- 机器学习模型——逻辑回归Logistic Regression
- 机器学习——线性模型之逻辑回归
- 使用sklearn进行机器学习—实践
- Python机器学习库sklearn里利用决策树模型进行回归分析的原理
- 吴恩达机器学习笔记——指数分布族&广义线性模型&逻辑回归概率模型推导
- 从广义线性模型到逻辑回归
- 从广义线性模型到逻辑回归
- 从广义线性模型到逻辑回归
- 机器学习之逻辑回归改善模型
- 机器学习中的逻辑回归模型简介
- 机器学习笔记 (2)-逻辑回归模型
- [leetcode300] Longest Increasing Subsequence
- dba_jobs与dba_scheduler_jobs的不同
- 使用VAssistX为VS2008 c++代码添加函数头注释
- 解决Jenkins console输出乱码
- android 学习路线指南
- 机器学习逻辑回归模型总结——从原理到sklearn实践
- Ajax 请求的http头信息特点 x-requested-with
- QQ1425858665骗子
- 运维小命令
- ListView透明背景点击设置
- Leetcode: Longest Increasing Subsequence
- * 引领华为:任正非的七大领导力启示
- ios开发时,在Xcode中添加多个targets进行版本控制
- DP--完全背包--HDU - 4508