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)之间
最大似然
根据若干已知的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)
那么对于每一条样本预测正确的概率
全部预测正确的概率 = 每一条数据预测正确的概率相乘
记p(全部正确)为L(θ)(这里的θ为之前的w)
想找到一组θ使得上面的概率函数有最大值,由于ln函数是单调递增的,ln(L(θ))最大时L(θ)也最大
定义损失函数
根据:
使L(θ)最大的θ产生出来的g(θ,x) 全预测对的概率最大
损失函数:某个函数结果越小,生成的模型越好
那我们定义 -L(θ)为逻辑回归的损失函数
所以:
反过来屡一遍
损失函数最小--> L(θ)最大 --> 在训练集上全部正确的概率最大 --> 达成目标
又是梯度下降法
对损失函数求平均梯度
有了梯度可以实现逻辑回归
代码实现:
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推荐系统
长按识别二维码关注我们