【线性模型】

本文介绍了线性模型在回归和分类任务中的应用,包括线性回归、岭回归、lasso回归以及Logistic回归。讨论了正则化在控制模型复杂度中的作用,如L1和L2正则化,并通过实例展示了它们在不同场景下的表现。此外,还提到了线性支持向量机和多分类支持向量机。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 用于回归的线性模型

有非常多的线性回归模型,这些模型之间的区别在于如何从训练数据中学习参数w和b,以及如何控制模型复杂度

1.1 线性回归(普通最小二乘法)

  • 线性回归,又名普通最小二乘法(ordinary least squares,OLS),是回归问题中最简单也是最经典的线性方法。
  • 线性回归寻找参数w和b,使得对训练集的预测值与真实的回归目标值y之间的均方误差最小。均方误差(mean suare error)是预测值与真实值之差的平方和除以样本数。
  • 线性回归没有参数,这是一个优点,但也因此无法控制模型的复杂度。
##线性回归
from sklearn.linear_model import LinearRegression
X,y = mglearn.datasets.make_wave(n_samples=60)
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=42)
lr = LinearRegression().fit(X_train,y_train)
print('lr.coef_:{}'.format(lr.coef_))#系数(w权重)保存在coef_属性中
print('lr.intercept_:{}'.format(lr.intercept_))#截距b保存在intercept_中
print('Train set score:{:.2f}'.format(lr.score(X_trainn,y_train)))
print('Test set score:{:.2f}'.format(lr.score(X_test,y_test)))#评估模型

1.2 岭回归

  • 标准线性回归最常用的替代方法之一就是岭回归(ridge regression)。
  • 与普通最小二乘法不同的是,岭回归对系数w的选择不仅要在训练数据上得到好的预测结果,而且要拟合附加约束(正则化)。w的所有元素都应该接近于0,意味着每个特征对输出的影响应该尽可能小。
  • 岭回归用到的是L2正则化。
  • Ridge模型用alpha(默认为1)参数在模型的简单性(系数都接近于0)与训练集性能之间做出权衡。增大alpha会使得系数更加趋向于0,从而降低训练集性能,但可能会提高泛化性能。
from sklearn.linear_model import Ridge
ridge = Ridge(alpha=0.1).fit(X_train,y_train)
print('Train set score:{:.2f} '.format(ridge.score(X_train,y_train)))
print('Test set score:{:.2f}'.format(ridge.score(X_test,y_test)))

1.3 lasso

  • lasso使用的是L1正则化。
  • L1正则化的结果是使用lasso时某些系数刚好为0,这些特征被模型完全忽略。这样模型更容易解释,也可以呈现模型最重要的特征。
  • alpha参数同Ridge一样。
#lasso
from sklearn.linear_model import Lasso
#减小alpha的同时要增加max_iter(运行迭代的最大次数)的值
lasso = Lasso(alpha=0.01,max_iter=100000).fit(X_train,y_train)
print('Train set score:{:.2f}'.format(lasso.score(X_train,y_train)))
print('Test set score:{:.2f}'.format(lasso.score(X_test,y_test)))

1.4 小结

  • 在实践中,一般首选岭回归,但如果特征很多且认为有几个是重要的,那么选择lasso可能更好。
  • scikit-learn还提供了ElasticNet类,结合了Ridge和Lasso的惩罚项。

2. 用于分类的回归模型

学习线性模型有很多种算法,这些算法的却别在于:
①系数和截距的特定组合对训练数据拟合好坏的度量方法
是否使用正则化以及使用哪种正则化

2.1 Logistic回归

  • penalty参数默认使用L2正则化。如果想要一个可解释性更强的模型,用L1正则化会更好。
  • 在linear_model.LogisticRegression中实现
  • 决定正则化强度的权衡参数叫做C。C值越大,对应的正则化越弱,C值越小越强调w接近于0。也就是说,较小的C值可以让算法尽量适应“大多数”数据点,而较大的C值更强调每个数据点都正确分类的重要性。
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
X_train,X_test,y_train,y_test = train_test_split(cancer.data,cancer.target,random_state=42)

logreg = LogisticRegression(C=100,penalty='l1').fit(X_train,y_train)
print('Train set score:{:.2f}'.format(logreg.score(X_train,y_train)))
print('Test set score:{:.2f}'.format(logreg.score(X_test,y_test)))

2.2 Softmax Classifier (Multinomial Logistic Regression)多项逻辑回归

完整代码

在这里插入图片描述

2.3 线性支持向量机(SVM)

  • penalty参数默认使用L2正则化。如果想要一个可解释性更强的模型,用L1正则化会更好。
  • 在svm.Linearsvc(支持向量分类器)中实现
  • 决定正则化强度的权衡参数叫做C。C值越大,对应的正则化越弱,C值越小越强调w接近于0。也就是说,较小的C值可以让算法尽量适应“大多数”数据点,而较大的C值更强调每个数据点都正确分类的重要性。(同逻辑回归)
from sklearn.svm import LinearSVC
linear_svm = LinearSVC().fit(X,y)

2.4 多分类支持向量机

  • 将二分类算法推广到多分类算法的一种常见方法是“一对其余”方法。在“一对其余”方法中,对每个类别都学习一个二分类模型,将这个类别与所有其他类别尽量分开,这样就生成了与类别个数一样多的二分类模型(每个类别都有一个稀疏向量和截距)。在测试点上运行所有二分类器来进行预测,在对应类别上分数最高的分类器胜出,将这个类别标签返回作为预测结果。

  • 多分类SVM损失函数:
    在这里插入图片描述
    在这里插入图片描述
    加入正则化项:
    在这里插入图片描述
    其中正则化项:
    在这里插入图片描述

  • 优化:
    随机梯度下降法(找到最优参数w)——

在这里插入图片描述

  • 完整代码
  • 过程总结:数据预处理->初始化权重矩阵->计算损失函数和梯度->随机梯度下降(找到最优w)->调整超参数(on valid set)->预测测试集

2.5 小结

在这里插入图片描述

3. 总结

  • 如果特征数量大于样本数量,线性模型的表现通常都很好。他也常用于非常大的数据集,只是因为训练其他模型并不可行,但在更低维的空间中其他模型的泛化性能可能更好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值