scikit-learn学习(一)

分类

监督学习

普通最小二乘法

LinearRegression拟合一个带有系数$w=(w_1,…,w_p)$的线性模型,使得数据集实际观测数据和预测数据(估计值)之间的残差平方和最小。其数学表达式:

sklearn_1
代码:

1
2
3
4
5
6
from sklearn import linear_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])

LinearRegression会调用fit方法来拟合数组X,y,并且将线性模型的系数w存储在其成员变量coef_中。

普通最小二乘法复杂度:该方法使用X的奇异值分解来计算最小二乘法。如果X是一个size为(n,p)的矩阵,设n≥p,则该方法的复杂度为$O(np^2)$

岭回归

其实就是加了L2正则化的最小二乘法。

其中,α≥0是控制系数收缩量的复杂性参数。

1
2
3
4
5
6
7
8
9
>>> 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, 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...

与其他线性模型一样,Ridge用fit方法将模型系数w存储再其coef_成员中。
岭回归的复杂度与普通最小二乘法相同都为$O(np^2)$

在linear_model下还有一个RidgeCV函数,它是用于岭回归的交叉验证的。对于参数α的交叉验证

1
2
3
4
5
6
7
>>> 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, .1, 1])
RidgeCV(alphas=[0.1, 1.0, 10.0], cv=None, fit_intercept=True, scoring=None,
normalize=False)
>>> reg.alpha_
0.1

Lasso

Lasso是估计系数系数的线性模型。实则为L1正则项的最小二乘法。
它倾向于稀疏化参数。Lasso及其变体是压缩感知领域的基础。

lasso estimate 解决了加上惩罚项$α||w||_ 1$的最小二乘法的最小化。
这里α能控制系数的稀疏度。

1
2
3
4
5
6
7
8
>>> from sklearn import linear_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])

多任务Lasso

y是一个(n_samples,n_tasks)的二维数组,其约束条件和其他回归问题是一样的,都是所选的特征值。
在数学上,它由一个线性模型组成,以混合$l_1,l_2$作为正则化器进行训练。目标函数最小化是:

其中Fro表示Frobenius标准:

并且$l_1,l_2$读取为:

下面是一个拟合时间列的模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import matplotlib.pyplot as plt
import numpy as np

from sklearn.linear_model import MultiTaskLasso, Lasso

rng = np.random.RandomState(42)

# Generate some 2D coefficients with sine waves with random frequency and phase
n_samples, n_features, n_tasks = 100, 30, 40
n_relevant_features = 5
coef = np.zeros((n_tasks, n_features))
times = np.linspace(0, 2 * np.pi, n_tasks)
for k in range(n_relevant_features):
coef[:, k] = np.sin((1. + rng.randn(1)) * times + 3 * rng.randn(1))

X = rng.randn(n_samples, n_features)
Y = np.dot(X, coef.T) + rng.randn(n_samples, n_tasks)

coef_lasso_ = np.array([Lasso(alpha=0.5).fit(X, y).coef_ for y in Y.T])
coef_multi_task_lasso_ = MultiTaskLasso(alpha=1.).fit(X, Y).coef_

###############################################################################
# Plot support and time series
fig = plt.figure(figsize=(8, 5))
plt.subplot(1, 2, 1)
plt.spy(coef_lasso_)
plt.xlabel('Feature')
plt.ylabel('Time (or Task)')
plt.text(10, 5, 'Lasso')
plt.subplot(1, 2, 2)
plt.spy(coef_multi_task_lasso_)
plt.xlabel('Feature')
plt.ylabel('Time (or Task)')
plt.text(10, 5, 'MultiTaskLasso')
fig.suptitle('Coefficient non-zero location')

feature_to_plot = 0
plt.figure()
plt.plot(coef[:, feature_to_plot], 'k', label='Ground truth')
plt.plot(coef_lasso_[:, feature_to_plot], 'g', label='Lasso')
plt.plot(coef_multi_task_lasso_[:, feature_to_plot],
'r', label='MultiTaskLasso')
plt.legend(loc='upper center')
plt.axis('tight')
plt.ylim([-1.1, 1.1])
plt.show()

这里有一篇介绍多任务学习,之后我也将试着写一篇。

弹性网络

这是一种使用L1,L2范数用来训练的线性回归模型。这种组合允许学习到一个只有少量参数是非零稀疏的模型,就像Lasso一样,但是它仍然保持一些像Ridge的正则性质。我们可以用l1_ratio参数控制L1和L2的凸组合。
弹性网络在很多特征互相联系的情况下是非常有用的。Lasso很可能只是随机考虑这些特征中的一个,而弹性网络更倾向于选择两个。
在实践中,Lasso和Ridge之间权衡的一个优势是它允许在循环过程中继承Ridge的稳定性。
在这里,最小化的目标函数是:

ElasticNetCV类可以通过交叉验证来设置参数:alpha(α)和l1_ratio(\rho)

多任务弹性网络

MultiTaskElasticNet 是一个对多回归估算稀疏参数的弹性网络:Y是一个二维数组,形状是(n_samples,n_task).其限制条件是和其他回归问题一样,是选择的特征,也称为tasks.
从数学上来说,它包含了一个混合的$l_1,l_2$先验和$l_2$先验为正则项训练的线性模型,目标函数就是最小化:

在MultiTaskElasticNet类中的实现采用了坐标下降法求解参数。
在MultiTaskElasticNetCV中可以通过交叉验证来设置参数alpha(α)和l1_ratio($\rho$)

最小角回归

最小角回归(LARS)是对高维数据的回归算法。LARS和逐步回归很像。在每一步,它寻找与响应最有关联的预测。当有很多预测有相同的关联时,它没有继续利用相同的预测,而实在这些预测中找出应该等角的方向。
LARS的优点:

  • 当p>>n,该算法数值运算上非常有效。(例如当维度的数目远超过点的个数)
  • 它在计算上和前向选择一样快,普通最小二乘法有相同的运算复杂度
  • 它产生了一个完整的分段线性的解决路径,在交叉验证或者其他相似的微调模型的方法上非常有用
  • 如果两个变量对响应几乎有相等的联系,则它们的系数应该有相似的增长率。因此这个算法和我们直觉上的判断一样,而且还更加稳定
  • 它很容易修改为其他估算器生成解,比如Lasso.
    LARS的缺点:
  • 因为LARS是建立在循环拟合剩余变量上的,所以他对噪声非常敏感
-------------本文结束感谢您的阅读-------------

本文标题:scikit-learn学习(一)

文章作者:Yif Du

发布时间:2018年11月19日 - 01:11

最后更新:2019年02月28日 - 16:02

原始链接:http://yifdu.github.io/2018/11/19/scikit-learn学习(一)/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。