1、逻辑回归要做的事情:取出最大概率对应的类别,将数据二分类。
2、逻辑回归做事的流程:逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。
包含逻辑回归的假设、逻辑回归的损失函数、逻辑回归的求解方法、逻辑回归的目的、逻辑回归如何分类。
3、逻辑回归的原理:通过划定一个阈值,y值大于这个阈值的是一类,y值小于这个阈值的是另外一类。
4、任何模型都有自己的假设,在假设下的模型才是适用的。逻辑回归的第一个基本假设是数据服从伯努利分布。伯努利分布也称为两点分布或者0-1分布,是最简单的离散型概率分布。记样本为正的概率为p(0<=p<=1),样本为负的概率为q=1-p。
文章图片
逻辑回归的第二个基本假设是样本为正的概率是:
文章图片
5、逻辑回归的损失函数是它的极大似然函数。
文章图片
6、逻辑回归的评价指标:逻辑回归属于分类问题,使用二元分类的评价指标。观察下图混淆矩阵。
文章图片
我们可以用查准率和查全率来评价预测结果:
文章图片
7、缺点:
准确率不是特别高,不过工程上可以接受;
很难处理数据不平衡的问题;
适合处理二分类问题,处理非线性数据比较麻烦。
8、三种方法代码实现
(1)sklearn
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt%matplotlib inlinedf_X = pd.read_csv('./logistic_x.txt', sep='\ +',header=None, engine='python') #读取X值
ys = pd.read_csv('./logistic_y.txt', sep='\ +',header=None, engine='python') #读取y值
ys = ys.astype(int)
df_X['label'] = ys[0].values #将X按照y值的结果一一打标签
ax = plt.axes()
#在二维图中描绘X点所处位置,直观查看数据点的分布情况
df_X.query('label == 0').plot.scatter(x=0, y=1, ax=ax, color='blue')
df_X.query('label == 1').plot.scatter(x=0, y=1, ax=ax, color='red')
#提取用于学习的数据
Xs = df_X[[0, 1]].values
Xs = np.hstack([np.ones((Xs.shape[0], 1)), Xs])
ys = df_X['label'].valuesfrom __future__ import print_function
import numpy as np
from sklearn.linear_model import LogisticRegressionlr = LogisticRegression(fit_intercept=False) #因为前面已经将截距项的值合并到变量中,此处参数设置不需要截距项
lr.fit(Xs, ys) #拟合
score = lr.score(Xs, ys) #结果评价
print("Coefficient: %s" % lr.coef_)
print("Score: %s" % score)ax = plt.axes()df_X.query('label == 0').plot.scatter(x=0, y=1, ax=ax, color='blue')
df_X.query('label == 1').plot.scatter(x=0, y=1, ax=ax, color='red')_xs = np.array([np.min(Xs[:,1]), np.max(Xs[:,1])])#将数据以二维图形式描点,并用学习得出的参数结果作为阈值,划分数据区域
_ys = (lr.coef_[0][0] + lr.coef_[0][1] * _xs) / (- lr.coef_[0][2])
plt.plot(_xs, _ys, lw=1)
(2) 用梯度下降法将相同的数据分类
class LGR_GD():
def __init__(self):
self.w = None
self.n_iters = None
def fit(self,X,y,alpha=0.03,loss = 1e-10): # 设定步长为0.002,判断是否收敛的条件为1e-10
y = y.reshape(-1,1) #重塑y值的维度以便矩阵运算
[m,d] = np.shape(X) #自变量的维度
self.w = np.zeros((1,d)) #将参数的初始值定为0
tol = 1e5
self.n_iters = 0
#============================= show me your code =======================
while tol > loss: #设置收敛条件
h_x = 1/(1+np.exp(-X.dot(self.w.T)))
self.w = self.w + alpha*np.mean(X*(y-h_x),axis=0)
tol = np.abs(np.sum(h_x))
self.n_iters += 1 #更新迭代次数
#============================= show me your code =======================
def predict(self, X):
# 用已经拟合的参数值预测新自变量
y_pred = X.dot(self.w)
return y_predif __name__ == "__main__":
lr_gd = LGR_GD()
lr_gd.fit(Xs,ys)ax = plt.axes()df_X.query('label == 0').plot.scatter(x=0, y=1, ax=ax, color='blue')
df_X.query('label == 1').plot.scatter(x=0, y=1, ax=ax, color='red')_xs = np.array([np.min(Xs[:,1]), np.max(Xs[:,1])])
_ys = (lr_gd.w[0][0] + lr_gd.w[0][1] * _xs) / (- lr_gd.w[0][2])
plt.plot(_xs, _ys, lw=1)
(3)用牛顿法实现结果
class LGR_NT():
def __init__(self):
self.w = None
self.n_iters = None
def fit(self,X,y,loss = 1e-10): # 判断是否收敛的条件为1e-10
y = y.reshape(-1,1) #重塑y值的维度以便矩阵运算
[m,d] = np.shape(X) #自变量的维度
self.w = np.zeros((1,d)) #将参数的初始值定为0
tol = 1e5
n_iters =0
Hessian = np.zeros((d,d))
#============================= show me your code =======================
while tol > loss:
tol > loss:
zs = X.dot(self.w.T)
h_x = 1 / (1 + np.exp(-zs))
grad = np.mean(X*(y - h_x),axis=0)
for i in range(d):
for j in range(d):
if j>=i:
Hessian[i][j] = np.mean(h_x*(h_x-1)*X[:,i]*X[:,j]) #更新海森矩阵中的值
else:
Hessian[i][j] = Hessian[j][i] #按海森矩阵的性质,对称点可直接得出结果
theta = self.w - np.linalg.inv(Hessian).dot(grad)
tol = np.sum(np.abs(theta - self.w))
self.w = theta
n_iters += 1
#============================= show me your code =======================
self.w = theta
self.n_iters = n_itersdef predict(self, X):
# 用已经拟合的参数值预测新自变量
y_pred = X.dot(self.w)
return y_predif __name__ == "__main__":
lgr_nt = LGR_NT()
lgr_nt.fit(Xs,ys)
感谢Datewhale 初级算法梳理组队学习计划的支持
参考文章:
吴恩达 CS229课程
【机器学习|机器学习碎碎念之逻辑回归】周志华 《机器学习》
https://blog.csdn.net/ustbbsy/article/details/80423294
https://www.cnblogs.com/ModifyRong/p/7739955.html
https://blog.csdn.net/dpengwang/article/details/100159369
https://blog.csdn.net/u014106644/article/details/83660226
https://blog.csdn.net/abcjennifer/article/details/7716281
https://blog.csdn.net/portfloat/article/details/79200695
https://cloud.tencent.com/developer/news/319664
https://www.jianshu.com/p/2ca96fce7e81
推荐阅读
- PyQt5 实现状态栏(statusBar)显示和隐藏功能
- python|基于Python实现损失函数的参数估计
- 算法|基于Python实现k-means算法和混合高斯模型
- 人脸及表情分类|微表情识别的图片预处理(python版)
- python|基于Python实现看图说话和微表情识别
- 使用QWebEngineView打造一款简单浏览器
- 算法|终于来了!这份NLP算法工程师学习路线yyds!
- 人工智能|新一年涨工资指南(AI薪资水平和就业前景分析(一定要看完!))
- 物联网|神经网络的三种训练方法,神经网络训练过程图解