赞
踩
目录
逻辑回归也被称为广义线性回归模型,它与线性回归模型最大的区别就在于它们的因变量不同,如果是连续的,就是多重线性回归;如果是二项分布,就是逻辑回归。
逻辑回归(Logistic Regression)虽然名字里带“回归”,但是它实际上是一种分类方法,主要用于两分类问题(即输出只有两种,分别代表两个类别)。它是机器学习中最常见的一种用于二分类的算法模型,由于其数学原理简单易懂,作用高效,其实际应用非常广泛。
Regression 常规步骤:
- 寻找h函数(即预测函数,用来预测输入数据的判断结果)
- 构造J函数(损失函数,该函数表示预测的输出与训练数据类别之间的偏差)
- 想办法使得J函数最小并求得回归参数(θ)
机器学习是数据驱动的算法,数据驱动=数据+模型,模型就是输入到输出的映射关系。模型=假设函数(不同的学习方式)+优化。
线性回归模型是一种用于预测连续变量的统计方法,它通过构建一个线性方程来拟合数据点。这个线性方程:,w和b都是通过最小二乘法得到的,在线性回归中,最小二乘法就是试图找到一条直线,使得所有样本到直线上的欧氏距离之和最小。我们只需要将函数求导并令导数为0即可求解出w和b的最优解。
线性回归可以预测连续值,但是不能解决分类问题,我们需要根据预测的结果判定其属于正类还是负类。所以逻辑回归就是将线性回归的 结果,通过sigmoid函数映射到(0,1)之间,从而解决分类问题。
公式:
观察该图像,自变量取值范围是,因变量取值范围为(0,1),意思是无论自变量取值多少,都可以通过sigmoid函数映射到(0,1)之间。sigmoid函数,会把线性回归的结果映射到(0,1)之间,假设0.5为阈值,默认会把小于0.5的为0,大于0.5的为1,这样就可以分类了 。
通过sigmoid来构造预测函数为:
函数的值有特殊的含义,它表示结果取1的概率,因此对于输入x分类结果为类别1和类别0的概率分别为:
在机器学习和优化问题中,损失函数(或目标函数)具有重要的意义。它用于衡量模型预测结果与实际结果之间的差异,从而反映模型的性能和准确度。线性回归使用最小二乘误差作为损失函数。然而,对于逻辑回归,它不再是可能的,最大似然法是逻辑回归所采用的参数估计方法,其原理是找到这样一个参数,可以让样本数据所包含的观察值被观察到的可能性最大。这种寻找最大可能性的方法需要反复计算,对计算能力有很高的要求。最大似然法的优点是大样本数据中参数的估计稳定、偏差小、估计方差小。。逻辑回归的损失,称之为对数似然损失,公式如下:
这个式子也不陌生,将上面整合的式子,取对数,原先是相乘,取对数之后会相加,指数也可以移到前面。假定样本与样本之间相互独立,那么整个样本集生成的概率即为所有样本生成概率的乘积,再将公式对数化,便可得到如下公式:
我们要找到最优的w和b,使得损失函数J(w)最小,我们使用梯度下降法来求解。
梯度下降(Gradient Descent)是一种常用的优化算法,用于最小化损失函数或目标函数。它是一种迭代的优化方法,通过不断更新参数的值,使得损失函数最小化或目标函数最大化。梯度下降的基本思想是沿着损失函数或目标函数的负梯度方向进行参数更新。梯度可以理解为函数在某一点的变化率或斜率,负梯度方向表示函数下降的最快方向。因此,通过不断沿着负梯度方向迭代更新参数,可以逐步接近损失函数的最小值或目标函数的最大值。具体推理过程如下图:
θ更新过程可以写成:
图源自网络
- import numpy as np
- import matplotlib.pyplot as plt
- import seaborn as sns
- import pandas as pd
- from mpl_toolkits.mplot3d import Axes3D
- from sklearn.datasets import load_iris
- from sklearn.linear_model import LogisticRegression
- from sklearn.model_selection import train_test_split
- from sklearn.metrics import mean_squared_error
- from sklearn import metrics
- data = load_iris() # 数据集
- iris_target = data.target # 标签
- # 将所需的数据以及特征名提取出来转换成DataFrame类型,方便后面处理
- iris_df = pd.DataFrame(data=data.data, columns=data.feature_names)
结果:
- print(data.keys())
- print(data["DESCR"])
结果:
iris数据集共有150个样本,三个种类,每个类有五十个样本
三个种类:class:Iris-Setosa(标签0)Iris-Versicolour(标签1)Iris-Virginica(标签2)
每个样本特征向量为4个:Attribute Information:sepal length in cm(花萼长度)sepal width in cm(花萼宽度)petal length in cm(花瓣长度)petal width in cm(花瓣宽度)
- plt.plot(iris_all[iris_all["target"]==0]["petal length (cm)"],iris_all[iris_all["target"]==0]["petal width (cm)"],"rs",label="Setosa")
- plt.plot(iris_all[iris_all["target"]==1]["petal length (cm)"],iris_all[iris_all["target"]==1]["petal width (cm)"],"bx",label="Versicolour")
- plt.plot(iris_all[iris_all["target"]==2]["petal length (cm)"],iris_all[iris_all["target"]==2]["petal width (cm)"],"go",label="Virginica")
- plt.xlabel("petal length (cm)")
- plt.ylabel("petal width (cm)")
- plt.legend()
- plt.rcParams["font.sans-serif"]="simHei"
- plt.show()
结果:
- sns.pairplot(data=iris_all,hue='target', palette="coolwarm")
- plt.show()
结果:
输出结果如上。可以看到每两个字段对应的三种花之间的关联,三条曲线重叠的范围越多,说明彼此之间交叉混合的数据越多,凭借着这两个字段来分别三种花的难度越大。
- iris_df_part = iris_df.iloc[:100]
- iris_target_part = iris_target[:100]
-
- x_train, x_test, y_train, y_test = train_test_split(iris_df_part, iris_target_part, test_size = 0.2, random_state =180)
-
- X_train,X_test,Y_train,Y_test=train_test_split(iris_df,iris_target,test_size=0.2,random_state=180)
- # 训练逻辑回归二分类模型
- def basic2_logosticregression(x_train, x_test, y_train, y_test):
- model=LogisticRegression(random_state=0, solver='lbfgs')
-
- model.fit(x_train,y_train)
- y_train_pre=model.predict(x_train)
- y_test_pre=model.predict(x_test)
利用 predict_proba 函数预测其概率:
- train_predict_proba = model.predict_proba(x_train)
- test_predict_proba = model.predict_proba(x_test)
- print('测试预测每一类的概率:\n',test_predict_proba)
以上步骤和线性回归模型分析过程一模一样,至于逻辑回归区别就在于最后的分类上面,需要利用预测的结果,借助混淆矩阵进行可视化展示:
-
- MSE_train=mean_squared_error(y_train,y_train_pre)
- MSE_test=mean_squared_error(y_test,y_test_pre)
-
- confusion_matrix_result = metrics.confusion_matrix(y_test_pre,y_test)
- print('混淆矩阵结果:\n',confusion_matrix_result)
- plt.figure(figsize=(8, 6))
- sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')
- plt.xlabel('预测的标签')
- plt.ylabel('实际的标签')
-
- print("权重w:"+ str(model.coef_))
- print("截距w0:"+ str(model.intercept_))
- print("训练集均方误差:"+str(MSE_train))
- print("测试集均方误差:"+str(MSE_test))
- print("score_train: "+str(model.score(x_train,y_train)))
- print("score_test: "+str(model.score(x_test,y_test)))
结果:
(1)逻辑回归能够用于分类,不过其本质还是线性回归。它仅在线性回归的基础上,在特征到结果的映射中加入了一层sigmoid函数(非线性)映射,即先把特征线性求和,然后使用sigmoid函数来预测。
(2)逻辑回归和线性回归首先都是广义的线性回归,其次经典线性模型的优化目标函数是最小二乘,而逻辑回归则是似然函数,另外线性回归在整个实数域范围内进行预测,敏感度一致,而分类范围,需要在[0,1]。逻辑回归就是一种减小预测范围,将预测值限定为[0,1]间的一种回归模型,因而对于这类问题来说,逻辑回归的鲁棒性比线性回归的要好。
(3)逻辑回归的模型本质上是一个线性回归模型,逻辑回归都是以线性回归为理论支持的。但线性回归模型无法做到sigmoid的非线性形式,sigmoid可以轻松处理0/1分类问题
优点:
- 适合分类场景
- 计算代价不高,容易理解实现。
- 不用事先假设数据分布,这样避免了假设分布不准确所带来的问题。
- 不仅预测出类别,还可以得到近似概率预测。
- 目标函数任意阶可导。
缺点:
- 容易欠拟合,分类精度不高。
- 数据特征有缺失或者特征空间很大时表现效果并不好。
通过此处实验,让我对逻辑回归有了深刻理解,掌握了逻辑回归工作原理以及它与线性回归的区别。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。