线性模型
线性模型利用输入特征的线性函数进行预测
1、用于回归的线性模型
- 一般公式
其中,x[0]~x[p]表示单个数据点的特征(本例中特征有p+1个),w和b是学习模型的参数,y是预测结果。
👍
- 可以把预测的响应值看作是输入特征的加权求和,权重由w[]给出(可以是负值)。
- 用于回归的线性模型可以表示为:对单一特征的预测结果是一条直线,两个特征是一个平面,或者在更高维度时是一个超平面。
- 不同回归模型的区别在于如何从训练数据中心学习参数w和b,以及如何控制模型复杂度。
1.1线性回归(最小二乘法)
OLS是回归问题的最简单也是最经典的线性方法。
- OLS寻找参数w和b,使得对训练集的预测值与真实的回归目标值y之间的均方误差(预测值与真实值之差的平方和处以样本数)最小。
- OLS没有参数,但也因此无法控制模型的复杂度
-
线性回归在linear.model.LinearRegression中实现
import mglearn from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split X, y = mglearn.datasets.load_extended_boston() #random_state参数指定随机数生成器的种子,使每次拆分的数据集相同 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("Training set score: {:.2f}".format(lr.score(X_train,y_train))) print("Test set score: {:.2f}".format(lr.score(X_test,y_test)))
-
输出
lr.coef_: [0.39390555,...,0.03600231] lr.intercept_: -0.031804343026759746 Training set score: 0.95 Test set score: 0.61
👍scikit-learn将从训练数据中得出的值保存在以下划线结尾的属性中;比如说coef_和intercept_。从结果中可以看出,coef_属性返回的是一个numpy数组,里面记录了线性模型的所有w值。intercept_是一个浮点数代表着截距。
- 欠拟合:训练集和测试集分数非常接近,则可能出现
- 过拟合:训练集上表现很好,测试集上表现差
1.2岭回归
岭回归也是一种用于回归的线性模型,其预测公式与普通最小二乘法相同。
- 在岭回归中,对系数w的选择不仅要在训练数据上得到好的效果,还要拟合附加约束(L2正则化)。
- 希望w的所有元素都接近于0,这意味着每个特征对输出的影响尽可能小(即斜率很小),同时仍给出很好的预测结果,这种约束是正则化的一个例子。
正则化:指对模型做显式约束,以避免过拟合。
-
岭回归在linear.model.Ridge中实现
from sklearn.linear_model import Ridge #岭回归 X, y = mglearn.datasets.load_extended_boston() X_train,X_test, y_train,y_test = train_test_split(X, y,random_state=0) ridge = Ridge().fit(X_train,y_train) print("Training set score: {:.2f}".format(ridge.score(X_train,y_train))) print("Test set score: {:.2f}".format(ridge.score(X_test,y_test)))
-
输出
Training set score: 0.89 Test set score: 0.75
📣对比线性回归和岭回归的实验结果,可以看出,Ridge在训练集上的分数,要低于LinearRegression,但是在测试集上的分数更高。
这说明:
- 线性回归对数据存在过拟合。
- Ridge是一种约束性更强的模型,不容易过拟合。
👍注意
- 1、简单的模型意味着在train_set上的性能更差,但是泛化性能更好。
- 2、Ridge模型的简单性和训练集性能二者对于模型的重要程度,可以通过alpha参数来指定。
- 增大alpha,表示更强的约束,会使系数w更趋向于0,训练集性能会差些,但是会提高泛化能力
- 减小alpha,可以让系数受到的限制更小,容易过拟合
- 3、如果训练数据足够多,则正则化变得不那么重要,并且岭回归和线性回归将具有相同的性能
- 4、学习曲线? 将模型性能作为数据集大小的函数进行绘图(score_of_model = f(size_of_datasets))
1.3 Lasso
与Ridge类似,lasso也是约束系数使其接近于0,但是用到的方法不同,叫做L1正则化
- 使用lasso时,某些系数刚好为零,这说明某些特征被忽略。
- 易于解释模型,可以呈现最重要的特征
-
在linear_model.lasso模块中使用lasso
from sklearn.linear_model import Lasso from sklearn.model_selection import train_test_split import numpy as np import mglearn X,y=mglearn.datasets.load_extended_boston() X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=0) #训练模型(注意设置alpha参数,控制正则化强弱) lasso=Lasso(alpha=0.01).fit(X_train,y_train) #输出 print("Training set score:{:.2f}".format(lasso.score(X_train,y_train))) print("Test set score:{:.2f}".format(lasso.score(X_test,y_test))) print("Number of features used: {}".format(np.sum(lasso.coef_ !=0)))
-
输出
Training set score:0.90 Test set score:0.77 Number of features used: 32
👍注意:
- 1、当模型的alpha(默认为1.0)设置得很小时,会消除正则化的效果,并出现过拟合,得到与LinearRegession相类似的结果
- 2、alpha的取值决定了模型的复杂度。
- 3、如果数据的特征很多,你只认为其中有几个特征是重要的,那么选择Lasso比Ridge更好。
2、用于分类的线性模型
线性模型也广泛应用于分类问题
-
这个公式很类似于线性回归,但没有返回特征的加权求和,而是为预测设置了阈值(0)。如果函数值小于0,我们就预测类别-1;若函数值大于0,我们就预测类别+1。
-
👍线性分类和线性回归?
- 回归的线性模型:输出的y是特征的线性函数,是直线、平面或者超平面;
- 分类的线性模型:决策边界是输入的线性函数。即,(二元)线性分类器是利用直线平面或超平面来,分开两个类别的分类器。
-
最常见的两种线性分类算法是Logistic回归和线性支持向量机(线性SVM),
- 虽然LogisticRegression中含有regression,但它是个分类算法
-
在linear_model.LogisticRegression模块和svm.LinearSVC中应用
from sklearn.linear_model import LogisticRegression from sklearn.svm import LinearSVC import mglearn import matplotlib.pyplot as plt X,y=mglearn.datasets.make_forge() fig,axes = plt.subplots(1,2,figsize=(10,3)) for model,ax in zip([LinearSVC(),LogisticRegression()],axes): clf=model.fit(X,y) mglearn.plots.plot_2d_separator(clf,X,fill=False,eps=0.5,ax=ax) mglearn.discrete_scatter(X[:,0],X[:,1],y,ax=ax) ax.set_title("{}".format(clf.__class__.__name__)) ax.set_xlabel("Feature 0") ax.set_ylabel("Feature 1") axes[0].legend() plt.show()
-
输出
📣在结果中,决策边界将数据样本分成了两类。这两个分类算法的决策边界都是直线。这两个模型都默认使用L2正则化,和Ridge回归一样。
- 对于LogisticRegression和LinearSCV,决定正则化强度的权衡参数叫做C。
- C值越大,对应正则化越弱(这与alpha参数不同),也就是说,参数C的值较大,那么两个模型将尽可能将训练集拟合到最好;
- 如果C的值较小,那么模型更强调是系数w接近于0.
👍注意:
-
1、用于分类的线性模型的主要差别在于:penalty参数,它会影响正则化,也会影响模型是使用所有可用特征还是只选择特征的一个子集。
-
2、同时也要注意参数c的数值,它决定了对模型的约束强度。
3、用于多分类的线性模型
-
许多的线性分类模型只适用于二分类问题,不能轻易推广到多类别问题(除了Logistic回归)。
-
将二分类算法推广到多分类算法的一种常见方法是“一对其余”方法。
- 该方法对每个类别都学习一个二分类的模型,将这个类别与所有其他类别尽可能地分开,生成了一个与类别个数一样多的二分类模型。
- 在测试集上运行所有的二分类模型进行预测,在对应类别上分数高的分类器“胜出”,将这个类别标签返回作为预测结果。
-
多分类Logistic回归背后的数学与“一对其余”方法稍微有点不同,但它也是对每个类别都有一个系数向量和一个截距,也使用了同样的预测方法。
4、优点、缺点和参数
-
1、线性模型的参数主要是:正则化参数
- 在回归模型中为:alpha参数(alpha值大,模型简单,正则化强)
- 在分类模型中为:c参数(c值小,模型简单,正则化强)
-
2、无论是用于回归还是分类的线性模型,都需要确定使用的penalty='l1'还是penalty='l2'
- L1正则化:很多特征中,只有几个特征比较重要;易于解释模型
- L2正则化:默认
-
3、线性模型可以推广到非常大的数据集,对于稀疏矩阵也很有效
- 对于特征数量大于样本数量的数据,线性模型表现优秀
参考文献
《Pyhon机器学习基础教程》p35-p53