• [读书笔记] 机器学习(三):线性模型


    1. 什么是线性回归

    线性回归:通过拟合因变量$y$和自变量$vec{x}$的最佳线性关系来预测目标变量。最佳拟合通过尽量缩小预测的线性表达式和实际观察结果间的距离总和来实现。没有其他位置的拟合比该位置生成的错误更少,该拟合是最佳拟合。

    2. 基本形式:给定d个属性的实例 $x = (x_1, x_2, ... ,x_d), x_i 是x在第i个属性的取值:$

    基本形式:$f(x) = w_1x_1 + w_2x_2 + ... w_dx_d +b$

    向量形式:$f(x) = W^Tx + b, W, b 学的之后模型就可以确定$

    线性回归的两个主要类型:简单线性回归和多元线性回归。简单线性回归使用一个自变量通过拟合最佳线性关系来预测因变量的变化情况。多元线性回归使用多个自变量通过拟合最佳线性关系来预测因变量的变化趋势。

    优点:

    1. 形式简单,易于建模

    2. 易于理解comprehensibility,W直观表达了各个属性在预测中的重要性

    3.  当变量数比数据还要多的时候,容易出现过拟合,可以引入正则化来降低拟合的风险(比如L1 penality(lasso), L2 penality(ridge), L1+L2 penality(elastic)

    LASSO回归:

    岭回归:

    弹性回归:

     

    4. 许多更为强大的非线性模型可以在线性模型基础上引入层级结构或者高维映射取得

    #比较线性回归和加了L1 L2 penality 的ElasticNet的差异
    from sklearn.linear_model import LinearRegression
    from sklearn.linear_model import ElasticNet
    from sklearn.datasets import load_boston
    from sklearn.cross_validation import KFold
    import numpy as np
    boston = load_boston()
    data = boston["data"]
    target = boston["target"]
    lr = LinearRegression(fit_intercept=True)
    en = ElasticNet(fit_intercept=True,alpha=0.5)
    kf = KFold(len(data), n_folds=10)
    err_lr = 0
    err_en = 0
    pred_lr = np.zeros_like(target)
    pred_en = np.zeros_like(target)
    for train,test in kf:
    	lr.fit(data[train],target[train])
    	pred_lr[test] = lr.predict(data[test])
    	e = pred_lr[test] - target[test]
    	err_lr += np.sum(e*e)
    	en.fit(data[train],target[train])
    	pred_en[test] = en.predict(data[test])
    	e = pred_en[test] - target[test]
    	err_en += np.sum(e*e)
    rmse_lr = np.sqrt(err_lr/len(data))
    rmse_elastic = np.sqrt(err_en/len(data))
    print(rmse_lr)
    print(rmse_elastic) 
    

      

    缺点:

    1 .线性回归在变量是非线性关系的时候表现很差, 并且其也不够灵活以捕捉更复杂的模式

    2. 添加正确的交互项或使用多项式很困难并需要大量时间

    3. 线性回归

    给定数据集$D = {(x_1, y_1), (x_2, y_2), ... ,(x_m, y_m)}, 其中x_i = (x_{i1}, x_{i2}, ..., x_{id}), y_i in R$

    如果存在离散属性,如果属性存在序的关系可以转化为连续变量,如果属性间不存在序的关系,假定有k个属性值,可以转化为k维向量. 

    单变量线性回归:

    均方误差最小化:

    $$(w^*, b^*) =  arg_{(a,b)} min sum_{i = 1}^m (f(x_i) -y_i)^2  = arg_{(a,b)} sum_{i =1}^m (y_i - wx_i - b)^2$$

    多元线性回归:

    广义线性回归:求取输入空间到非线性空间的函数映射

    $$y = g^{-1}(W^T x + b)$$

    $g(cdot)为联系函数$

    特例:$y = e^{W^T x + b}$, 对数线性回归函数 

    4. 对数几率回归(logistic regression)

    解决分类问题:

    对于分类任务,输出是$y in {0,1}$, 而线性回归模型产生的连续实数值,可以将z转化为0/1 $ ightarrow$ 单位阶跃函数(unit-step function)

    问题:单位阶跃函数不连续,不具有很好的性质

    替代函数(surrogate function): $ y = frac{1}{1 + e^{-z}}$, Sigmoid 函数

    新函数:$y = frac{1}{1 + e^{-(W^Tx + b)}} ightarrow  lnfrac{y}{1-y} = W^Tx + b$

    $y in (-1,1)$如果将y看做正例可能性,1-y 代表反例可能性, 可以看出原有的线性模型,实际上是在用预测结果逼近真实标记的对数几率. 

    优点:直接对数据分布性进行建模,无需假设数据分布;不仅仅预测类别,而是可以近似概率预测,这对许多概率辅助决策的任务很有用;任意阶可导凸函数,有很好的数学性质,有许多数值算法直接求取最优解.

     要构建模型就必须确定上面式子中的$W和b$, 前面我们将y视为正例几率,我们用类后验概率估计$p(y = 1|x)$,式子可以重写为:

    $$ lnfrac{p(y=1|x)}{p(y=0|x)} = W^Tx+b$$

    显然有:

    $$ p(y=1|x) =  frac{e^{W^T+b}}{1+e^{(W^Tx+b)}}$$

    $$ p(y=0|x) =  frac{1}{1+e^{(W^Tx+b)}}$$

    对给定的自变量$x_i$和类别$y_i$, 似然函数可以表示为如下:

    $$L(W,b) = prod_{i=1}^m p(y_i=1|x_i)^y_i(1-p(y_i=1|x_i)^{1-y_i}$$

    对数似然函数如下:

    $$l(W,b) = sum_{i=1}^m y_ilog p(x_i) + (1-y_i) log1 - p(x_i)$$

    上式 = $sum_{i=1}^m - ln(1+e^{W^Tx_i+b}) + sum_{i=1}^m y_i(W^Tx_i + b)$

    $frac{partial l}{partial eta} = - sum_{i=1}^m frac{1}{1+e^{W^T + b}} e^{W^Tx + b}x_i + sum_{i=1}^m y_i x_i$

    5. 线性判别分析(linear discriminant analysis)

    线性判别分析简称LDA, 是一种经典的线性学习方法,在二分类问题上最早由Fisher提出,亦称Fisher判别分析.

    思想:给定训练样例集,设法将样例投影到一条直线上,使得同样的样例点尽可能接近,异类投影点尽可能远离;在对新的样本点进行分类的时候,同样将其投影到这条直线上,根据投影点的位置来确定样本的类别.

    这一章数学知识知识没怎么看懂!

    http://statweb.stanford.edu/~jtaylo/courses/stats202/restricted/notes/lda.pdf

    6. 多分类学习

    二分类学习器解决多分类问题,将多分类问题拆解为若干个二分类问题求解,对每个二分类问题训练一个分类器,One vs. One, One vs. Rest, Many vs. Many.

    给定数据集$D = {(x_1,y_1),(x_2,y_2), ... ,(x_m, y_m)}, y_i in {C_1,C_2, ... ,C_N}. $

    OvO 将N个类别两两配对,产生$C_N^2 = N(N-1)/2$个二分类任务,新样本在测试的时候也产生$N(N-1)/2$个结果,最后的结果可以由投票产生,预测最多的类作为最终的分类结果.

    OvR 将一个类的样例作为正例,其他类样例作为反例来训练N个分类器,在测试时如果仅有一个分类器预测为正例,则对应类别标记作为最终结果,如果有多个分类器预测为正类,则通常考虑各个分类器预测置信度,选择置信度最大的类别作为分类结果.

    OvR需要训练的分类器更少,但是由于OvR使用全部样例训练,而OvO使用两个类样例训练,因此如果类别很多,OvO训练时间通常比OvR更小,性能取决于具体数据分布,多数情况下二者差不多.

    MvM是每次将若干个作为正类,若干个其他类作为负类,OvO和OvR是MvM特例. 

    纠错输出编码(error correction outputs codes)

    这里略过了,有时间再看!

    7. 类别不平衡(class-imbalancing)问题

    类别平衡预测规则:$ frac{y}{1-y} >1 $, 预测为正例,否则预测为反例

    再缩放(rescaling):$m^+$正例个数,$m^-$反例个数,$ frac{y}{1-y} > frac{m^+}{m^-}$,预测为正例. 前提:训练样本是真实样本总体的无偏采样!  决策函数:$frac{y'}{1-y'} = frac{y}{1-y}*frac{m^-}{m^+}$

    欠采样(undersampling):去除样本数目过多的类样例, EasyEnsemble 

    过采样(oversampling):增加样本数目过少的类样例,SMOTE

    阈值移动(threshold-moving):直接基于原始训练集进行学习,但在用训练好的分类器进行预测的时候,使用$ frac{y'}{1-y'} = frac{y}{1-y} * frac{m^-}{m^+} $ 进行决策. 

    再缩放是代价敏感(cost-sensitive learning)学习

  • 相关阅读:
    SpringMVC的自定义校验器
    Spring 国际化 异常:No message found under code 'message' for locale 'zh_CN'.
    《Redis实战》学习实践
    博客系统开发问题
    牛人博客
    Lambda表达式
    红黑树
    配置mysql的主从复制
    mysql 存储过程入门
    一个稍复杂的mysql存储过程
  • 原文地址:https://www.cnblogs.com/vincentcheng/p/7940986.html
Copyright © 2020-2023  润新知