线性模型

线性模型利用输入特征的线性函数进行预测

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

posted @ 2022-04-17 09:46  朝南烟  阅读(350)  评论(0编辑  收藏  举报
body { color: #000; background-color: #e6e6e6; font-family: "Helvetica Neue",Helvetica,Verdana,Arial,sans-serif; font-size: 12px; min-height: 101%; background: url(https://images.cnblogs.com/cnblogs_com/caolanying/1841633/o_2009041…ly1geq8oc9owbj21hc0u0th5.jpg) fixed; } #home { margin: 0 auto; opacity: 0.8; width: 65%; min-width: 1080px; background-color: #fff; padding: 30px; margin-top: 50px; margin-bottom: 50px; box-shadow: 0 2px 6px rgba(100, 100, 100, 0.3); }