机器学习|逻辑回归

640?wx_fmt=png

  Spark推荐系统,干货,心得 

  点击上方蓝字关注~

 


前面几章学习了线性回归及求解过程(包括解析解 求解和梯度下降法求解),本章在前两章的基础上理解逻辑回归,在实际工作当中逻辑回归是很常用的算法。

往期回顾:

机器学习-线性回归(一)

机器学习-线性回归(二)

机器学习|梯度下降法


本章学习的路线

1、分类和回归任务的区别

2、逻辑回归不是回归

3、sigmoid函数的由来

4、最大似然

5、逻辑回归loss函数定义

6、梯度下降法求解

7、代码实现



分类和回归的区别

机器学习里面的回归理解成函数的拟合,找到一个函数尽可能的穿过所有样本点,然后在对新样本进行预测lable,label为连续型。(比如预测房价,人的身高,明天的气温等等)

机器学习里面的分类理解成在训练集样本点中找到一个函数,将样本点按照类别进行分开。然后在对新样本进行预测lable,label为离散型。(比如预测人的性别,健康预测是否患有癌症等等)

 

逻辑回归虽然带有回归字样,但逻辑回归其实属于分类算法。由于该算法本身的性质多用于二分类问题,多个逻辑回归组合也可以解决多分类问题

 

逻辑回归是将线性回归的结果(-∞,+∞)映射到(0,1)之间的概率,通常输出结果概率p>0.5判断为正例,概率p<0.5为负例 ,这样就完成一个二分类问题

 

sigmoid函数的由来

其中使用sigmoid函数可以将结果(-∞,+∞)映射到(0,1)之间

640?wx_fmt=png

最大似然

  • 根据若干已知的X,y(训练集)找到一组w使得x作为已知条件下y发生的概率最大

  • 既然g(w,x)的输出含义为P(y=1|w,x)

  • 那么p(y=0|w,x) = 1 - g(z)

  • 那么就将g(w)作为未知数,将训练集上y_hat = y 概率计算出来

 


只要让你的g(w,x)函数在训练集上预测正确的概率最大,你的g(w,x)就是最好g(w,x)

640?wx_fmt=png

640?wx_fmt=png


那么对于每一条样本预测正确的概率

640?wx_fmt=png


全部预测正确的概率 = 每一条数据预测正确的概率相乘

640?wx_fmt=png


记p(全部正确)为L(θ)(这里的θ为之前的w)

640?wx_fmt=png


想找到一组θ使得上面的概率函数有最大值,由于ln函数是单调递增的,ln(L(θ))最大时L(θ)也最大

640?wx_fmt=png

定义损失函数

根据:

使L(θ)最大的θ产生出来的g(θ,x) 全预测对的概率最大

损失函数:某个函数结果越小,生成的模型越好

那我们定义 -L(θ)为逻辑回归的损失函数

所以:

640?wx_fmt=png


反过来屡一遍

损失函数最小-->  L(θ)最大 --> 在训练集上全部正确的概率最大 --> 达成目标

又是梯度下降法

640?wx_fmt=png

对损失函数求平均梯度

640?wx_fmt=png

有了梯度可以实现逻辑回归

代码实现:

from sklearn.model_selection import train_test_split
import numpy as np
import math
from sklearn import datasets
from sklearn.metrics import accuracy_score

# 鸢尾花卉数据集
iris = datasets.load_iris()
X = iris['data']
X = np.c_[np.ones((len(X), 1)), X] # 添加截距项
y = iris['target']
y[y == 2] = 1

print(X, y)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# 设置学习率
alpha = 0.001
# 存放差值
error1, error2 = 0.0, 0.0
# 训练集样本个数
m = len(X_train)
# 设置误差结束的阈值
epsilon = 0.000001
# 设置最大迭代次数
num = 5000

# # 1, 初始化w为0
thetas = np.zeros((1, len(X_train[0])))


# sigmod函数
def sigmod(Xi):
return 1 / (1 + math.exp(- np.sum(Xi * thetas)))


# 预测函数
def predict(X):
y_hat = []
for i in X:
if sigmod(i) > 0.5:
y_hat.append(1)
else:
y_hat.append(0)
return y_hat


# SGD求最优thetas
n = 0
while True:
n += 1
# 在x_train,y_train样本中随机选取一条数据
random_index = np.random.randint(len(y_train))
xi = X_train[random_index:random_index + 1]
yi = y_train[random_index:random_index + 1]

# 求梯度
diff = (sigmod(xi) - yi) @ xi

# 更新theta
thetas = thetas - alpha * diff
print("thetas:", thetas)

errors = []
# 计算MSE
for k in range(0, len(X_train)):
result = (y[k] - sigmod(X_train[k])) ** 2
errors.append(result)

error1 = 1 / m * (sum(errors))
# 判断结束条件
if abs(error1 - error2) < epsilon or n> num:
break
else:
error2 = error1
error1 = 0.0

# 打印acc
print(accuracy_score(y_test, predict(X_test)))


结果:

thetas: [[-0.10461938 -0.13821242 -0.55759583  0.9426995   0.42771281]]
acc: 1.0


总结:逻辑回归算法是一种广义的线性回归分析模型, 在推荐系统中与GBDT算法一起常用于rank阶段


推荐阅读:

学习人工智能你需要了解的基本概念

机器学习中一些基础的数学

Spark梯度下降法

spark协同过滤

Spark特征工程

Spark推荐系统

640?wx_fmt=jpeg

长按识别二维码关注我们

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值