机器学习——逻辑回归算法代码实现

  • 前言
  • 一、逻辑回归是什么?
  • 二、代码实现
    • 1.数据说明
    • 2.逻辑回归代码

前言

最近准备开始学习机器学习,后续将对学习内容进行记录,该文主要针对逻辑回归代码实现进行记录!


一、逻辑回归是什么?

逻辑回归概念篇可看博主之前的文章,传送门


二、代码实现

1.数据说明

你想根据两次考试的结果来决定每个申请人的录取机会。你有以前的申请人的历史数据,你可以用它作为逻辑回归的训练集。对于每一个培训例子,你有两个考试的申请人的分数和录取决定。为了做到这一点,我们将建立一个分类模型,根据考试成绩估计入学概率。
数据源下载:数据下载 提取码: 5mf2

打开数据后可以看到,只有数字没有列名,于是在利用pandas创建DataFrame结构时需要手动指定header
数据导入

#三大件
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
# 可以在Ipython编译器里直接使用,功能是可以内嵌绘图,并且可以省略掉plt.show()这一步
import os
path = 'data' + os.sep + 'LogiReg_data.txt' #改成数据源路径
pdData = pd.read_csv(path, header=None, names=['Exam 1', 'Exam 2', 'Admitted'])#手动指定header
pdData.head()

输出为:

将数据用散点图绘制出来

positive = pdData[pdData['Admitted'] == 1] # returns the subset of rows such Admitted = 1, i.e. the set of *positive* examples
negative = pdData[pdData['Admitted'] == 0] # returns the subset of rows such Admitted = 0, i.e. the set of *negative* examplesfig, ax = plt.subplots(figsize=(10,5))
ax.scatter(positive['Exam 1'], positive['Exam 2'], s=30, c='b', marker='o', label='Admitted')
ax.scatter(negative['Exam 1'], negative['Exam 2'], s=30, c='r', marker='x', label='Not Admitted')
ax.legend()
ax.set_xlabel('Exam 1 Score')
ax.set_ylabel('Exam 2 Score')

输出为

2.逻辑回归代码

目标:建立分类器(求解出三个参数 θ0θ1θ2\theta_0\theta_1\theta_2θ0​θ1​θ2​)设定阈值,根据阈值判断录取结果(一般设置为0.5)
待完成模块:
·sigmoid : 映射到概率的函数
·model : 返回预测结果值
·cost : 根据参数计算损失
·gradient : 计算每个参数的梯度方向
·descent : 进行参数更新
·accuracy: 计算精度

具体代码说明:
①sigmoid函数

def sigmoid(z):return 1 / (1 + np.exp(-z))

②model函数

def model(X, theta):return sigmoid(np.dot(X, theta.T))

③增加一列取值为1的特征

if 'Ones' not in pdData.columns:pdData.insert(0, 'Ones', 1) # in a try / except structure so as not to return an error if the block si executed several times

④将pandas转换为ndarray,获取数据总列数

orig_data = pdData.values # convert the Pandas representation of the data to an array useful for further computations
cols = orig_data.shape[1]

⑤提取特征数据X,结果数据y,定义θ\thetaθ

X = orig_data[:,0:cols-1]
y = orig_data[:,cols-1:cols]
theta = np.zeros([1, 3])

⑥损失函数
J(θ)=1n∑i=1n[(−ylog(hθ(x)))−(1−y)log(1−hθ(x))]J(\theta)=\frac{1}{n}\sum_{i=1}^n[(-ylog(h_\theta(x)))-(1-y)log(1-h_\theta(x))]J(θ)=n1​∑i=1n​[(−ylog(hθ​(x)))−(1−y)log(1−hθ​(x))]

def cost(X, y, theta):left = np.multiply(-y, np.log(model(X, theta)))right = np.multiply(1 - y, np.log(1 - model(X, theta)))return np.sum( left-right) / (len(X)) #n取决于传递进来的X样本的个数,根据不同的梯度下降方法对应不同的n

⑦计算梯度方向

def gradient(X, y, theta):grad = np.zeros(theta.shape)error = (model(X, theta)-y ).ravel() #拉成一个一维数组#有三个待求参数,需要对每个参数机进行求偏导后存放到grad数组中for j in range(len(theta.ravel())): #for each parmeterterm = np.multiply(error, X[:,j]) #相当于乘了每个样本的第j个特征grad[0, j] = np.sum(term) / len(X) #n取决于传递进来的X样本的个数,根据不同的梯度下降方法对应不同的nreturn grad #返回每一个参数应该下降

⑧比较3中不同梯度下降方法

STOP_ITER = 0#根据迭代次数停止
STOP_COST = 1#根据损失停止
STOP_GRAD = 2#根据梯度def stopCriterion(type, value, threshold):#设定三种不同的停止策略if type == STOP_ITER:        return value > thresholdelif type == STOP_COST:      return abs(value[-1]-value[-2]) < thresholdelif type == STOP_GRAD:      return np.linalg.norm(value) < thresholdimport numpy.random
#洗牌
def shuffleData(data):np.random.shuffle(data)cols = data.shape[1]X = data[:, 0:cols-1]y = data[:, cols-1:]return X, yimport time
#batchsize=1表示随机梯度下降,batchsize=100表示批量梯度下降,为其他表示小批量
def descent(data, theta, batchSize, stopType, thresh, alpha):#梯度下降求解init_time = time.time()i = 0 # 迭代次数k = 0 # batchX, y = shuffleData(data)grad = np.zeros(theta.shape) # 计算的梯度costs = [cost(X, y, theta)] # 损失值while True:grad = gradient(X[k:k+batchSize], y[k:k+batchSize], theta)k += batchSize #取batch数量个数据if k >= n: k = 0 X, y = shuffleData(data) #重新洗牌theta = theta - alpha*grad # 参数更新costs.append(cost(X, y, theta)) # 计算新的损失i += 1 if stopType == STOP_ITER:       value = ielif stopType == STOP_COST:     value = costselif stopType == STOP_GRAD:     value = gradif stopCriterion(stopType, value, thresh): breakreturn theta, i-1, costs, grad, time.time() - init_timedef runExpe(data, theta, batchSize, stopType, thresh, alpha):#import pdb; pdb.set_trace();theta, iter, costs, grad, dur = descent(data, theta, batchSize, stopType, thresh, alpha)name = "Original" if (data[:,1]>2).sum() > 1 else "Scaled"name += " data - learning rate: {} - ".format(alpha)if batchSize==n: strDescType = "Gradient"elif batchSize==1:  strDescType = "Stochastic"else: strDescType = "Mini-batch ({})".format(batchSize)name += strDescType + " descent - Stop: "if stopType == STOP_ITER: strStop = "{} iterations".format(thresh)elif stopType == STOP_COST: strStop = "costs change < {}".format(thresh)else: strStop = "gradient norm < {}".format(thresh)name += strStopprint ("***{}\nTheta: {} - Iter: {} - Last cost: {:03.2f} - Duration: {:03.2f}s".format(name, theta, iter, costs[-1], dur))fig, ax = plt.subplots(figsize=(12,4))ax.plot(np.arange(len(costs)), costs, 'r')ax.set_xlabel('Iterations')ax.set_ylabel('Cost')ax.set_title(name.upper() + ' - Error vs. Iteration')return theta

对结果进行绘图分析:

#选择的梯度下降方法是基于所有样本的,迭代50000次,每一次步长为0.000001
n=100
runExpe(orig_data, theta, n, STOP_ITER, thresh=5000, alpha=0.000001)

runExpe(orig_data, theta, n, STOP_COST, thresh=0.000001, alpha=0.001)

runExpe(orig_data, theta, n, STOP_GRAD, thresh=0.05, alpha=0.001)





机器学习——逻辑回归算法代码实现相关推荐

  1. 机器学习 逻辑回归算法应用案例

    机器学习 逻辑回归算法应用案例 时间:2020.09.12 出处:https://www.kesci.com/home/project/5bfe39b3954d6e0010681cd1 注明:初学逻辑 ...

  2. 机器学习——逻辑回归算法

    文章目录 逻辑回归算法 逻辑回归概念 Sigmoid函数 逻辑回归模型 代价函数 最终运用梯度下降求解 实验 总结 逻辑回归算法 首先明确一个概念,逻辑回归并不是解决回归问题,而是解决分类问题,它是通 ...

  3. 机器学习算法平台alink_机器学习-逻辑回归算法

    1-逻辑回归算法原理推导 逻辑回归算法其实是一个分类算法,是非常经典,优秀的算法.一般我们不知道用哪个分类算法的时候,首先用逻辑回归算法试一试:它不仅可以实现二分类算法,还可以解决多分类问题 逻辑回归 ...

  4. 基于机器学习逻辑回归算法完成癌症病人的肿瘤是否良性的判断

    https://www.toutiao.com/a6630407688360575502/ 2018-12-04 22:46:48 逻辑回归算法 虽然逻辑回归算法的名字中有回归二字,但是它却不是回归算 ...

  5. Python机器学习:逻辑回归算法以及多类分类

    向AI转型的程序员都关注了这个号

  6. 线性回归和逻辑回归的区别_Spark实现线性回归与逻辑回归算法

    一.线性回归算法简介 线性回归(Linear Regression)是利用线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析.这种函数是一个或多个称为回归系数的模型参数 ...

  7. 【机器学习入门】(9) 逻辑回归算法:原理、精确率、召回率、实例应用(癌症病例预测)附python完整代码和数据集

    各位同学好,今天我和大家分享一下python机器学习中的逻辑回归算法.内容主要有: (1) 算法原理:(2) 精确率和召回率:(3) 实例应用--癌症病例预测. 文末有数据集和python完整代码 1 ...

  8. 机器学习笔记(10)——逻辑回归算法优化之随机梯度下降法

    在上一篇文章<机器学习笔记(9)--深入理解逻辑回归算法及其Python实现>中,详细学习了逻辑回归算法的分类原理和使用梯度下降法来最小化损失函数的数学推导过程,从而拟合出分类函数的参数θ ...

  9. 机器学习算法 03 —— 逻辑回归算法(精确率和召回率、ROC曲线和AUC指标、过采样和欠采样)

    文章目录 系列文章 逻辑回归 1 逻辑回归介绍 1.1 逻辑回归原理 输入 激活函数 1.2 损失以及优化 2 逻辑回归API介绍 3 案例:肿瘤良性恶性预测 4 分类模型的评估 4.1 分类评估方法 ...

  10. 机器学习【逻辑回归算法】

    文章目录 一 介绍 1 应用场景 2 逻辑回归的原理 2.1 输入 2.2 激活函数 3 损失以及优化 3.1 损失 3.2 优化 二 API介绍 三 案例 1 分析 2 代码 四 分类评估方法 1. ...

最新文章

  1. Spring boot错误处理机制
  2. XCTF-Reverse:python-trade
  3. c++两个vector合并_这才是真正的 Git——分支合并
  4. 中标麒麟linux卸载qt,国产化 银河麒麟编译Qt程序的问题汇总 | 阿拉灯
  5. 同步外部接口数据的一些记录和分享
  6. Atmospheric Scattering
  7. 深度学习中防止过拟合的方法
  8. 通过CISA的一些经验分享(原文写于09年)
  9. java快速压缩文件夹_如何使用java压缩文件夹本身
  10. linux内核对TCP的连接状态管理
  11. Tsinsen A1517. 动态树 树链剖分,线段树,子树操作
  12. 亿贝html5,亿贝CALL
  13. 夏梦竹谈Hive vs. HBase的区别
  14. Modular Inverse(zoj3609+欧几里德)
  15. “国际通信展”十年的印记
  16. ttc、otf、ttf文件制作以及相关数据增强(OCR)
  17. linux服务器上有些文件看不到,linux执行脚本时找不到文件怎么解决
  18. ui文件转换为py文件方法
  19. Java问卷调查管理系统(附数据库)
  20. pageadmin CMS网站制作教程:栏目单页内容如何修改

热门文章

  1. hprose for java 教程_Hprose for Java 快速入门
  2. 隐马尔可夫模型基础介绍
  3. 深度学习基础笔记——卷积神经网络概念及其计算方式
  4. 树莓派4安装minecraft java 1.12.2
  5. VSCode中插件Code Spell Checker
  6. 2016河南省第九届ACM程序设计竞赛[正式赛四]
  7. 学计算机导论的感悟,学习《计算机导论》后的感想
  8. Jlink 接口定义
  9. 计算机科学导论复习提纲,计算机科学导论复习资料整理
  10. MATLAB/Simulink 基础入门讲解(二)【未完】