线性模型
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. 总结
- 如果特征数量大于样本数量,线性模型的表现通常都很好。他也常用于非常大的数据集,只是因为训练其他模型并不可行,但在更低维的空间中其他模型的泛化性能可能更好。