机器学习笔记—线性模型(分类)算法介绍(5)—附完整代码
以下都是本人在学习机器学习过程中的一些心得和笔记,仅供参考。
1.用于回归的线性模型
- 线性模型也广泛应用于分类问题,预测公式如下:
这个公式看起来与线性回归公式非常相似,但是我们没有返回特征的加权求和,而是为预测设置了阈值(0)。如果函数值小于0,我们就预测类别-1;若函数值大于0,我们就预测类别+1。
- 对于用于回归的线性模型,输出
y
是特征的线性函数,是直线,平面或者超平面(对于更高维的数据集) - 对于用于分类的线性模型,决策边界是输入的线性函数。
- 换句话说,(二元)线性分类器是利用直线,平面或者超平面来分开两个类别的分类器。
学习线性模型有很多算法,这些算法的区别在于以下两点:
- 系数和截距的特定组合对训练数据拟合好坏的度量方法;
- 是否使用正则化,以及使用哪种正则化方法。
最常见的两种线性分类算法是**Logistic
回归**(logistic regression)和线性支持向量机(linear support vector machine,线性SVM
)
我们将LogisticRegression
和LinearSVC
模型应用到forge
数据集,并将线性模型找到的决策边界可视化:
from sklearn.linear_model import LogisticRegression
#导入LogisticRegression模型
from sklearn.svm import LinearSVC
#导入LinearSVC模型
import mglearn
import matplotlib.pyplot as plt
X,y=mglearn.datasets.make_forge()
#导入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()
SVM
和Logistic
回归在forge
数据集上的决策边界
在这张图中,forge
数据集的第一个特征位于x轴,第二个特征位于y轴,与前面相同。
位于黑线上方的新数据点被划为类别1,而在黑线下方的数据点会被划为类别0。
- 两个模型都得到了相似的决策边界,都默认使用
L2
正则化
对于LogisticRegression
和LinearSCV
,决定正则化强度的权衡参数叫做C
。
C
值越大,对应正则化越弱,也就是说,参数C的值较大,那么两个模型将尽可能将训练集拟合到最好;如果C
的值较小,那么模型更强调是系数w
接近于0.- 参数
C
的作用还有另一个有趣之处。较小的C
可以让算法尽量适应“大多数”数据点,而较大的C
值更强调每个数据点都分类正确的重要性。
mglearn.plots.plot_linear_svc_regularization()
C
值的线性SVM
在forge
数据集上的决策边界
- 在左图中,
C
的值最小,对应强正则化;大部分属于类别0的点都位于底部,大部分属于类别1的点都位于顶部。 - 中间图,
C
的值较大,模型更关注两个分类错误的样本,使得决策边界的斜率变大; - 在右图中,
C
的值非常大,使得决策边界的斜率变得更大。
与回归的情况类似,用于分类的线性模型在低维空间中看起来肯那个非常受限,决策边界只能是直线或者平面。
同样,在高维空间中,用于分类的线性模型变得非常强大,当考虑更多特征时,避免过拟合变得越来越重要。
- 在乳腺癌数据集上详细分析
LogisticRegression
:
In
:
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import matplotlib.py