下面是一组用于回归的方法,其中目标期望值 y是输入变量 x 的线性组合。 在数学概念中,如果
是预测值 value.
在整个模块中,我们定义向量
作为coef_定义
作为intercept_.
如果需要使用广义线性模型进行分类,请参阅logistic 回归.logistic 回归.
的线性模型,使得数据集实际观测数据和预测数据(估计值)之间的残差平方和最小。其数学表达式为:
LinearRegression会调用fit方法来拟合数组 X, y,并且将线性模型的系数
存储在其成员变量``coef_``中:
>>>
>>>fromsklearnimportlinear_model>>>reg=linear_model.LinearRegression()>>>reg.fit([[0,0],[1,1],[2,2]],[0,1,2])LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)>>>reg.coef_array([ 0.5, 0.5])
然而,对于普通最小二乘的系数估计问题,其依赖于模型各项的相互独立性。当各项是相关的,且设计矩阵
的各列近似线性相关,那么,设计矩阵会趋向于奇异矩阵,这会导致最小二乘估计对于随机误差非常敏感,产生很大的方差。例如,在没有实验设计的情况下收集到的数据,这种多重共线性(multicollinearity) 的情况可能真的会出现。
举例:
该方法使用 X 的奇异值分解来计算最小二乘解。如果 X 是一个 size 为 (n, p) 的矩阵,设
,则该方法花费的成本为
Ridge回归通过对系数的大小施加惩罚来解决普通最小二乘法(普通最小二乘)的一些问题。 岭系数最小化一个带罚项的残差平方和,
其中,
是控制收缩量复杂性的参数:
, 的值越大,收缩量越大,因此系数对共线性变得更加鲁棒。
与其他线性模型一样,Ridge采用fit将采用其
存储在其coef_成员中:
>>>
>>>fromsklearnimportlinear_model>>>reg=linear_model.Ridge(alpha=.5)>>>reg.fit([[0,0],[0,0],[1,1]],[0,.1,1])Ridge(alpha=0.5, copy_X=True, fit_intercept=True, max_iter=None,normalize=False, random_state=None, solver='auto', tol=0.001)>>>reg.coef_array([ 0.34545455, 0.34545455])>>>reg.intercept_0.13636...
举例:
:ref:`sphx_glr_auto_examples_linear_model_plot_ridge_path.py`( 作为正则化的函数,绘制岭系数 )
:ref:`sphx_glr_auto_examples_text_document_classification_20newsgroups.py`( 使用稀疏特征的文本文档分类 )
这种方法与普通最小二乘法(普通最小二乘方法)的复杂度是相同的.
RidgeCV通过内置的 Alpha 参数的交叉验证来实现岭回归。 该对象与 GridSearchCV 的使用方法相同,只是它默认为 Generalized Cross-Validation(广义交叉验证 GCV),这是一种有效的留一验证方法(LOO-CV):
>>>
>>>fromsklearnimportlinear_model>>>reg=linear_model.RidgeCV(alphas=[0.1,1.0,10.0])>>>reg.fit([[0,0],[0,0],[1,1]],[0,.1,1])RidgeCV(alphas=[0.1, 1.0, 10.0], cv=None, fit_intercept=True, scoring=None,normalize=False)>>>reg.alpha_0.1
参考
“Notes on Regularized Least Squares”, Rifkin & Lippert (technical report,course slides).
TheLasso是估计稀疏系数的线性模型。 它在一些情况下是有用的,因为它倾向于使用具有较少参数值的情况,有效地减少给定解决方案所依赖变量的数量。 因此,Lasso及其变体是压缩感知领域的基础。 在一定条件下,它可以恢复一组非零权重的精确集 (见Compressive sensing: tomography reconstruction with L1 prior (Lasso)).
在数学上,它由一个线性模型组成,以
为准。 其目标函数的最小化是:
lasso estimate 解决了加上罚项
的最小二乘法的最小化,其中,
是一个常数,
是参数向量的
-norm 范数。
Lasso类的实现使用了 coordinate descent (坐标下降算法)来拟合系数。 查看最小角回归用于另一个实现:
>>>
>>>fromsklearnimportlinear_model>>>reg=linear_model.Lasso(alpha=0.1)>>>reg.fit([[0,0],[1,1]],[0,1])Lasso(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=1000,normalize=False, positive=False, precompute=False, random_state=None,selection='cyclic', tol=0.0001, warm_start=False)>>>reg.predict([[1,1]])array([ 0.8])
对于较低级别的任务,同样有用的是:func:lasso_path。它能够通过搜索所有可能的路径上的值来计算系数。
举例:
Note
Feature selection with Lasso(使用 Lasso 进行 Feature 的选择)
由于 Lasso 回归产生稀疏模型,因此可以用于执行特征选择,详见基于 L1 的特征选取(基于L1的特征选择).
alpha参数控制估计系数的稀疏度。
scikit-learn 通过交叉验证来公开设置 Lassoalpha参数的对象:LassoCVandLassoLarsCV。LassoLarsCV是基于下面解释的 :ref:`least_angle_regression`(最小角度回归)算法。
对于具有许多线性回归的高维数据集,LassoCV最常见。 然而,LassoLarsCV在寻找alphaparameter 参数值上更具有优势,而且如果样本数量与特征数量相比非常小时,通常LassoLarsCV比LassoCV要快。
有多种选择时,估计器LassoLarsIC建议使用 Akaike information criterion (Akaike 信息准则)(AIC)和 Bayes Information criterion (贝叶斯信息准则)(BIC)。 当使用 k-fold 交叉验证时,正则化路径只计算一次而不是k + 1次,所以找到α的最优值是一种计算上更便宜的替代方法。 然而,这样的标准需要对解决方案的自由度进行适当的估计,对于大样本(渐近结果)导出,并假设模型是正确的,即数据实际上是由该模型生成的。 当问题严重受限(比样本更多的特征)时,他们也倾向于打破。
举例:
:ref:`sphx_glr_auto_examples_linear_model_plot_lasso_model_selection.py`(Lasso 型号选择:交叉验证/AIC/BIC)
根据估计器和模型优化的精确目标函数,在alpha和 SVM 的正则化参数之间是等值的,其中C是通过alpha=1/C或者alpha=1/(n_samples*C)得到的。
MultiTaskLasso是一个估计多元回归稀疏系数的线性模型:y是一个(n_samples,n_tasks)的二维数组,其约束条件和其他回归问题(也称为任务)是一样的,都是所选的特征值。
下图比较了通过使用简单的 Lasso 或 MultiTaskLasso 得到的 W 中非零的位置。 Lasso 估计分散的产生着非零值,而 MultiTaskLasso 的所有列都是非零的。
拟合 time-series model ( 时间序列模型 ),强制任何活动的功能始终处于活动状态。
举例:
在数学上,它由一个线性模型组成,以混合的
作为正则化器进行训练。目标函数最小化是:
其中
表示 Frobenius 标准:
并且
读取为:
MultiTaskLasso类中的实现使用了坐标下降作为拟合系数的算法。
弹性网络是一种使用L1,L2范数作为先验正则项训练的线性回归模型。 这种组合允许学习到一个只有少量参数是非零稀疏的模型,就像Lasso一样, 但是它仍然保持 一些像Ridge的正则性质。我们可利用l1_ratio参数控制L1和L2的凸组合。
弹性网络在很多特征互相联系的情况下是非常有用的。Lasso很可能只随机考虑这些特征中的一个,而弹性网络更倾向于选择两个。
在实践中,Lasso 和 Ridge 之间权衡的一个优势是它允许在循环过程(Under rotate)中继承 Ridge 的稳定性。
在这里,最小化的目标函数是
ElasticNetCV类可以通过交叉验证来设置参数
alpha(
) 和l1_ratio(
) 。
Examples:
MultiTaskElasticNet是一个对多回归问题估算稀疏参数的弹性网络:Y是一个二维数组,形状是(n_samples,n_tasks)。 其限制条件是和其他回归问题一样,是选择的特征,也称为 tasks.。
从数学上来说, 它包含一个用
先验 and
先验为正则项训练的线性模型 目标函数就是最小化:
在MultiTaskElasticNet类中的实现采用了坐标下降法求解参数。
在MultiTaskElasticNetCV中可以通过交叉验证来设置参数alpha(
) 和l1_ratio(
) 。
最小角回归 (LARS) 是对高维数据的回归算法, 由Bradley Efron, Trevor Hastie, Iain Johnstone 和 Robert Tibshirani开发完成。 LARS和逐步回归很像。 在每一步,它寻找与响应最有关联的 预测。当有很多预测由相同的关联时,它没有继续利用相同的预测,而是在这些预测中找出应该等角的方向。
LARS的优点:
当p >> n,该算法数值运算上非常有效。(例如当维度的数目远超点的个数)
它在计算上和前向选择一样快,和普通最小二乘法有相同的运算复杂度。
它产生了一个完整的分段线性的解决路径,在交叉验证或者其他相似的微调模型的方法上非常有用。
如果两个变量对响应几乎有相等的联系,则它们的系数应该有相似的增长率。因此这个算法和我们直觉 上的判断一样,而且还更加稳定。
它也很容易改变,为其他估算器提供解,比如Lasso。
LARS的缺点:
因为LARS是建立在循环拟合剩余变量上的,所以它对噪声非常敏感。这个问题,在2004年统计年鉴的文章由Weisberg详细讨论。
LARS模型可以在Lars,或者它的底层实现lars_path中被使用。
LassoLars是一个使用LARS算法的lasso模型, 不同于基于坐标下降法的实现,它可以得到一个精确解,也就是一个 关于自身参数标准化后的一个分段线性解。
>>>
>>>fromsklearnimportlinear_model>>>reg=linear_model.LassoLars(alpha=.1)>>>reg.fit([[0,0],[1,1]],[0,1])LassoLars(alpha=0.1, copy_X=True, eps=..., fit_intercept=True,fit_path=True, max_iter=500, normalize=True, positive=False,precompute='auto', verbose=False)>>>reg.coef_array([ 0.717157..., 0. ])
例子:
Lars算法提供了一个可以几乎无代价的给出正则化系数的完整路径,因此常利用函数lars_path来取回路径。
该算法和逐步回归非常相似,但是它没有在每一步包含变量,它估计的参数是根据与 其他剩余变量的联系来增加的。
该算法没有给出一个向量的结果,而是在LARS的解中,对每一个变量进行总体变量的L1正则化后显示的一条曲线。 完全的参数路径存在``coef_path_``下。它的尺寸是 (n_features, max_features+1)。 其中第一列通常是全0列。
参考文献:
Original Algorithm is detailed in the paperLeast Angle Regressionby Hastie et al.
OrthogonalMatchingPursuit(正交匹配追踪法)和orthogonal_mp(正交匹配追踪)使用了OMP算法近似拟合了一个带限制的线性模型,该限制限制了模型的非0系数(例:L0范数)。
就像最小角回归一样,作为一个前向特征选择方法,正交匹配追踪法可以近似一个固定非0元素的最优 向量解:
正交匹配追踪法也可以不用特定的非0参数元素个数做限制,而是利用别的特定函数定义其损失函数。 这个可以表示为:
OMP是基于每一步的贪心算法,其每一步元素都是与当前残差高度相关的。它跟较为简单的匹配追踪 (MP)很相似,但是相比MP更好,在每一次迭代中,可以利用正交投影到之前选择的字典元素重新计算残差。
例子:
参考文献:
贝叶斯回归可以用于在预估阶段的参数正则化: 正则化参数的选择不是通过人为的选择,而是通过手动调节数据值来实现。
上述过程可以通过引入无信息先验于模型中的超参数来完成。 在岭回归中使用的
正则项相当于在
为高斯先验条件下,且此先验的精确度为
求最大后验估计。在这里,我们没有手工调参数lambda,而是让他作为一个变量,通过数据中估计得到。
为了得到一个全概率模型,输出
也被认为是关于
:的高斯分布。
Alpha 在这里也是作为一个变量,通过数据中估计得到.
贝叶斯回归有如下几个优点:
它能根据已有的数据进行改变。
它能在估计过程中引入正则项。
贝叶斯回归有如下缺点:
它的推断过程是非常耗时的。
参考文献
一个对于贝叶斯方法的很好的介绍 C. Bishop: Pattern Recognition and Machine learning
*详细介绍原创算法的一本书`Bayesian learning for neural
networks` by Radford M. Neal
贝叶斯岭回归利用概率模型估算了上述的回归问题,其先验参数
是由以下球面高斯公式得出的:
先验参数
和
一般是服从gamma 分布 , 这个分布与高斯成共轭先验关系。
得到的模型一般称为贝叶斯岭回归, 并且这个与传统的Ridge非常相似。参数
,
和
是在模型拟合的时候一起被估算出来的。 剩下的超参数就是 gamma 分布的先验了。
和
。 它们通常被选择为没有信息量。模型参数的估计一般利用最大似然对数估计法。
默认
.
贝叶斯岭回归用来解决回归问题:
>>>
>>>fromsklearnimportlinear_model>>>X=[[0.,0.],[1.,1.],[2.,2.],[3.,3.]]>>>Y=[0.,1.,2.,3.]>>>reg=linear_model.BayesianRidge()>>>reg.fit(X,Y)BayesianRidge(alpha_1=1e-06, alpha_2=1e-06, compute_score=False, copy_X=True,fit_intercept=True, lambda_1=1e-06, lambda_2=1e-06, n_iter=300,normalize=False, tol=0.001, verbose=False)
在模型训练完成后,可以用来预测新值:
>>>
>>>reg.predict([[1,0.]])array([ 0.50000013])
权值
可以被这样访问:
>>>
>>>reg.coef_array([ 0.49999993, 0.49999993])
由于贝叶斯框架的缘故,权值与普通最小二乘法产生的不太一样。 但是,贝叶斯岭回归对病态问题(ill-posed)的鲁棒性要更好。
例子s:
参考文献
更多细节可以参考Bayesian Interpolationby MacKay, David J. C.
主动相关决策理论和贝叶斯岭回归非常相似,
但是会导致一个更加稀疏的权重
[1][2]。主动相关决策理论提出了一个不同于
的先验假设。具体来说,就是弱化了高斯分布为球形的假设。 它采用的是关于
轴平行的椭圆高斯分布。
也就是说,每个权值
精确度来自于一个中心在0点,精度为
的分布中采样得到的。
并且
.
与贝叶斯岭回归不同, 每个
都有一个标准差
。所有的关于方差的系数
和由给定的超参数
、
由相同的gamma分布。
ARD 也被称为稀疏贝叶斯学习或相关向量机[3][4].
示例:
参考文献:
[1]Christopher M. Bishop: Pattern Recognition and Machine Learning, Chapter 7.2.1
logistic 回归,虽然名字里有 “回归” 二字,但实际上是解决分类问题的一类线性模型。在某些文献中,logistic 回归又被称作 logit regression(logit 回归),maximum-entropy classification(MaxEnt,最大熵分类),或 log-linear classifier(线性对数分类器)。该模型利用函数logistic function将单次试验(single trial)的输出转化并描述为概率。
scikit-learn 中 logistic 回归在LogisticRegression类中实现了二元(binary)、一对余(one-vs-rest)及多元 logistic 回归,并带有可选的 L1 和 L2 正则化。
若视为一优化问题,带 L2 罚项的二分类 logistic 回归要最小化以下代价函数(cost function):
类似地,带 L1 正则的 logistic 回归需要求解下式:
在LogisticRegression类中实现了这些求解器: “liblinear”, “newton-cg”, “lbfgs”, “sag” 和 “saga”。
“liblinear” 应用了坐标下降算法(Coordinate Descent, CD),并基于 scikit-learn 内附的高性能C++库LIBLINEAR library实现。不过CD算法训练的模型不是真正意义上的多分类模型,而是基于 “one-vs-rest” 思想分解了这个优化问题,为每个类别都训练了一个二元分类器。因为实现在底层使用该求解器的LogisticRegression实例对象表面上看是一个多元分类器。sklearn.svm.l1_min_c可以计算使用 L1 罚项时 C 的下界,以避免模型为空(即全部特征分量的权重为零)。
“lbfgs”, “sag” 和 “newton-cg” solvers (求解器)只支持 L2 罚项,对某些高维数据收敛更快。这些求解器的参数`multi_class`设为 “multinomial” 即可训练一个真正的多元 logistic 回归[5],其预测的概率比默认的 “one-vs-rest” 设定更为准确。
“sag” 求解器基于平均随机梯度下降算法(Stochastic Average Gradient descent)[6]。在大数据集上的表现更快,大数据集指样本量大且特征数多。
“saga” solver[7]是 “sag” 的一类变体,它支持非平滑(non-smooth)的 L1 正则选项penalty="l1"。因此对于稀疏多元 logistic 回归 ,往往选用该求解器。
一言以蔽之,选用求解器可遵循如下规则:
CaseSolver
L1正则“liblinear” or “saga”
多元损失(multinomial loss)“lbfgs”, “sag”, “saga” or “newton-cg”
大数据集(n_samples)“sag” or “saga”
“saga” 一般都是最佳的选择,但出于一些历史遗留原因默认的是 “liblinear”。
对于大数据集,还可以用SGDClassifier,并使用对数损失(’log’ loss)
示例:
与 liblinear 的区别:
当fit_intercept=False、回归得到的coef_以及待预测的数据为零时,LogisticRegression用solver=liblinear及LinearSVC与直接使用外部liblinear库预测得分会有差异。这是因为, 对于decision_function为零的样本,LogisticRegression和LinearSVC将预测为负类,而liblinear预测为正类。 注意,设定了fit_intercept=False,又有很多样本使得decision_function为零的模型,很可能会欠拟合,其表现往往比较差。建议您设置fit_intercept=True并增大intercept_scaling。
Note
利用稀疏 logistic 回归(sparse logisitic regression)进行特征选择
带 L1 罚项的 logistic 回归 将得到稀疏模型(sparse model),相当于进行了特征选择(feature selection),详情参见基于 L1 的特征选取。
LogisticRegressionCV对 logistic 回归 的实现内置了交叉验证(cross-validation),可以找出最优的参数 C。”newton-cg”, “sag”, “saga” 和 “lbfgs” 在高维数据上更快,因为采用了热启动(warm-starting)。在多分类设定下,若multi_class设为”ovr”,会为每类求一个最佳的C值;若multi_class设为”multinomial”,会通过交叉熵损失(cross-entropy loss)求出一个最佳 C 值。
参考文献:
[5]Christopher M. Bishop: Pattern Recognition and Machine Learning, Chapter 4.3.4
随机梯度下降是拟合线性模型的一个简单而高效的方法。在样本量(和特征数)很大时尤为有用。 方法partial_fit可用于 online learning (在线学习)或基于 out-of-core learning (外存的学习)
SGDClassifier和SGDRegressor分别用于拟合分类问题和回归问题的线性模型,可使用不同的(凸)损失函数,支持不同的罚项。 例如,设定loss="log",则SGDClassifier拟合一个逻辑斯蒂回归模型,而loss="hinge"拟合线性支持向量机(SVM).
参考文献
Perceptron是适用于 large scale learning(大规模学习)的一种简单算法。默认地,
不需要设置学习率(learning rate)。
不需要正则化处理。
仅使用错误样本更新模型。
最后一点表明使用合页损失(hinge loss)的感知机比SGD略快,所得模型更稀疏。
被动攻击算法是大规模学习的一类算法。和感知机类似,它也不需要设置学习率,不过比感知机多出一个正则化参数C。
对于分类问题,PassiveAggressiveClassifier可设定loss='hinge'(PA-I)或loss='squared_hinge'(PA-II)。对于回归问题,PassiveAggressiveRegressor可设置loss='epsilon_insensitive'(PA-I)或loss='squared_epsilon_insensitive'(PA-II).
参考文献:
“Online Passive-Aggressive Algorithms”K. Crammer, O. Dekel, J. Keshat, S. Shalev-Shwartz, Y. Singer - JMLR 7 (2006)
稳健回归(robust regression)特别适用于回归模型包含损坏数据(corrupt data)的情况,如离群点或模型中的错误。
处理包含离群点的数据时牢记以下几点:
离群值在X上还是在y方向上?
离群值在y方向上离群值在X方向上
离群点的比例 vs. 错误的量级(amplitude)
离群点的数量很重要,离群程度也同样重要。
稳健拟合(robust fitting)的一个重要概念是崩溃点(breakdown point),即拟合模型(仍准确预测)所能承受的离群值最大比例。
注意,在高维数据条件下(n_features大),一般而言很难完成稳健拟合,很可能完全不起作用。
折中: 预测器的选择
Scikit-learn提供了三种稳健回归的预测器(estimator):RANSAC,Theil Sen和HuberRegressor
HuberRegressor一般快于RANSAC和Theil Sen, 除非样本数很大,即n_samples>>n_features。 这是因为RANSAC和Theil Sen都是基于数据的较小子集进行拟合。但使用默认参数时,Theil Sen和RANSAC可能不如HuberRegressor鲁棒。
RANSAC比Theil Sen更快,在样本数量上的伸缩性(适应性)更好。
RANSAC能更好地处理y方向的大值离群点(通常情况下)。
Theil Sen能更好地处理x方向中等大小的离群点,但在高维情况下无法保证这一特点。
实在决定不了的话,请使用RANSAC
随机抽样一致性算法(RANdom SAmple Consensus, RANSAC)利用全体数据中局内点(inliers)的一个随机子集拟合模型。
RANSAC是一种非确定性算法,以一定概率输出一个可能的合理结果,依赖于迭代次数(参数max_trials)。这种算法主要解决线性或非线性回归问题,在计算机视觉摄影测量领域尤为流行。
算法从全体样本输入中分出一个局内点集合,全体样本可能由于测量错误或对数据的假设错误而含有噪点、离群点。最终的模型仅从这个局内点集合中得出。
每轮迭代执行以下步骤:
从原始数据中抽样min_samples数量的随机样本,检查数据是否合法(见is_data_valid).
用一个随机子集拟合模型(base_estimator.fit)。检查模型是否合法(见is_model_valid)。
计算预测模型的残差(residual),将全体数据分成局内点和离群点(base_estimator.predict(X)-y)
绝对残差小于residual_threshold的全体数据认为是局内点。
若局内点样本数最大,保存当前模型为最佳模型。以免当前模型离群点数量恰好相等(而出现未定义情况),规定仅当数值大于当前最值时认为是最佳模型。
上述步骤或者迭代到最大次数(max_trials),或者某些终止条件满足时停下(见stop_n_inliers和stop_score)。最终模型由之前确定的最佳模型的局内点样本(一致性集合,consensus set)预测。
函数is_data_valid和is_model_valid可以识别出随机样本子集中的退化组合(degenerate combinations)并予以丢弃(reject)。即便不需要考虑退化情况,也会使用is_data_valid,因为在拟合模型之前调用它能得到更高的计算性能。
示例:
参考文献:
“Performance Evaluation of RANSAC Family”Sunglok Choi, Taemin Kim and Wonpil Yu - BMVC (2009)
TheilSenRegressor估计器:使用中位数在多个维度推广,因此对多维离散值是有帮助,但问题是,随着维数的增加,估计器的准确性在迅速下降。准确性的丢失,导致在高维上的估计值比不上普通的最小二乘法。
示例:
参考文献:
TheilSenRegressor媲美Ordinary Least Squares (OLS)(普通最小二乘法(OLS))渐近效率和无偏估计。在对比 OLS, Theil-Sen 是一种非参数方法,这意味着它没有对底层数据的分布假设。由于 Theil-Sen 是基于中位数的估计,它是更适合的对损坏的数据。在单变量的设置,Theil-Sen 在一个简单的线性回归,这意味着它可以容忍任意损坏的数据高达 29.3% 的情况下,约 29.3% 的一个崩溃点。
在 scikit-learn 中TheilSenRegressor实施如下的学习推广到多元线性回归模型[8]利用空间中这是一个概括的中位数多维度[9]。
在时间复杂度和空间复杂度,根据 Theil-Sen 量表
这使得它不适用于大量样本和特征的问题。因此,可以选择一个亚群的大小来限制时间和空间复杂度,只考虑所有可能组合的随机子集。
示例:
参考文献:
HuberRegressor不同,因为它适用于Ridge损耗的样品被分类为离群值。如果这个样品的绝对误差小于某一阈值,样品就分为一层。 它不同于TheilSenRegressor和RANSACRegressor因为它无法忽略对离群值的影响,但对它们的权重较小。
其中
建议设置参数epsilon为 1.35 以实现 95% 统计效率。
HuberRegressor与将损失设置为huber的SGDRegressor在以下方面的使用方式上是不同的。
HuberRegressor是标度不变性的. 一旦设置了epsilon, 通过不同的值向上或向下缩放X和y,就会跟以前一样对异常值产生同样的键壮性。相比SGDRegressor其中epsilon在X和y是缩放的时候必须再次设置。
HuberRegressor应该更有效地使用在小样本数据,同时SGDRegressor需要在训练数据的次数来产生相同的键壮性。
示例:
参考文献:
Peter J. Huber, Elvezio M. Ronchetti: Robust Statistics, Concomitant scale estimates, pg 172
另外,这个估计是不同于 R 实现的 Robust Regression (http://www.ats.ucla.edu/stat/r/dae/rreg.htm) 因为 R 不实现加权最小二乘实现每个样本上给出多少剩余的基础重量大于某一阈值。
机器学习中一种常见的模式,是使用线性模型训练数据的非线性函数。这种方法保持了一般快速的线性方法的性能,同时允许它们适应更广泛的数据范围。
例如,可以通过构造系数的polynomial features来扩展一个简单的线性回归。在标准线性回归的情况下,你可能有一个类似于二维数据的模型:
如果我们想把抛物面拟合成数据而不是平面,我们可以结合二阶多项式的特征,使模型看起来像这样:
(这有时候是令人惊讶的)观察,这还是still a linear model: 看到这个,想象创造一个新的变量
有了这些数据的重新标记的数据,我们的问题就可以写了。
我们看到,导致polynomial regression是线性模型中的同一类,我们认为以上(即模型是线性 ),可以用同样的方法解决。通过考虑在用这些基函数建立的高维空间中的线性拟合,该模型具有灵活性,可以适应更广泛的数据范围。
这里是一个例子,应用这个想法,一维数据,使用不同程度的多项式特征:
这个图是使用PolynomialFeatures预创建。该预处理器将输入数据矩阵转换为给定度的新数据矩阵。它可以使用如下:
>>>
>>>fromsklearn.preprocessingimportPolynomialFeatures>>>importnumpyasnp>>>X=np.arange(6).reshape(3,2)>>>Xarray([[0, 1],[2, 3],[4, 5]])>>>poly=PolynomialFeatures(degree=2)>>>poly.fit_transform(X)array([[ 1., 0., 1., 0., 0., 1.],[ 1., 2., 3., 4., 6., 9.],[ 1., 4., 5., 16., 20., 25.]])
X的特征已经从
转换到
, 并且现在可以用在任何线性模型。
这种预处理可以通过Pipeline工具进行简化。可以创建一个表示简单多项式回归的单个对象,并使用如下所示:
>>>
>>>fromsklearn.preprocessingimportPolynomialFeatures>>>fromsklearn.linear_modelimportLinearRegression>>>fromsklearn.pipelineimportPipeline>>>importnumpyasnp>>>model=Pipeline([('poly',PolynomialFeatures(degree=3)),...('linear',LinearRegression(fit_intercept=False))])>>># fit to an order-3 polynomial data>>>x=np.arange(5)>>>y=3-2*x+x**2-x**3>>>model=model.fit(x[:,np.newaxis],y)>>>model.named_steps['linear'].coef_array([ 3., -2., 1., -1.])
利用多项式特征训练的线性模型能够准确地恢复输入多项式系数。
在某些情况下,没有必要包含任何单个特征的更高的幂,但只需要在大多数
不同的特征上相乘的所谓interaction features(交互特征)。这些可以与设定的interaction_only=True的PolynomialFeatures得到。
例如,当处理布尔属性,
所有
,因此是无用的;但
代表两布尔合取。这样我们就可以用线性分类器解决异或问题:
>>>
>>>fromsklearn.linear_modelimportPerceptron>>>fromsklearn.preprocessingimportPolynomialFeatures>>>importnumpyasnp>>>X=np.array([[0,0],[0,1],[1,0],[1,1]])>>>y=X[:,0]^X[:,1]>>>yarray([0, 1, 1, 0])>>>X=PolynomialFeatures(interaction_only=True).fit_transform(X).astype(int)>>>Xarray([[1, 0, 0, 0],[1, 0, 1, 0],[1, 1, 0, 0],[1, 1, 1, 1]])>>>clf=Perceptron(fit_intercept=False,max_iter=10,tol=None,...shuffle=False).fit(X,y)
分类器的 “predictions” 是完美的:
>>>
>>>clf.predict(X)array([0, 1, 1, 0])>>>clf.score(X,y)1.0
有兴趣的大佬们也可以和我们一起来维护,持续更新中 。。。
机器学习交流群: 629470233