机器学习|机器学习碎碎念之逻辑回归

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

    推荐阅读