目录
本文部分图文借鉴自《老饼讲解-机器学习》
一、常见线性模型概览
常见的线性模型包括以下几种:
线性回归(Linear Regression):
线性回归是一种回归分析技术,试图学习到一个线性模型以尽可能准确地预测实值输出标记。通过在数据集上建立线性模型,建立代价函数(loss function),最终以优化代价函数为目标确定模型参数w和b,从而得到模型用以后续的预测。
岭回归(Ridge Regression):
岭回归是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。
套索回归(Lasso Regression):
套索回归是一种同时进行特征选择和正则化(数学)的回归分析方法。套索回归的优化目标中的正则项是权值向量的L1范数;而岭回归(Ridge Regression)的正则项是权值向量的L2范数。
逻辑回归(Logistic Regression):
逻辑回归用于解决二分类(0 or 1)问题,属于概率型非线性回归。逻辑回归模型适用于因变量为二分类的情况,也适用于因变量为有序多分类的情况。
线性支持向量机(Linear SVM):
线性支持向量机是一种高效的二分类器,通过在高维空间中寻找一个超平面来分隔两个类别的数据。线性支持向量机使用线性核函数,因此可以处理大规模数据集。
线性感知机(Linear Perceptron):
线性感知机是一种二分类的线性分类模型,其输入为一组向量,每个向量都有n个特征值,输出为每个向量的所属类别,对于二分类而言,就是+1和-1。
其中,线性回归、Lasso回归、岭回归是比较相似的,只是损失函数不一样,它们的模型对比可以参考文章:老饼讲解|【辨析】线性回归、岭回归和Lasso的比较
二、线性回归
2.1.线性回归模型介绍
线性回归模型是一种数学模型,用于描述一个或多个自变量(预测因子)和一个因变量(响应变量)之间的线性关系。
它通常表示为 y = ax + b,其中 a 是斜率,b 是截距。
线性回归模型的损失函数为:
线性回归模型有一些重要的假设,包括:
1.因变量和自变量之间存在线性关系。
2.误差项是独立且服从正态分布的随机变量。
3.误差项的方差必须相等。
线性回归模型可以用来进行预测和分析,例如通过找出自变量和因变量之间的最佳拟合线,可以预测给定自变量值时的因变量值。此外,线性回归模型还可以用来确定变量之间的因果关系。
在构建和使用线性回归模型时,需要注意一些问题,例如多重共线性、异方差性、自相关等问题。这些问题可能会影响模型的准确性和可靠性。
2.2.线性回归模型的实现
在sklearn中实现一个线性回归模型如下:
from sklearn import linear_model
import numpy as np
#输入数据
x = np.array([[0, 2], [1, 1], [2,3],[3,2],[4,5],[5,2]])
y = np.array([8,7,15,14,25,18])
#调用sklearn的线性模型包,训练数据
reg = linear_model.LinearRegression()
reg.fit(x,y)
#输出系数和阈值
print("模型参数:"+str(reg.coef_))
print("模型阈值:"+str(reg.intercept_))
三、岭回归
3.1 岭回归模型介绍
岭回归(Ridge Regression)是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。在统计学中,回归分析(regression analysis)指的是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。
岭回归的模型表达式为 y = ax + b,其中 a 是斜率,b 是截距。但往往也会先将数据中心化,然后使用y = ax来作为岭回归模型的表达式。
岭回归的损失函数为:
3.2 岭回归的代码实现
在python中使用sklearn实现一个岭回归模型如下:
from sklearn import linear_model
import numpy as np
#输入数据
x = np.array([[0, 2], [1, 1], [2,3],[3,2],[4,5],[5,2]])
y = np.array([8,7,15,14,25,18])
#调用sklearn的线性模型包,训练数据
ridge = linear_model.Ridge(alpha=1,fit_intercept=True) # 模型实例化
ridge.fit(x,y) # 模型训练
#输出模型系数和阈值
print("当前alpha:"+str(ridge.alpha))
print("模型参数:"+str(ridge.coef_))
print("模型阈值:"+str(ridge.intercept_))
运行后得到的结果如下:
四、Lasso回归
4.1 Lasso回归模型介绍
Lasso回归(Least Absolute Shrinkage and Selection Operator)是一种用于回归分析的线性模型,它可以进行变量选择和正则化,以改进模型的预测精度和泛化能力。Lasso回归在最小二乘法的基础上加上了一个L1正则项,Lasso回归损失函数为:
相比岭回归(Ridge Regression)可以直接通过矩阵运算得到回归系数相比,Lasso回归的计算变得相对复杂。两种求解Lasso回归的方法是坐标下降法和最小角回归法。Lasso回归的一个重要特性是它可以产生稀疏解,即可以将一些系数压缩为0,从而进行变量选择。这使得Lasso回归在处理高维数据和过拟合问题时具有优势。然而,Lasso回归也存在一些问题,例如在处理大规模数据时可能会比较慢,并且可能会产生过拟合。总的来说,Lasso回归是一种有用的线性模型,可以用于回归分析和变量选择。
4.2 Lasso回归的代码实现
在python中使用sklearn实现一个Lasso回归模型如下:
# -*- coding: utf-8 -*-
"""
LASSO 回归
"""
from sklearn.linear_model import Lasso
import numpy as np
#生成数据
x = np.array([list(range(100)), [i*4+3 for i in range(100)]]).transpose()
y = x.dot([2,3])
# Lasso模型训练
alpha =0.3 # 设置alpha,即正则项的lambda系数
mdl = Lasso(alpha=alpha,fit_intercept=True,tol=1e-4,max_iter=1000)
mdl.fit(x,y) # 用数据训练模型
sim_y= mdl.predict(x) # 预测
# ================= 打印结果 =======================
print('============ 调包Lasso训练结果==(start)==================')
print('权重:'+str(mdl.coef_))
print('截距:'+ str(mdl.intercept_))
print( '均方误差:'+str(((y-sim_y)*(y-sim_y)).sum()))
print( '损失函数loss值:'+str(((y-sim_y)*(y-sim_y)).sum()/(2*x.shape[0])+alpha*(abs(mdl.coef_.sum()))))
print('迭代次数:'+str(mdl.n_iter_))
print('对偶间隙:'+str(mdl.dual_gap_))
print('============ 调包Lasso训练结果==(end)==================')
代码运行结果如下:
五、逻辑回归
5.1 逻辑回归模型介绍
逻辑回归是一种广义的线性回归分析模型,常用于数据挖掘、疾病自动诊断、经济预测等领域。逻辑回归与其它线性模型不一样,它用于做分类,而不是对数值进行回归。
逻辑回归根据给定的自变量数据集来估计事件的发生概率,由于结果是一个概率,因此因变量的范围在 0 和 1 之间。例如,探讨引发疾病的危险因素,并根据危险因素预测疾病发生的概率等。
逻辑回归的模型表达式如下:
逻辑回归的损失函数为交叉熵损失函数:
在逻辑回归中,可以使用非线性变换的Sigmoid函数将线性回归的结果转换成一个概率值,从而进行分类。
逻辑回归的优点包括:可以处理多分类问题、可以处理二分类问题、计算速度快、易于理解和实现。然而,逻辑回归也存在一些缺点,例如其对数据的正态性、线性性和无多重共线性等假设条件比较严格,容易导致过拟合等。
总之,逻辑回归是一种有用的分类算法,可以用于数据挖掘、疾病自动诊断、经济预测等领域。然而,在使用逻辑回归时需要注意其假设条件和缺点,并进行适当的调整和优化。
5.2 逻辑回归的代码实现
在python中使用sklearn实现一个逻辑回归模型如下:
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
import numpy as np
#----数据加载------
data = load_breast_cancer()
X = data.data[:,4:8] #这里我们只选择4个变量进行建模
y = data.target
#----数据归一化------
xmin=X.min(axis=0)
xmax=X.max(axis=0)
X_norm=(X-xmin)/(xmax-xmin)
#-----训练模型--------------------
clf = LogisticRegression(random_state=0)
clf.fit(X_norm,y)
#------模型预测-------------------------------
pred_y = clf.predict(X_norm) # 预测类别
pred_prob_y = clf.predict_proba(X_norm)[:,1] # 预测属于1类的概率
print( "模型系数(对应归一化数据):",clf.coef_[0])
print( "模型阈值(对应归一化数据):",clf.intercept_)
print( "模型准确率:",(pred_y== y).sum()/len(y))
运行后得到如下结果:
六、线性支持向量机
6.1 线性支持向量机模型介绍
SVM(支持向量机)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器。SVM不仅可以支持线性可分的数据,对于不能线性可分的数据也可以通过“软间隔(soft margin)”实现近似线性可分,或者借助“核函数”或“核技巧(kernel trick)”实现对任意非线性数据的分类。SVM的学习可以根据拉格朗日的对偶性转换为求解对偶问题的最优解。目前实现最多最流行的就是序列最小优化,也就是SMO(Sequential Minimal Optimization)。SVM适用于中小型数据样本、非线性、高维的分类问题。
SVM就是用线性模型将两类样本进行分割,如下:
但SVM比较讨巧的是,它引入了两个支持面来辅助找出使样本间隔最大的平面:
6.2 SVM的代码实现
在python中使用sklearn实现一个SVM模型如下:
# -*- coding: utf-8 -*-
import numpy as np
from sklearn import svm
X = np.array( [[0.708333,1],[0.291667,1],[0.217,1.5],[0.2367,0.3],[0.454,1],[0.583333,-4],[0.875,-1],[0.333,-0.6],[0.111,-1]] )
y = np.array([1,1,1,1,1,-1,-1,-1,-1])
sk_md = svm.SVC(kernel ='linear')
sk_md.fit(X,y)
sk_w = sk_md.dual_coef_@sk_md.support_vectors_
sk_b = -sk_md._intercept_
print('w:',sk_w)
print('b:',sk_b)
运行后展示如下结果:
----------libsvm训练的模型系数---------
w: [[-0.0609927 1.01821647]]
b: [0.02498668]
如果觉得本文有帮助,点个赞吧!