linear regression & logistic regression

Linear Regression

假设函数:

h_{0}(x)=\sum_{i=0}^{n}w_{i}x_{i}=w^{T}x

成本函数:

J(w) = \frac{1}{2m}\sum_{i=1}^{m}(y^{(i)}-w^{(T)}x^{(i)})^{2}

  • 真实值与预测值之间会有误差(\epsilon): y^{(i)}= w^{T}x^{(i)}+\epsilon ^{(i)}
  • 假设误差\epsilon ^{(i)}独立且具有相同分布(均值为0,方差为..的高斯分布)p(\epsilon ^{(i)})=\frac{1}{\sqrt{2\pi \sigma }}exp(-\frac{({\epsilon ^{(i)}})^{2}}{2\sigma^{2}})
  • 由此,p(y^{(i)}|x^{(i)};w)==\frac{1}{\sqrt{2\pi \sigma }}exp(-\frac{(y^{(i)}-w^{T}x^{(i)})^{2}}{2\sigma^{2}})
  • 似然函数越大越好(极大似然估计,什么样的参数和数据组合后接近真实值),即目标函数越小越好。

最小化误差:

  • 最小二乘法(目标函数偏导等于0,求解析解)
  • 梯度下降优化 (下降方向+下降步长+下降次数)

数据清洗tips:

  • Linear Assumption: transform data to make the relationship linear (e.g. log transform for an exponential relationship).
  • Remove Noise: remove outliers in the output variable if possible.
  • Remove Collinearity: calculae pairwise correlations for input data and remove the most correlated.
  • Gaussian Distributions: use transforms (e.g. log or BoxCox) on input and output variables to make their distribution more Gaussian looking.
  • Rescale Inputs: rescale input variables using standardization or normalization.

Logistic Regression

通过加入非线性变化的sigmoid函数,将线性回归的分值转化为概率

将 z = w_{0}x_{0}(b)+w_{1}x_{1}+w_{2}x_{2}+...+w_{n}x_{n} = \sum_{i=1}^{n}w_{i}x_{i}=w^{T}x 转化为 h(x)= g(w^{T}x) = \frac{1}{1+e^{-w^{T}x}}

成本函数:

J(w) = -\frac{1}{m}\sum_{i=1}^{m}(y_{i}logh_{w}(x_{i})+(1-y_{i})log(1-logh_{w}(x_{i}))) (极大似然估计取负求平均)

梯度下降:

  • 初始化w_{j}
  • w_{j} = w_{j} -\alpha\frac{\delta J(w)}{\delta w_{j}} = w_{j} - \alpha\frac{1}{m}\sum_{i=1}^{m}(h_{w}(x_{i})-y_{i})x_{i}^{j}
  • 或对数似然函数梯度上升求最大值
import numpy as np

#sigmoid函数:
def sigmoid(x):
    return 1/(1+np.exp(-x))

#平均成本函数:
def cost(X, y, w)
    return np.sum(np.multiply(-y, np.log(sigmoid(np.dot(X,w)))) - np.multiply(1-y, (-y, np.log(1-sigmoid(np.dot(X,w))))) / len(x)

#求解梯度:
def gradient(X, y, w):
    grad = np.zeros(w.shape)
    error = (sigmoid(np.dot(X,w)) - y)#.ravel()
    for j in range(w):
        grad[j] = np.sum(np.multiply(error, X[:,j])) / len(X)
    return grad
  
#梯度下降:
def descent():
    while True:
        grad = gradient(X[k:k+batch_size], y[k:k+batch_size], w)
        k += batch_size
        #最大的循环次数/最小的每次迭代间损失函数的差/最小的梯度变化(求范数)
        w = w- alpha*grad

sklearn参数:

  • max_iter:
  • penalty: 惩罚项的种类; l1, l2, none...; 默认l2
  • C:正则化项系数的倒数;默认1
  • multi_class:
  • class_weight:
  • solver: 优化算法

神经网络LR:

实际上可以将LR看做是仅含有一个神经元的单层的神经网络,激活函数为sigmoid函数

L=\sum_{w}\left | w \right |

Notes

正则化: 为防止过拟合,在原始的损失函数后添加惩罚项

  • L1​正则化:权值向量w中各元素的绝对值之和;可以产生用以特征选择(增加模型可解释性)的稀疏权值矩阵,一定程度上也可以防止模型过拟合。
    • 加入L1正则化后,线性回归的代价函数为:J=J_{0}+\lambda \sum_{w}\left | w \right |,求偏导为:\frac{\partial J }{\partial x} = \frac{\partial J_{0}}{\partial x} + \lambda \cdot sgn(w),对w进行更新:w:= w-\alpha \frac{\partial J}{\partial x}:=w-\alpha \frac{\partial J_{0}}{\partial x}-\alpha \lambda \cdot sgn(w);其中sgn(w)表示w的符号,因此可以看出L1正则化是通过加上或减去一个常量\alpha \lambda,让w趋向于0;由此L1正则化对于小权重缩小快,对于大权重缩小慢,最终模型的权重会主要集中在高重要度的特征上,对于不重要的特征,权重会很快趋近于0。所以最终权重w会变得稀疏。
    • L=\lambda \sum_{w}\left | w \right |,则我们的任务变为在L的约束下求出J_{0}取最小值的解,在图中J_{0}等值线L函数首次相交处即为最优解,而因为L函数有很多突出的角(在坐标轴上,某些权重为0),所以J_{0}等值线更容易与这些角相交,因此L1正则化更容易产生稀疏模型。此外系数\lambda可以控制L函数图像的大小,\lambda越大,L函数的图像越小(shrinkage)。
  • L2正则化:权值向量w 中各元素的平方和,再求平方根;可以防止模型过拟合。
    • 二维平面下L2正则化的函数图像是个圆,与L1正则化的方形相比,被磨去了棱角,所以J_{0}L相交时使得某个权重等于零的概率小了许多,因此L2正则化不具有稀疏性。
  • 一般会在正则化项前添加一个系数\lambda,这个系数需要用户指定。
  • 正则化与过拟合:拟合过程中通常都倾向于让权值尽可能小,最后构造一个所有参数都比较小的模型。因为一般认为参数值小的模型比较简单,能适应不同的数据集,也在一定程度上避免了过拟合现象。比如对于一个线性回归方程,如果参数很大,那么数据只要偏移一点,就会对结果造成很大的影响;但如果参数足够小,数据偏移得多一点也不会对结果造成什么影响,即“抗扰动能力强”。越大的\lambda,可以使得代价函数最值时各参数也越小。
  • 对于线性回归模型:使用L1正则化的模型建叫Lasso回归,使用L2正则化的模型叫Ridge回归。

Reference

maximum likelihood estimates, log-likelihood

gradient descent

线性回归理解(附python实现)

欠拟合和过拟合的一般解决方法

多项式回归​​​​​​​

猜你喜欢

转载自blog.csdn.net/qq_34276652/article/details/113446077