sklearn--Linearn Models

1.1 线性模型(Linear Models)

翻译整理自xiaoyao,https://me.csdn.net/aihubei

以下是一组用于回归的方法,其中目标值为特征的线性组合。如果 y ^ \hat{y} y^是预测值,则用数学符号表示如下:
y ^ ( w , x ) = w 0 + w 1 x 1 + w 2 x 2 + ⋯ + w p x p (1.1) \hat{y}(w,x)=w_0+w_1x_1+w_2x_2+\cdots+w_px_p\tag{1.1} y^(w,x)=w0+w1x1+w2x2++wpxp(1.1)
在整个模块中,指定向量 w = ( w 1 , ⋯   , w p ) w=(w_1, \cdots, w_p) w=(w1,,wp)作为coef_ w 0 w_0 w0作为intercept_

LinearRegression 用系数拟合线性模型 w = ( w 1 , ⋯   , w p ) w=(w_1,\cdots,w_p) w=(w1,,wp)尽量减少数据集中观察到的目标与线性近似预测的目标之间的残差平方和。从数学上讲,它解决了以下形式的问题:
min ⁡ w ∣ ∣ X w − y ∣ ∣ 2 2 (1.2) \underset{w}{\min}||Xw-y||_2^2\tag{1.2} wminXwy22(1.2)
图示如下:

LinearRegression将采用其fit方法拟合数组 X , y X, y X,y,同时存储线性模型的系数 w w w到**coef_**成员中。

from sklearn import linear_model
reg = linear_model.LinearRegression()
reg.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
# LinearRegression()
reg.coef_
array([0.5, 0.5])

普通最小二乘的系数估计取决于特征的独立性。当特征相关并且设计矩阵的列 X X X由于具有近似的线性相关性,设计矩阵变得接近奇异,结果,最小二乘估计对观察到的目标中的随机误差变得高度敏感,从而产生了较大的方差。例如,在没有实验设计的情况下收集数据时,可能会出现多重共线性的情况。线性回归示例如下:

%matplotlib inline

线性回归示例

本示例仅使用diabetes数据集的第一个特征,用以说明此回归技术的二维图像。在图中可以看到直线,它显示了线性回归如何尝试绘制一条直线,该直线将最大程度地减少数据集中观察到的目标(响应)与线性近似预测的目标(响应)之间的残差平方和(residual sum of squares)。

print(__doc__)
Automatically created module for IPython interactive environment
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

# 加载数据集
diabetes_X, diabetes_y = datasets.load_diabetes(return_X_y=True)
print(diabetes_X.shape)

# 仅使用第一个特征
diabetes_X = diabetes_X[:, np.newaxis, 2]
print(diabetes_X.shape)

# 训练集/测试集拆分
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]

# 训练集/测试集拆分
diabetes_y_train = diabetes_y[:-20]
diabetes_y_test = diabetes_y[-20:]

# 创建线性回归对象(Create linear regression object)
regr = linear_model.LinearRegression()

# 使用训练集训练模型(Train the model using the training sets)
regr.fit(diabetes_X_train, diabetes_y_train)

# 使用测试集做预测(Make predictions using the testing set)
diabetes_y_pred = regr.predict(diabetes_X_test)

# 打印模型参数w(The coefficients)
print('Coefficients: \n', regr.coef_)
# 打印均方误差(The mean squared error)
print('Mean squared error: %.2f'
      % mean_squared_error(diabetes_y_test, diabetes_y_pred))
# 确定系数:1为完美预测结果(The coefficient of determination: 1 is perfect prediction)
print('Coefficient of determination: %.2f'
      % r2_score(diabetes_y_test, diabetes_y_pred))

# 绘制结果图示(Plot outputs)
plt.scatter(diabetes_X_test, diabetes_y_test,  color='black')
plt.plot(diabetes_X_test, diabetes_y_pred, color='blue', linewidth=3)

plt.xticks(())
plt.yticks(())

plt.show()
(442, 10)
(442, 1)
Coefficients: 
 [938.23786125]
Mean squared error: 2548.07
Coefficient of determination: 0.47

在这里插入图片描述

1.1.1.1 普通最小二乘复杂度

使用 X X X的奇异值分解来计算最小二乘解,如果 X X X形状为 ( n s a m p l e s , n f e a t u r e s ) (n_{samples}, n_{features}) (nsamples,nfeatures),假定 n s a m p l e s ≥ n f e a t u r e s n_{samples} \ge n_{features} nsamplesnfeatures,则此方法的成本为: O ( n s a m p l e s ⋅ n f e a t u r e s 2 ) O(n_{samples}\cdot n_{features}^2) O(nsamplesnfeatures2)

1.2 岭回归和分类

1.2.1.1 回归

Ridge回归通过对系数的大小进行惩罚来解决普通最小二乘的一些问题。岭回归使得受惩罚的残差平方和最小:
min ⁡ w ∣ ∣ X w − y ∣ ∣ 2 2 + α ∣ ∣ w ∣ ∣ 2 2 (1.3) \underset{w}{\min}||Xw-y||_2^2+\alpha||w||_2^2\tag{1.3} wminXwy22+αw22(1.3)

复杂度参数 α ≥ 0 \alpha \ge 0 α0控制收缩量: α \alpha α值越大,收缩量越大,系数对共线性的鲁棒性越强。(the larger the value of α \alpha α, the greater the amount of shrinkage and thus the coefficients become more robust to collinearity.)

绘制岭系数作为正则化的函数

显示共线性对估计器系数的影响。

Ridge回归是此示例中使用的估计量。每种颜色代表系数矢量的不同特征,并且根据正则化参数进行显示。此示例还显示了将Ridge回归应用于高度病态矩阵(任何一个元素发生一点变动,整个矩阵的行列式的值和逆矩阵都会发生巨大变化)的有用性。对于此类矩阵,目标变量的微小变化可能会导致计算出的权重出现巨大差异。在这种情况下,设置某个正则化(alpha)来减少这种变化(噪声)是很有用的。当alpha很大时,正则化效应将主导平方损失函数,并且系数趋于零。在图像的末尾,随着alpha趋于零且解趋于普通的最小二乘,系数表现出较大的振荡。实际上,有必要以使两者之间保持平衡的方式调整alpha。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model

# X 是10*10的希尔伯特矩阵(X is the 10x10 Hilbert matrix)(希尔伯特矩阵是一种数学变换矩阵,正定,
# 且高度病态(即,任何一个元素发生一点变动,整个矩阵的行列式的值和逆矩阵都会发生巨大变化),病态程度和阶数相关。)
X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
y = np.ones(10)
print(X.shape, y.shape)
# #############################################################################分割线
# 计算路径(Compute paths)

n_alphas = 200
alphas = np.logspace(-10, -2, n_alphas)

coefs = []
for a in alphas:
    ridge = linear_model.Ridge(alpha=a, fit_intercept=False)
    ridge.fit(X, y)
    coefs.append(ridge.coef_)

# #############################################################################分割线
# 结果展示(Display results)

ax = plt.gca()

ax.plot(alphas, coefs)
ax.set_xscale('log')
ax.set_xlim(ax.get_xlim()[::-1])  # reverse axis
plt.xlabel('alpha')
plt.ylabel('weights')
plt.title('Ridge coefficients as a function of the regularization')
plt.axis('tight')
plt.show()
(10, 10) (10,)

在这里插入图片描述

ridge也采用其fit方法拟合数组 X , y X, y X,y,同时存储线性模型的系数 w w w到**coef_**成员中。

# 设置一个单元格输出多个变量
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = 'all'
from sklearn import linear_model
reg = linear_model.Ridge(alpha=.5)
reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
# Ridge(alpha=0.5)
reg.coef_
# array([0.34545455, 0.34545455])
reg.intercept_
Ridge(alpha=0.5, copy_X=True, fit_intercept=True, max_iter=None,
      normalize=False, random_state=None, solver='auto', tol=0.001)






array([0.34545455, 0.34545455])






0.1363636363636364

1.2.1.2 分类

该Ridge回归具有分类变体 RidgeClassifier。该分类器首先将二进制目标转换到{-1, 1} ,然后将问题视为回归任务,从而优化了与上述目标相同的目标。预测类对应于回归器预测的符号。对于多类分类,将问题视为多输出回归,而预测的类对应于具有最高值的输出。

使用(最小化)最小二乘损失拟合分类模型而不是更传统的逻辑或铰链损失似乎是有问题的。然而,实际上,所有这些模型都可以在准确性或精确度/召回率方面得出相似的交叉验证得分,而RidgeClassifier使用的惩罚最小二乘损失则允许选择具有不同计算性能曲线的数值求解器进行非常不同的选择。
RidgeClassifier在处理具有高数量的类类别中比 LogisticRegression快很多,因为它只计算投影矩阵 ( X T X ) − 1 X T (X^TX)^{-1}X^T (XTX)1XT一次。

该分类器有时被称为带有线性核的最小二乘支持向量机。

1.2.1.3 岭回归复杂度

此方法的复杂度与普通最小二乘法相同。

RidgeCV通过alpha参数的内置交叉验证实现岭回归。该对象的工作方式与GridSearchCV相同,不同之处在于它默认为通用交叉验证(GCV),一种有效的留一法交叉验证形式:

import numpy as np
from sklearn import linear_model
reg = linear_model.RidgeCV(alphas=np.logspace(-6, 6, 13))
reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
# RidgeCV(alphas=array([1.e-06, 1.e-05, 1.e-04, 1.e-03, 1.e-02, 1.e-01, 1.e+00, 1.e+01,
#       1.e+02, 1.e+03, 1.e+04, 1.e+05, 1.e+06]))
reg.alpha_

RidgeCV(alphas=array([1.e-06, 1.e-05, 1.e-04, 1.e-03, 1.e-02, 1.e-01, 1.e+00, 1.e+01,
       1.e+02, 1.e+03, 1.e+04, 1.e+05, 1.e+06]),
        cv=None, fit_intercept=True, gcv_mode=None, normalize=False,
        scoring=None, store_cv_values=False)






0.01

指定cv属性的值将触发使用交叉验证与GridSearchCV,例如cv=10,使用的是10折交叉验证,而不是通用交叉验证。

1.1.3 套索

Lasso是用于估计稀疏系数的线性模型。由于它倾向于使用具有较少非零系数的解决方案的趋势,因此在某些情况下很有用,可有效减少给定解决方案所依赖的特征数量。因此,套索及其变体对于压缩感测领域至关重要。在某些条件下,它可以恢复非零系数的确切集合(请参阅 压缩感测:使用L1先验(Lasso)进行的层析成像重建)。

从数学上讲,它由带有正则化项的线性模型组成。最小化的目标函数是:

min ⁡ w 1 2 n s a m p l e s ∣ ∣ X w − y ∣ ∣ 2 2 + α ∣ ∣ w ∣ ∣ 1 (1.4) \underset{w}{\min}\cfrac{1}{2n_{samples}}||Xw-y||_2^2+\alpha||w||_1\tag{1.4} wmin2nsamples1Xwy22+αw1(1.4)

套索估计通过加上 α ∣ ∣ w ∣ ∣ 1 \alpha||w||_1 αw1解决实现了最小二乘罚项的最小化 ,前面 α \alpha α是一个常数,此处 ∣ w ∣ 1 |w|_1 w1是一个 ℓ 1 \ell_1 1系数向量的范数。

这里的实现使用的是:坐标下降来拟合参数,

from sklearn import linear_model
reg = linear_model.Lasso(alpha=0.1)
reg.fit([[0, 0], [1, 1]], [0, 1])

reg.predict([[1, 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)






array([0.8])

关于坐标下降求解器中的迭代,以及用于收敛控制的对偶间隙计算,参考文献如下:

[1]“Regularization Path For Generalized linear Models by Coordinate Descent”, Friedman, Hastie & Tibshirani, J Stat Softw, 2010 (Paper).

[2] “An Interior-Point Method for Large-Scale L1-Regularized Least Squares,” S. J. Kim, K. Koh, M. Lustig, S. Boyd and D. Gorinevsky, in IEEE Journal of Selected Topics in Signal Processing, 2007 (Paper)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值