吴恩达《机器学习》学习笔记七——逻辑回归(二分类)代码

吴恩达《机器学习》学习笔记七——逻辑回归(二分类)代码

  • 一、无正则项的逻辑回归
    • 1.问题描述
    • 2.导入模块
    • 3.准备数据
    • 4.假设函数
    • 5.代价函数
    • 6.梯度下降
    • 7.拟合参数
    • 8.用训练集预测和验证
    • 9.寻找决策边界
  • 二、正则化逻辑回归
    • 1.准备数据
    • 2.特征映射
    • 3.正则化代价函数
    • 4.正则化梯度
    • 5.拟合参数
    • 6.预测
    • 7.画出决策边界

课程链接:https://www.bilibili.com/video/BV164411b7dx?from=search&seid=5329376196520099118

这次的笔记紧接着上两次对逻辑回归模型和正则化笔记,将一个分类问题用逻辑回归和正则化的方法解决。机器学习在我看来,理论和代码需要两手抓,即使理论搞懂,代码也将是又一个门槛,所以多多尝试。

这次笔记用到的数据集:https://pan.baidu.com/s/1h5Ygse5q2wkTeXA9Pwq2RA
提取码:5rd4

一、无正则项的逻辑回归

1.问题描述

建立一个逻辑回归模型来预测一个学生是否被大学录取。根据两次考试的结果来决定每个申请人的录取机会。有以前的申请人的历史数据, 可以用它作为逻辑回归的训练集

python实现逻辑回归 目标:建立分类器(求解出三个参数 θ0 θ1 θ2)即得出分界线 备注:θ1对应’Exam 1’成绩,θ2对应’Exam 2’ 设定阈值,根据阈值判断录取结果 备注:阈值指的是最终得到的概率值.将概率值转化成一个类别.一般是>0.5是被录取了,<0.5未被录取.

2.导入模块

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use('fivethirtyeight') #样式美化
import matplotlib.pyplot as plt
from sklearn.metrics import classification_report#这个包是评价报告

1.Seaborn是基于matplotlib的图形可视化python包。它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表。

Seaborn是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。应该把Seaborn视为matplotlib的补充,而不是替代物。同时它能高度兼容numpy与pandas数据结构以及scipy与statsmodels等统计模式。

2.plt.style.use()函数;可以对图片的整体风格进行设置。可以通过plt.style.availabel知道一共有多少种主题。具体参考plt.style.use()函数介绍。

3.sklearn中的classification_report函数用于显示主要分类指标的文本报告.在报告中显示每个类的精确度,召回率,F1值等信息。具体参考classification_report函数介绍

3.准备数据

data = pd.read_csv('work/ex2data1.txt', names=['exam1', 'exam2', 'admitted'])
data.head()#看前五行

在这里插入图片描述

data.describe()

在这里插入图片描述
数据读入后,通过可视化查看一下数据分布:

sns.set(context="notebook", style="darkgrid", palette=sns.color_palette("RdBu", 2)) #设置样式参数,默认主题 darkgrid(灰色背景+白网格),调色板 2色sns.lmplot('exam1', 'exam2', hue='admitted', data=data,   size=6, fit_reg=False,                         #fit_reg'参数,控制是否显示拟合的直线scatter_kws={"s": 50})                                       #hue参数是将name所指定的不同类型的数据叠加在一张图中显示
plt.show()#看下数据的样子

在这里插入图片描述
定义了下面三个函数,分别用于从数据中提取特征X,提取标签y,以及对特征进行标准化处理。

def get_X(df):#读取特征
#     """
#     use concat to add intersect feature to avoid side effect
#     not efficient for big dataset though
#     """ones = pd.DataFrame({'ones': np.ones(len(df))})#ones是m行1列的dataframedata = pd.concat([ones, df], axis=1)  # 合并数据,根据列合并 axis = 1的时候,concat就是行对齐,然后将不同列名称的两张表合并 加列return data.iloc[:, :-1].as_matrix()  # 这个操作返回 ndarray,不是矩阵def get_y(df):#读取标签
#     '''assume the last column is the target'''return np.array(df.iloc[:, -1])#df.iloc[:, -1]是指df的最后一列def normalize_feature(df):
#     """Applies function along input axis(default 0) of DataFrame."""return df.apply(lambda column: (column - column.mean()) / column.std())#特征缩放在逻辑回归同样适用

提取特征和标签:

X = get_X(data)
print(X.shape)y = get_y(data)
print(y.shape)

在这里插入图片描述

4.假设函数

逻辑回归模型的假设函数:
在这里插入图片描述

def sigmoid(z):# your code here  (appro ~ 1 lines)return 1 / (1 + np.exp(-z))

绘制一下sigmoid函数的图像:

fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(np.arange(-10, 10, step=0.01),sigmoid(np.arange(-10, 10, step=0.01)))
ax.set_ylim((-0.1,1.1))     #lim 轴线显示长度
ax.set_xlabel('z', fontsize=18)
ax.set_ylabel('g(z)', fontsize=18)
ax.set_title('sigmoid function', fontsize=18)
plt.show()

在这里插入图片描述

5.代价函数

在这里插入图片描述
初始化参数:

theta = theta=np.zeros(3) # X(m*n) so theta is n*1
theta

在这里插入图片描述
定义代价函数:

def cost(theta, X, y):''' cost fn is -l(theta) for you to minimize'''costf = np.mean(-y * np.log(sigmoid(X @ theta)) - (1 - y) * np.log(1 - sigmoid(X @ theta)))return costf
# Hint:X @ theta与X.dot(theta)等价

计算一下初始的代价函数值:

cost(theta, X, y)

在这里插入图片描述

6.梯度下降

在这里插入图片描述
这是批量梯度下降(batch gradient descent)
转化为向量化计算:
在这里插入图片描述
依次定义梯度:

def gradient(theta, X, y):# your code here  (appro ~ 2 lines)return (1 / len(X)) * X.T @ (sigmoid(X @ theta) - y)

计算梯度初始值:

gradient(theta, X, y)

在这里插入图片描述

7.拟合参数

这里不再自定义更新参数的函数,而是使用scipy.optimize.minimize 去自动寻找参数。

import scipy.optimize as opt
res = opt.minimize(fun=cost, x0=theta, args=(X, y), method='Newton-CG', jac=gradient)
print(res)

在这里插入图片描述
其中fun是指优化后的代价函数值,x是指优化后的三个参数值。以上,算是已经训练完成。

8.用训练集预测和验证

因为这里没有提供验证集,所以使用训练集进行预测和验证。就是用训练好的模型对训练集进行预测,将结果与真实结果进行比较评估。

def predict(x, theta):prob = sigmoid(x @ theta)return (prob >= 0.5).astype(int)   #实现变量类型转换
final_theta = res.x
y_pred = predict(X, final_theta)print(classification_report(y, y_pred))

在这里插入图片描述

9.寻找决策边界

决策边界就是下面这样一条线:
在这里插入图片描述

print(res.x) # this is final theta

在这里插入图片描述

coef = -(res.x / res.x[2])  # find the equation
print(coef)x = np.arange(130, step=0.1)
y = coef[0] + coef[1]*x

在这里插入图片描述
在看一下数据描述,确定一下x和y的范围:

data.describe()  # find the range of x and y

在这里插入图片描述

sns.set(context="notebook", style="ticks", font_scale=1.5)  默认使用notebook上下文 主题 context可以设置输出图片的大小尺寸(scale)sns.lmplot('exam1', 'exam2', hue='admitted', data=data, size=6, fit_reg=False, scatter_kws={"s": 25})plt.plot(x, y, 'grey')
plt.xlim(0, 130) 
plt.ylim(0, 130)
plt.title('Decision Boundary')
plt.show()

在这里插入图片描述

二、正则化逻辑回归

1.准备数据

这边使用一个新的数据集:

df = pd.read_csv('ex2data2.txt', names=['test1', 'test2', 'accepted'])
df.head()

在这里插入图片描述

sns.set(context="notebook", style="ticks", font_scale=1.5)sns.lmplot('test1', 'test2', hue='accepted', data=df, size=6, fit_reg=False, scatter_kws={"s": 50})plt.title('Regularized Logistic Regression')
plt.show()

在这里插入图片描述
从这个数据分布来看,不可能使用一条直线做到很好的划分数据集两个类别。所以我们需要做一个特征映射,就是在已有的两个特征的基础上添加一些高次幂的特征组合,使得决策边界可以变成一条能较好划分的曲线。

2.特征映射

在这里我把它映射成这样的一组特征:
在这里插入图片描述
一共有28个项,那么我们可以将这些组合特征看成一个个独立的特征,即看成x1、x2。。。x28,然后通过逻辑回归的方法来求解。

def feature_mapping(x, y, power, as_ndarray=False):
#     """return mapped features as ndarray or dataframe"""data = {"f{}{}".format(i - p, p): np.power(x, i - p) * np.power(y, p)for i in np.arange(power + 1)for p in np.arange(i + 1)}if as_ndarray:return pd.DataFrame(data).as_matrix()else:return pd.DataFrame(data)
x1 = np.array(df.test1)
x2 = np.array(df.test2)
data = feature_mapping(x1, x2, power=6)
print(data.shape)
data.head()

下面是特征映射之后的数据集,特征变成了28维:
在这里插入图片描述

data.describe()

在这里插入图片描述

3.正则化代价函数

在这里插入图片描述
相比之前的表达式,多了正则化的惩罚项。

theta = np.zeros(data.shape[1])
X = feature_mapping(x1, x2, power=6, as_ndarray=True)
print(X.shape)y = get_y(df)
print(y.shape)

在这里插入图片描述

def regularized_cost(theta, X, y, l=1):theta_j1_to_n = theta[1:]regularized_term = (l / (2 * len(X))) * np.power(theta_j1_to_n, 2).sum()return  cost(theta, X, y) + regularized_term

计算一下初始代价函数值:

regularized_cost(theta, X, y, l=1)

在这里插入图片描述
因为我们设置theta为0,所以这个正则化代价函数与代价函数的值应该相同

4.正则化梯度

在这里插入图片描述

def regularized_gradient(theta, X, y, l=1):theta_j1_to_n = theta[1:]      #不加theta0regularized_theta = (l / len(X)) * theta_j1_to_nregularized_term = np.concatenate([np.array([0]), regularized_theta])return gradient(theta, X, y) + regularized_term

计算一下梯度的初始值:

regularized_gradient(theta, X, y)

在这里插入图片描述

5.拟合参数

import scipy.optimize as opt
print('init cost = {}'.format(regularized_cost(theta, X, y)))res = opt.minimize(fun=regularized_cost, x0=theta, args=(X, y), method='Newton-CG', jac=regularized_gradient)
res

在这里插入图片描述

6.预测

final_theta = res.x
y_pred = predict(X, final_theta)print(classification_report(y, y_pred))

在这里插入图片描述

7.画出决策边界

我们需要找到所有满足 X×θ=0 的x,这里不求解多项式表达式,而是创造一个足够密集的网格,对网格里的每一个点进行 X×θ的计算,若结果小于一个很小的值,如10 ^ -3,则可以当做是边界上的一点,遍历该网格上的每一点,即可得到近似边界。

def draw_boundary(power, l):
#     """
#     power: polynomial power for mapped feature
#     l: lambda constant
#     """density = 1000threshhold = 2 * 10**-3final_theta = feature_mapped_logistic_regression(power, l)x, y = find_decision_boundary(density, power, final_theta, threshhold)df = pd.read_csv('ex2data2.txt', names=['test1', 'test2', 'accepted'])sns.lmplot('test1', 'test2', hue='accepted', data=df, size=6, fit_reg=False, scatter_kws={"s": 100})plt.scatter(x, y, c='R', s=10)plt.title('Decision boundary')plt.show()
def feature_mapped_logistic_regression(power, l):
#     """for drawing purpose only.. not a well generealize logistic regression
#     power: int
#         raise x1, x2 to polynomial power
#     l: int
#         lambda constant for regularization term
#     """df = pd.read_csv('ex2data2.txt', names=['test1', 'test2', 'accepted'])x1 = np.array(df.test1)x2 = np.array(df.test2)y = get_y(df)X = feature_mapping(x1, x2, power, as_ndarray=True)theta = np.zeros(X.shape[1])res = opt.minimize(fun=regularized_cost,x0=theta,args=(X, y, l),method='TNC',jac=regularized_gradient)final_theta = res.xreturn final_theta
def find_decision_boundary(density, power, theta, threshhold):t1 = np.linspace(-1, 1.5, density)  #1000个样本t2 = np.linspace(-1, 1.5, density)cordinates = [(x, y) for x in t1 for y in t2]x_cord, y_cord = zip(*cordinates)mapped_cord = feature_mapping(x_cord, y_cord, power)  # this is a dataframeinner_product = mapped_cord.as_matrix() @ thetadecision = mapped_cord[np.abs(inner_product) < threshhold]return decision.f10, decision.f01
#寻找决策边界函数

下面我们看一下正则化系数不同,导致的决策边界有什么不同?

draw_boundary(power=6, l=1)     #set lambda = 1

在这里插入图片描述

draw_boundary(power=6, l=0)  # set lambda < 0.1

在这里插入图片描述

draw_boundary(power=6, l=100)  # set lambda > 10

在这里插入图片描述
上面三个例子分别展示了较好拟合、过拟合和欠拟合的三种情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从认知学到进化论,详述强化学习两大最新突破

来源&#xff1a;大数据文摘深层强化学习&#xff08;deep RL&#xff09;近年来在人工智能方面取得了令人瞩目的进步&#xff0c;在Atari游戏、围棋及无限制扑克等领域战胜了人类。通过将表征学习与奖励驱动行为相结合&#xff0c;深层强化学习又引发了心理学和神经科学领域的…

吴恩达《机器学习》学习笔记九——神经网络相关(1)

吴恩达《机器学习》学习笔记九——神经网络相关&#xff08;1&#xff09;一、 非线性假设的问题二、 神经网络相关知识1.神经网络的大致历史2.神经网络的表示3.前向传播&#xff1a;向量化表示三、 例子与直觉理解1.问题描述&#xff1a;异或XOR、同或XNOR2.单个神经元如何计算…

刚刚,科学家发现了一大堆解释人类进化的基因...

图片来源&#xff1a;《Nature Genetics》来源&#xff1a;中国生物技术网 5月27日发表在《Nature Genetics》上的一项新研究发现&#xff0c; 以前被认为在不同生物体中具有相似作用的数十种基因&#xff0c;实际上是人类独有的&#xff0c; 这或许有助于解释我们这个物种是如…

吴恩达《机器学习》学习笔记八——逻辑回归(多分类)代码

吴恩达《机器学习》笔记八——逻辑回归&#xff08;多分类&#xff09;代码导入模块及加载数据sigmoid函数与假设函数代价函数梯度下降一对多分类预测验证课程链接&#xff1a;https://www.bilibili.com/video/BV164411b7dx?fromsearch&seid5329376196520099118 之前笔记…

DeepMind 综述深度强化学习:智能体和人类相似度竟然如此高!

来源&#xff1a;AI科技评论近年来&#xff0c;深度强化学习&#xff08;Deep reinforcement learning&#xff09;方法在人工智能方面取得了瞩目的成就&#xff0c;从 Atari 游戏、到围棋、再到无限制扑克等领域&#xff0c;AI 的表现都大大超越了专业选手&#xff0c;这一进展…

吴恩达《机器学习》学习笔记十——神经网络相关(2)

吴恩达《机器学习》学习笔记十——神经网络相关&#xff08;2&#xff09;一、 代价函数二、 反向传播算法三、 理解反向传播算法四、 梯度检测五、 随机初始化1.全部初始化为0的问题2.随机初始化的思想六、 神经网络算法整体流程1.选择网络具体架构2.训练神经网络课程链接&…

吴恩达《机器学习》学习笔记十一——神经网络代码

吴恩达《机器学习》学习笔记十一——神经网络代码数据准备神经网络结构与代价函数初始化设置反向传播算法训练网络与验证课程链接&#xff1a;https://www.bilibili.com/video/BV164411b7dx?fromsearch&seid5329376196520099118 数据集链接&#xff1a;https://pan.baidu…

中国科研人员发明单晶体管逻辑结构新原理

▲随着晶体管不断缩小特征尺寸&#xff0c;集成电路的性能得以持续提升。然而在超小器件尺寸下&#xff0c;硅材料的物理极限导致了功耗的大幅提升&#xff0c;难以进一步持续减小晶体管的特征尺寸。来源&#xff1a;文汇网通过引入层状半导体&#xff0c;并依据其特性设计新型…

Java 内存模型

1、并发模型编程的分类 在并发模型编程中&#xff0c;我们需要解决两个关键问题&#xff1a;线程之间如何通信以及线程之间如何同步。线程之间的通信包括两种&#xff1a;共享内存和消息传递。 Java并发采用的是共享内存模型。 2、Java内存模型的抽象 Java内存模型的主要目标是…

PyTorch框架学习一——PyTorch的安装(CPU版本)

PyTorch框架学习一——PyTorch的安装&#xff08;CPU版本&#xff09;PyTorch简介PyTorch的安装&#xff08;CPU版&#xff09;机器学习/深度学习领域的学习都是需要理论和实践相结合的&#xff0c;而它们的实践都需要借助于一个框架来实现&#xff0c;PyTorch在学术界目前处于…

你的大脑在自动驾驶,而你一无所知

来源&#xff1a;果壳想象一下&#xff0c;你的大脑里有着两个小人&#xff0c;它们在不停地打架&#xff0c;试图夺取控制你行动的权力。当然&#xff0c;这两个小人并不是你善意和邪恶的念头。那它们是什么&#xff1f;在很多人看来&#xff0c;这两者就是我们的意识和无意识…

常用的损失函数

来自 机器学习成长之路公众号 本文将常用的损失函数分为了两大类&#xff1a;分类和回归。然后又分别对这两类进行了细分和讲解&#xff0c;其中回归中包含了一种不太常见的损失函数&#xff1a;平均偏差误差&#xff0c;可以用来确定模型中存在正偏差还是负偏差。 从学习任务…

吴恩达《机器学习》学习笔记十一——应用机器学习的建议

吴恩达《机器学习》学习笔记十一——应用机器学习的建议一、训练完模型后下一步要做什么二、评估算法与模型选择1.训练集与测试集2.训练/测试步骤3.模型选择4.数据集新的划分——验证集的加入三、偏差与方差1.偏差与方差的理解2.正则化和偏差方差的关系3.学习曲线四、决定接下来…

为什么说深耕AI领域绕不开知识图谱?

来源&#xff1a;AI科技大本营“所有在 AI 领域深耕的人&#xff0c;最终都会发现语义鸿沟仍是一个非常具有挑战性的问题&#xff0c;这最终还需要借助知识图谱等技术&#xff0c;来帮助将整体的 AI 认知取得新进展。”在 5 月 26 日的 CTA 峰会机器学习专场&#xff0c;Hulu 首…

机器学习中的相似性度量总结

来自 机器学习算法那些事公众号 在做分类时常常需要估算不同样本之间的相似性度量(Similarity Measurement)&#xff0c;这时通常采用的方法就是计算样本间的“距离”(Distance)。采用什么样的方法计算距离是很讲究&#xff0c;甚至关系到分类的正确与否。 目录 1. 欧氏距离 …

吴恩达《机器学习》学习笔记十二——机器学习系统

吴恩达《机器学习》学习笔记十二——机器学习系统一、设计机器学习系统的思想1.快速实现绘制学习曲线——寻找重点优化的方向2.误差分析3.数值估计二、偏斜类问题&#xff08;类别不均衡&#xff09;三、查准率P与召回率R——代替准确率的评估指标四、查准率与召回率的权衡——…

增强现实:一场正在到来的医疗革命

来源&#xff1a; 资本实验室图像化可以让医生的诊断、决策和治疗更加准确&#xff0c;可以说是医疗史上非常重要的一项技术突破。近几年&#xff0c;通讯技术的发展推动了空间计算的快速商业化。在医疗领域&#xff0c;增强现实&#xff08;AR&#xff09;、虚拟现实&#xff…

吴恩达《机器学习》学习笔记十三——机器学习系统(补充)

这次笔记是对笔记十二的补充&#xff0c;之前讨论了评价指标&#xff0c;这次主要是补充机器学习系统设计中另一个重要的方面&#xff0c;用来训练的数据有多少的问题。 笔记十二地址&#xff1a;https://blog.csdn.net/qq_40467656/article/details/107602209 之前曾说过不要…

全球CMOS图像传感器厂商最新排名:黑马杀出

来源&#xff1a;半导体行业观察近期&#xff0c;台湾地区的Yuanta Research发布报告&#xff0c;介绍了其对CMOS图像传感器(CIS)市场的看法&#xff0c;以及到2022年的前景预期。从该研究报告可以看出&#xff0c;2018年全球CMOS图像传感器的市场规模为137亿美元&#xff0c;其…

吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进

吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进一、任务介绍二、代码实现1.准备数据2.代价函数3.梯度计算4.带有正则化的代价函数和梯度计算5.拟合数据6.创建多项式特征7.准备多项式回归数据8.绘制学习曲线&#x1d706;0&#x1d706;1&…