Time: 2017/02/25 19:25 at UTSZ
Environment: python2.7 pyCharm
首先这是一个回归问题,通过输入变量的线性组合得到目标函数和目标值。数学上表示为:
其中,向量 w=(w1, w2 ... wp) 表示系数(或者说是某个特征的权重),w0 表示线性函数的截距。
1.1.1 普通最小二乘法(ordinary Least Squares)
LinearRegression 通过调整系数 w=(w1, w2 ... wp) 来使得数据集训练后得到的预测值与实际值之间的误差最小化。数学公式如下:
我们也可以通过coef_这个成员变量查看训练后的模型的系数。
# !/usr/bin/env python2 # -*- coding:utf-8 -*- from sklearn import linear_model reg = linear_model.LinearRegression() reg.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2]) print reg.coef_
但是,普通最小二乘法的系数估计依赖于模型样例的独立性。当样例相关时,向量矩阵就变得接近于一个单数。结果,最小二乘法得到的估计变得高敏感性,会产生很大的方差。多重共线性的这种情况常出现在没有实验设计而收集到的数据中。
Linear Regression Example:
为了在而为图形中表示出这个线性回归,我们使用diabetes数据集中的第一个特征。如下图所示,线性回归尝试画出一条直线以使得在训练集中的平方差值最小。
# !/usr/bin/env python2 # -*- coding:utf-8 -*- import matplotlib.pyplot as plt import numpy as np from sklearn import datasets, linear_model # 加载数据集 diabetes = datasets.load_diabetes() # 只是用一个特征 diabetes_X = diabetes.data[:, np.newaxis, 2] # 切分训练集和测试集 diabetes_X_train = diabetes_X[:-20] diabetes_X_test = diabetes_X[-20:] # 切分训练集和测试集的目标值 diabetes_y_train = diabetes.target[:-20] diabetes_y_test = diabetes.target[-20:] # 确定线性回归算法 regr = linear_model.LinearRegression() # 用训练集训练模型 regr.fit(diabetes_X_train, diabetes_y_train) # 输出系数 print ‘系数:‘,regr.coef_ # 输出均方误差 print ‘均方误差:‘, np.mean((regr.predict(diabetes_X_test) - diabetes_y_test) ** 2) # 输出方差:1表示完美预测 print ‘方差:‘,regr.score(diabetes_X_test, diabetes_y_test) # 输出图形 plt.scatter(diabetes_X_test, diabetes_y_test, color=‘black‘) plt.plot(diabetes_X_test, regr.predict(diabetes_X_test), color=‘blue‘, linewidth=3) plt.xticks(()) plt.yticks(()) plt.show()
1.1.2 岭回归 (Ridge Regression)
岭回归在普通最小二乘法的基础上,加上了一个系数的惩罚项。同样,岭系数要使得下式的平方和最小。
同其他线性模型相同,岭回归用 fit 训练,将系数保存在(coef_),截距保存在(intercept_)中。
# !/usr/bin/env python2 # -*- coding:utf-8 -*- from sklearn import linear_model reg = linear_model.Ridge(alpha=0.5) reg.fit([[0, 0], [0, 0], [1, 1]], [0, 0.1, 1]) print ‘系数:‘, reg.coef_ print ‘截距:‘, reg.intercept_
结果:
1.1.2.1 岭回归的复杂度
和普通最小二乘法的复杂度相同。
1.1.2.2 正则化参数的设置:广义交叉验证 (Setting the regularization parameter: generalized Cross-Validation)
岭交叉验证 (RidgeCV) 应用岭回归中内建的alpha参数交叉验证实现。这个对象与GridSearchCV的工作方式相同,除了它默认为广义交叉验证——一种高效形式的留一交叉验证。
# !/usr/bin/env python2 # -*- coding:utf-8 -*- from sklearn import linear_model reg = linear_model.RidgeCV(alphas=[0.1, 1.0, 10.0]) reg.fit([[0, 0], [0, 0], [1, 1]], [0, 0.1, 1]) print reg.alpha_
结果:
1.1.3 套索算法 (Lasso)
套索算法是一种估计稀疏系数的线性模型。
#TODO 略
1.1.4 多任务套索 (Multi-task Lasso)
#TODO 略
1.1.5 弹性网 (Elastic Net)
#TODO 略
1.1.6 多任务弹性网 (Multi-task Elastic Net)
#TODO 略
1.1.7 最小角度回归 (Least Angle Regression)
#TODO 略
1.1.8 LARS套索 (LARS Lasso)
#TODO 略
1.1.9 正交匹配追踪 (Orthogonal Matching Pursuit,OMP)
#TODO 略
1.1.10 贝叶斯回归 (Bayesian Regression)
贝叶斯线性回归的引入主要是在最大似然估计中很难决定模型的复杂程度,ridge回归加入的惩罚参数其实也是解决这个问题的,同时可以采用的方法还有对数据进行正规化处理,另一个可以解决此问题的方法就是采用贝叶斯方法。
为了获得完整的概率模型,假定输出 y 在 Xw 上服从正态分布(高斯分布):
其中 alpha 是一个随机变量,通过训练数据估计得到。
贝叶斯回归的优点:
It adapts to the data at hand. It can be used to include regularization parameters in the estimation procedure.缺点:
Inference of the model can be time consuming.1.1.10.1 Bayesian Ridge Regression
#TODO 略
1.1.11 逻辑回归 (Logistic Regression)
#TODO 略
1.1.12 随机梯度下降 (Stochastic Gradient Descent,SGD)
#TODO 略
1.1.13 感知器 (Preceptron)
#TODO 略
1.1.14 被动攻击算法 (Passive Aggressive Algorithms)
#TODO 略
1.1.15 鲁棒性回归:离群点和模型误差 (Robustness Regression:outliers and modeling errors)
#TODO 略
1.1.16 多项式回归:基函数拓展线性模型 (Polynomial Regression:extending linear models with basis functions)
#TODO 略
参考资料:http://scikit-learn.org/stable/modules/linear_model.html
scikit-learn 1.1 广义线性模型(Generalized Linear Models)
原文:http://www.cnblogs.com/aszhaoweiguo/p/6442539.html