这里重点学习一下回归算法
![image.png](https://img-blog.csdnimg.cn/img_convert/2f58b529d7d93bbf6b48f3c1a4de8793.png#clientId=u5bee9120-247f-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=304&id=u4452b774&margin=[object Object]&name=image.png&originHeight=304&originWidth=450&originalType=binary&ratio=1&rotation=0&showTitle=false&size=53348&status=done&style=none&taskId=u3851b853-50e0-48a2-a098-b603878fff9&title=&width=450)
根据使用场景不同,有可以划分为三大类
监督学习是根据已知的方法和规律,对新样本进行分类和预测。
监督学习就好比学生在学校学习各种知识和理论的过程。整个过程是在老师的监督下完成,所学知识的应用体现在平时的测试中,并且可以通过对比“标准”答案来不断改进和巩固学习成果,在下一次的测试中取得更好的成绩(预测效果)。根据目的不同,可以有分类和回归(预测)两种:
非监督学习与监督学习正好相反,在过程中并不清楚有哪些特征标签,而是通过对样本的观察、分析和总结,去发现其中的特征,从看似杂乱无章的数据中发现共性。然后对新样本进行归类。
归类/聚类(clustering)—— 对大量看似无特征的样本进行分类。
经常会说非监督学习是归类或聚类(clustering)。与分类不同,聚类在划分之前并不知道有哪些类别,以及类别的特征,而是通过对样本的各种特征进行分析,将相似的样本划分为一组,进行“物以类聚”的划分。是一个从无到有的发现过程。
介于监督和非监督学习之间。是基于监督学习获得理论和知识,对非监督学习的样本(无特征标签)进行分类。可以理解为我们走出学校以后根据在课堂上学到的知识和理论,对生活中遇到的事物进行分类和预测。
Scikit-learn是一个用于Python的免费开源机器学习库。
机器学习的本质就是让机器使用特定的算法对输入数据进行类似人的智能学习(找规律),根据同样的模型对新样本进行进行预测。具体到python中的sklearn,是通过一下三大步骤实现的。
![image.png](https://img-blog.csdnimg.cn/img_convert/478368d184a7fd370f466e9c86165377.png#clientId=u35127f2c-c93a-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=662&id=ub44cc5c2&margin=[object Object]&name=image.png&originHeight=1323&originWidth=2122&originalType=binary&ratio=1&rotation=0&showTitle=false&size=947070&status=done&style=none&taskId=u2b053fd0-4a43-435e-8fc4-e91720b522f&title=&width=1061)
sklearn中内置了常用的机器学习算法和模型,以及基本的预处理方法。分别由**预测(估计)器(estimator)和预处理器(preprocessing)**实现,并且它们继承自同一个基础预测器。
预处理器和转换器主要负责对原始数据的预处理和转换,从而消除不同数据之间的绝对差异。
from sklearn.preprocessing import StandardScaler
# ...
# X = [...]
StandardScaler().fit().transform(X)
sklearn中提供的数十种内置机器学习算法和模型,都通过估算器提供。可以通过引入相应的估算器来使用对应的模型。
from sklearn.ensemble import RandomForestClassifier
# 初始化估算器
clf = RandomForestClassifier(random_state=0)
# 使用训练数据进行模型拟合
clf.fit(X, y)
# 预测
clf.predict(...) #
管道用来将转换器和预测器组合成一个同一的对象,表示一个完整的数据流处理过程(管道)。然后使用管道的fit和predict来进行训练和预测。同时,使用管道还可以防止数据泄露。
from sklearn.preprocessing import StandardScaler # 预处理器
from sklearn.linear_model import LogisticRegression # 预测器
from sklearn.pipeline import make_pipeline # 管道
# 创建管道
pipe = make_pipeline(
StandardScaler(),
LogisticRegression(random_state=0)
)
#准备数据...
# 像使用预测器一样使用管道
# 1) 训练整个pipeline
pipe.fit(X_train, y_train)
# 2) 使用管道预测
pipe.predict(X_test)
# ...
针对不同类型的算法和模型,对应评估指标也不相同。
回归算法的核心思想是评估预测值和观察值之间的误差。从最原始的残差(residual)到基于残差的各种变形,以便后续的数学运算和处理。
相比较回归算法的各种残差指标,分类算法更多的则是关注分类的精度,即预测正确的样本数量占总预测样本的比例。然后,预计不同的场景,从不同角度来看精度对结果的影响。
关于各个指标的详细说明,可以参考知乎——机器学习评估指标。
所有预测器都有可以调整的参数,也叫超参数。其特指不能通过学习得到的参数。在使用各种不同模型时,需要将超参数作为参数传递给预测器。
sklearn中提供了在参数集中搜索最佳超参数的方法,其基于最佳交叉验证(CV, Cross-Validation)分数获取对应的超参数。sklearn中最简单的方法是调用cross_val_score函数。
估算器中的任意参数都可以通过参数搜索来获得最佳参数。
参数搜索的基本要素
sklearn中两种抽样搜索最佳参数的方法:
计算参数集中所有参数的组合。GridSearchCV通过使用param_grid参数来指定参数候选值。
例如下边的例子指定搜索两个参数候选值。通过GridSearchCV的fitting接口拟合后,会对所有候选参数进行评估,保留最优参数组合。
# 选择模型
clf = ...
# 指定网格搜索的参数
param_grid = [
{'C': [1, 10, 100, 1000], 'kernel': ['linear']},
{'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
]
# 运行网格搜索
grid_search = GridSearchCV(clf, param_grid=param_grid)
# ...
grid_search.fit(X, y)
从具有制定分布的参数空间中抽样出定量的参数候选。RandomizedSearchCV会在指定范围内,使用某个特定分布抽取参数值进行评估。用字典形式来指定参数的具体抽样范围,针对每一个参数,可以指定
例子
# 选择模型
clf = ...
# RandomizedSearchCV 参数设置示例
param_dist = {
'C': scipy.stats.expon(scale=100), # 取值分布
'gamma': scipy.stats.expon(scale=.1),
'kernel': ['rbf'], # 离散列表
'class_weight':['balanced', None] # 离散列表
}
# 运行随机搜索
n_iter_search = 20
random_search = RandomizedSearchCV(clf, param_distributions=param_dist,
n_iter=n_iter_search)
# ...
random_search.fit(X, y)
参数搜索默认使用估计器的score函数来评估参数的设置。默认为
当然,sklearn还提供了其它一些评估函数可供不从场景使用。同时,也可以将多种评估指标结合起来使用。
从sklearn模型流程可以很清楚得看到回归算法的使用场景。
![image.png](https://img-blog.csdnimg.cn/img_convert/6496b061a2d99c9d00a9e8e5ab14c0a6.png#clientId=u35127f2c-c93a-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=251&id=u408eadf1&margin=[object Object]&name=image.png&originHeight=884&originWidth=1378&originalType=binary&ratio=1&rotation=0&showTitle=false&size=385245&status=done&style=none&taskId=u53cf04fe-fc69-4ea8-a6c1-e6402c87324&title=&width=391)
使用场景
然后根据样本数据数据和特征标签的特点选择对应的算法
在搞清楚线性回归之前,我们首先要弄明白什么是回归分析。在统计学中,是指确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。
按照涉及的变量多少,可以分为一元回归和多元回归;按照因变量的多少,可分为简单回归分析和多重回归分析;按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。
线性回归假设目标值(因变量)是特征值(自变量)的线性组合。线性回归使用最佳的拟合直线在因变量( Y Y Y)和一个或多个自变量( X X X)之间建立一种关系。因变量是连续的,自变量可以是连续的也可以是离散的,回归线的性质是线性的。
在数学中,即为由特征值组成的多元一次方程。
Y = b + w 1 x 1 + . . . + w p x p + ϵ Y=b+w_1x_1+...+w_px_p+\epsilon Y=b+w1x1+...+wpxp+ϵ
如果将自变量表示为 X = ( x 1 , . . . x p ) X=(x_1,...x_p) X=(x1,...xp),系数表示为 W = ( w 1 , . . . , w p ) W=(w_1, ..., w_p) W=(w1,...,wp),就能明白为什么它叫线性回归了。
Y = b + W T X + ϵ Y=b+W^TX+\epsilon Y=b+WTX+ϵ
其中 W W W是回归线的斜率, w 0 w_0 w0则表示回归线在Y轴上的截距, ϵ \epsilon ϵ表示误差项。
上边的表示中,我们默认自变量和因变量都是多元的。这里我们限制因变量的个数为一个,则可以直接表示为
y = b + W T X + ϵ y=b+W^TX+\epsilon y=b+WTX+ϵ
线性回归就是通过各种算法去找到这样一个多元一次方程 y ^ ( x ) = b + w X \hat{y}(x)=b+wX y^(x)=b+wX,使其尽量接近观真实值 y y y(残差 ϵ \epsilon ϵ尽量小)。而拟合的过程,就是去不断优化和估计方程的斜率系数,所以也叫“回归系数(coefficient)”。
这里要注意模型偏差bias和**残差(噪声)**的区别。
那么,如何衡量预测的准确性,即衡量预测值 y ^ ( x ) \hat{y}(x) y^(x)与真实值 y y y之间的差异呢?最直观的方法就是看真实值和预测值之间的差(残差)。回归模型的目的就是使模型预测出来的值无限接近真实值(测量值)。
ϵ ^ = y − y ^ ( x ) \hat{\epsilon} = y - \hat{y}(x) ϵ^=y−y^(x)
但是在实际预测中,残差值有正有负,不可能直接使用残差之和最小的方式来衡量一种方法的好坏。
因此,整个回归问题的本质,就是使用均方误差,求使 D D D最小时的 W W W和 d d d。
D = E ( y − y ^ ( x ) ) 2 D=E(y-\hat{y}(x))^2 D=E(y−y^(x))2
由于残差本身有正有负,故可以使用平方和来避免正负抵消问题。
d i s t ( P i , P j ) = ∑ k = 1 n ( P i k − P j k ) 2 dist(P_i, P_j) = \sum_{k=1}^n(P_ik-P_jk)^2 dist(Pi,Pj)=∑k=1n(Pik−Pjk)2
问题:
为了解决误差平方和的问题,我们可以使用欧式距离。
d i s t ( P i , P j ) = ∑ k = 1 n ( P i k − P j k ) 2 dist(P_i, P_j) = \sqrt{\sum_{k=1}^n(P_ik-P_jk)^2} dist(Pi,Pj)=∑k=1n(Pik−Pjk)2
问题:
曼哈顿距离直接使用绝对值来消除根号开方的求解麻烦问题。
d i s t ( P i , P j ) = ∑ k = 1 n ∣ P i k − P j k ∣ dist(P_i, P_j) = \sum_{k=1}^n\vert P_ik-P_jk\vert dist(Pi,Pj)=∑k=1n∣Pik−Pjk∣
问题:
适合场景:数据稀疏(自带归一化处理)
马氏距离是对欧式距离的另外一种修正,修正了欧氏距离中各个维度尺度不一致且相关的问题。
d i s t ( P i , P j ) = ( P i k − P j k ) T Σ − 1 ( P i k − P j k ) dist(P_i, P_j) = \sqrt{(P_ik-P_jk)^T\Sigma^{-1}(P_ik-P_jk)} dist(Pi,Pj)=(Pik−Pjk)TΣ−1(Pik−Pjk)
马氏距离已经不像前边的几种那么好理解,具体推导过程可以参考马氏距离。总之,其较好的解决了不同维度尺度不一致且相关的问题。
其它还有一些距离如汉明距离(Hamming Distance)、编辑距离(Levenshtein Distance)等,这里不做一一说明。
最小二乘法直接使用残差的平方和作为衡量标准,通过拟合 W W W使残差 ϵ \epsilon ϵ的平方和最小。数学上表示为下边的形式:
m i n ∥ X w − y ∥ 2 2 min{\Vert Xw-y\Vert _2^2} min∥Xw−y∥22
![image.png](https://img-blog.csdnimg.cn/img_convert/d0c3002ba1d041e6be8c62cb632b4f64.png#clientId=u21aa29a4-be78-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=240&id=u4b140a9b&margin=[object Object]&name=image.png&originHeight=480&originWidth=640&originalType=binary&ratio=1&rotation=0&showTitle=false&size=16055&status=done&style=none&taskId=u8ca7bced-72e2-4a40-9fbd-7e1386524b6&title=&width=320)
在sklearn的线性回归模型LinearRegression中,使用 f i t ( ) fit() fit()函数拟合模型,并在模型的coef_中存储拟合后的相关系数 w w w。
import numpy as np
from sklearn import datasets, linear_model
# ...准备数据,选择特征列,拆分训练、测试数据集..
# 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)
# 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))
# The coefficient of determination: 1 is perfect prediction
print("Coefficient of determination: %.2f" % r2_score(diabetes_y_test, diabetes_y_pred))
在最小二乘法法返回的系数中,默认是不会对系数的正负进行限制的。但是在实际问题中,很多时候我们需要所有的相关系数非负,例如频次、商品价格等。这时候可以直接设置LinearRegression的positive参数为True来限制相关系数的正负。
from sklearn.linear_model import LinearRegression
reg_nnls = LinearRegression(positive=True)
y_pred_nnls = reg_nnls.fit(X_train, y_train).predict(X_test)
r2_score_nnls = r2_score(y_test, y_pred_nnls)
print("NNLS R2 score", r2_score_nnls)
问题
普通最小二乘的系数估计依赖于特征的独立性。当特征相关且设计矩阵的列之间具有近似线性相关性时, 设计矩阵趋于奇异矩阵,最小二乘估计对观测目标的随机误差高度敏感,可能产生很大的方差。例如,在没有实验设计的情况下收集数据时,就可能会出现这种多重共线性的情况。
过拟合和欠拟合是使用实际数据进行分析时可能会遇到的两种基本问题。
![image.png](https://img-blog.csdnimg.cn/img_convert/b6faa6bc3c5d1428f48a67ceede6b7b0.png#clientId=u21aa29a4-be78-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=126&id=lBmXy&margin=[object Object]&name=image.png&originHeight=252&originWidth=735&originalType=binary&ratio=1&rotation=0&showTitle=false&size=13524&status=done&style=none&taskId=u4de5531d-82e5-408a-82fb-0cc2a39a43e&title=&width=367.5)
欠拟合出现的原因是模型复杂度太低,比如自变量太少等。针对欠拟合,要做的就是增大模型复杂度,增加自变量,或者改变模型(线性到非线性)等。
过拟合的原因是模型复杂度太高,或者训练数据集太少,比如自变量过多等。针对过拟合,除了增加训练集数据外,正则化就是常用的一种处理方法。
关于正则化的更多详细理解可以参考深入理解L1、L2正则化,以及机器学习中正则化项L1和L2的直观理解。
针对最小二乘法存在的一下问题,岭回归则计算一个带惩罚项的残差平方和。
m i n ∥ X w − y ∥ 2 2 + α ∥ w ∥ 2 2 min{\Vert Xw-y\Vert _2^2}+\alpha\Vert w \Vert _2^2 min∥Xw−y∥22+α∥w∥22
其中 ∥ w ∥ 2 2 \Vert w \Vert _2^2 ∥w∥22为回归系数向量的L2范数(所有参数的平方和)。使用复杂度参数 α ≥ 0 \alpha \ge0 α≥0来控制收缩程度:值越大,收缩程度越大,对应的回归系数对共线性的容忍程度也就越大。至于为什么L2正则化能防止过拟合,可以参考深入理解L1、L2正则化。
![image.png](https://img-blog.csdnimg.cn/img_convert/5e50ad1a7b10c1ecfa5043b930eb04ca.png#clientId=u21aa29a4-be78-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=240&id=u0879ddae&margin=[object Object]&name=image.png&originHeight=480&originWidth=640&originalType=binary&ratio=1&rotation=0&showTitle=false&size=50003&status=done&style=none&taskId=u3f6b9f9d-f927-4420-b103-7b6dbaa26c2&title=&width=320)
在sklearn中,可以通过指定alpha参数来设定 α \alpha α。
from sklearn import linear_model
# 指定alpha的岭回归
reg = linear_model.Ridge(alpha=.5)
# 拟合
reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
# ...
Lasso回归与Ridge岭回归类似,都是在普通最小二乘法基础上的正则化处理。目标函数在数学上表示为
m i n 1 2 n s a m p l e ∥ X w − y ∥ 2 2 + α ∥ w ∥ 1 min{\frac1{2n_{sample}}\Vert Xw-y\Vert _2^2}+\alpha\Vert w \Vert_1 min2nsample1∥Xw−y∥22+α∥w∥1
其中 ∥ w ∥ 1 \Vert w \Vert _1 ∥w∥1为回归系数向量的L1范数(所有参数绝对值之和)。
特征选取就是对样本进行稀疏表示的过程。而Lasso正好就是估计稀疏系数的线性模型,因为它倾向于给出非零系数较少的解,从而有效地减少了给定解所依赖的特征数。至于为什么L1正则化能减少给定解所依赖的特征数,可以参考深入理解L1、L2正则化。
所以说,Lasso 及其变体是压缩感知领域的基础。关于稀疏表示,参考 机器学习基础——稀疏表示。
稀疏表示
任意一个信号都可以在一个过完备字典上稀疏线性表出。这样,一个信号被分解为有限个信号的线形组合的形式我们称之为稀疏表示。表达为公式为:
y = D_α_ s.t.||α||0 < σ
弹性网络回归是一个综合了Ridge回归和Lasso回归两种惩罚因数的单一模型:一个因素与L1范数成比例,另外一个因数与L2范数成比例。其目标函数表示为
m i n 1 2 n s a m p l e ∥ X w − y ∥ 2 2 + α β ∥ w ∥ 1 + α ( 1 − β ) 2 ∥ w ∥ 2 2 min{\frac1{2n_{sample}}\Vert Xw-y\Vert _2^2}+\alpha\beta\Vert w \Vert_1+\frac{\alpha(1-\beta)}{2} \Vert w \Vert_2^2 min2nsample1∥Xw−y∥22+αβ∥w∥1+2α(1−β)∥w∥22
从上边的公式可以看出,ElasticNet使用时需要提供 α \alpha α和 β \beta β两个参数。其中 β \beta β的参数名称为l1_ratio。
当多个特征存在相关时,弹性网是很有用的。Lasso很可能随机挑选其中之一,而弹性网则可能兼而有之。
主要用于预估正则化参数:正则化参数不是应意义上的设置,而是根据数据进行调整。
在实际应用中,特征数量往往非常多,其中即包含了我们需要的与目标相关的特征,也有一些完全不相关的特征,并且特征之间也可能存在相互依赖。这会导致对应的模型就越复杂,模型训练和预测需要的计算量就越大,同时也会影响算法的预测能力。
特征选取就是从大量的特征中选取一个特征子集,构造出更好的模型(如残差最小)。
特征选择分为产生、评估、验证三大步骤,如下图。
![image.png](https://img-blog.csdnimg.cn/img_convert/7e36abde0a778c84516a3c09e3860ad5.png#clientId=u0613ca18-f5a9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=128&id=u53f211f5&margin=[object Object]&name=image.png&originHeight=255&originWidth=657&originalType=binary&ratio=1&rotation=0&showTitle=false&size=19594&status=done&style=none&taskId=u4bcce21d-3396-431c-b1f6-56fba0e55a6&title=&width=328.5)
特征选择的过程 ( M. Dash and H. Liu 1997 )
特征产生过程是搜索特征子空间的过程。分为一下3大类
完全搜索又分为穷举搜索(Exhaustive)和非穷举(Non-Exhaustive)两类。
评价函数
针对高位数据,最小角回归LARS算法首先是一种逐步向前回归。在逐步向前的每一步中,它都会找到与目标最相关的特征。当特征具有相等的相关性时,它不是沿着相同的特征继续进行,而是沿着特征之间等角的方向进行。
参考LeastAngle_2002.pdf了解更多最小角回归算法的更多细节。
LarsLasso是利用LARS算法实现的LASSO模型,与基于坐标下降的LASSO模型不同,它得到的是分段线性的精确解,是其自身系数范数的函数。
![image.png](https://img-blog.csdnimg.cn/img_convert/da0c0ec2ffbd18f6be733685e29309e1.png#clientId=udf5c4bc4-57b9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=187&id=gBERK&margin=[object Object]&name=image.png&originHeight=373&originWidth=509&originalType=binary&ratio=1&rotation=0&showTitle=false&size=54863&status=done&style=none&taskId=u2cf2312c-ee09-4e3d-a647-69847784a64&title=&width=254.5)
一种类似于最小角回归的前向特征选择方法,正交匹配追踪可以用固定数目的非零元素逼近最优解向量。或者,正交匹配追踪可以针对特定的误差,而不是特定数目的非零系数。
参考 KSVD-OMP-v2.pdf。
随机梯度下降是一种简单而又非常有效的拟合线性模型的方法。当样本数量(和特性数量)非常大时,它特别有用。
Perceptron 是另一种适用于大规模学习的简单分类算法。有如下默认:
最后一个特点意味着Perceptron的训练速度略快于带有合页损失(hinge loss)的SGD,因此得到的模型更稀疏。
被动感知算法是一种大规模学习的算法。和感知机相似,因为它们不需要设置学习率。然而,与感知器不同的是,它们包含正则化参数 C 。
广义线性模型(GLM)以两种方式扩展了线性模型。
首先是预测值 y ^ \hat y y^是否通过反向连接函数 h h h连接到输入变量 X X X的线性组合。
y ^ ( w , X ) = h ( X w ) \hat y(w, X) = h(Xw) y^(w,X)=h(Xw)
其次,平方损失函数被一个指数分布的单位偏差 d d d所代替 (更准确地说,一个再生指数离散模型(EDM) )。最小化问题变成
min w 1 2 n s a m p l e s ∑ i d ( y i , y i ^ ) + α 2 ∥ w ∥ 2 \min_w \frac{1}{2n_{samples}} \sum_i d(y_i, \hat{y_i}) + \frac{\alpha}{2}\|w\|_2 minw2nsamples1∑id(yi,yi^)+2α∥w∥2
α \alpha α是L2正则化惩罚项。提供样本权重后,平均值即为加权平均值。
![image.png](https://img-blog.csdnimg.cn/img_convert/b1f081adcb0f177d6a90f30a257cdad3.png#clientId=udf5c4bc4-57b9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=191&id=u1d3c0a97&margin=[object Object]&name=image.png&originHeight=382&originWidth=913&originalType=binary&ratio=1&rotation=0&showTitle=false&size=63616&status=done&style=none&taskId=u8e4ceb0d-9694-41c7-bda9-cb6d7800266&title=&width=456.5)
TweedieRegressor为Tweedie分布实现了一个广义线性模型,该模型允许使用适当的 p o w e r power power参数对上述任何分布进行建模。
分配方式的选择取决于手头的问题: