1. 机器学习的一些概念
2. 线性回归的原理
3. 线性回归损失函数、代价函数、目标函数
4. 优化方法(梯度下降法、牛顿法、拟牛顿法等)
5. 线性回归的评估指标
6. sklearn参数详解
附:代码
(如有错误,感谢指出!)
有监督:对已知结果集的数据集进行学习,结果集对训练有指导意义。如:线性回归、决策树等 。
无监督:对未知结果集的数据集进行学习。如:kmeans、dbscan等。
泛化能力:已学得的模型适应新样本的能力,评判一个学习算法的好坏。
过拟合:把训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质。
欠拟合:对训练样本的一般性质尚未学好。
方差:度量了同样大小的训练集的变动所导致的学习性能的变化,即数据扰动所造成的影响。
偏差:度量了学习算法的期望预测与真实结果的偏离程度,即学习算法本身的拟合能力。
注意: 一般来说,偏差与方差是有冲突的,称为偏差-方差窘境。假定我们能控制学习算法的训练程度:
在训练不足时,拟合能力不强(欠拟合)数据扰动性小,方差小、偏差大,即此时偏差主导了泛化错误率;
当训练加深,拟和能力逐渐增强,扰动性渐渐被学到,方差变大、偏差变小,即方差逐渐主导了泛化错误率;
在训练充足后,训练数据轻微的扰动都会导致学习器显著变化,方差主导了泛化错误率。若训练数据特有的特性被学习到了,则将发生过拟合。
很多学习算法都可以控制训练程度(恰当拟合),如决策树可控制层数,神经网络可控制训练轮数,集成学习方法可控制基学习器个数。
交叉验证:将数据集划分为k个大小相似且互斥的子集,每个子集都尽可能保持数据分布的一致性。每次用k - 1个子集的并集作为训练集,余下的那个子集作为测试集,即可获得k组训练/测试集。又称“k折交叉验证”。
线性模型(linear model):学得一个通过属性的线性组合来进行预测的函数。给定由d个属性描述的示例x = (x1;x2;x3;…;xd),其中xi是x在第i个属性上的取值,有
f ( x ) = w 1 x 1 + w 2 x 2 + . . . + w d x d + b , f(x) = w_1x_1 + w_2x_2+...+w_dx_d+b, f(x)=w1x1+w2x2+...+wdxd+b,一般用向量形式写成
f ( x ) = w T x + b f(x) = w^Tx+b f(x)=wTx+b 其中w = (w1;w2;w3;…;w4)。w和b学得之后,模型就得以确定。
线性回归(linear regression)试图学得一个线性模型以尽可能准确地预测实值输出标记,即 f ( x i ) = w T x i + b , 使 得 f ( x i ) ≈ y i . f(x_i) = w^Tx_i+b,使得f(x_i)\approx y_i. f(xi)=wTxi+b,使得f(xi)≈yi.
损失函数:指单个样本的预测值与真实值之间的误差。
代价函数:指训练集上所有样本误差的均值,即“均方误差”, E ( f ; D ) = 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2 E(f;D)=\frac{1}{m}\sum_{i=1}^m(f(x_i)-y_i)^2 E(f;D)=m1i=1∑m(f(xi)−yi)2均方误差有非常好的几何意义,它对应了欧几里得距离或简称“欧氏距离”(Euclidean distance)。
目标函数:让经验风险最小化和结构风险最小化,代价函数 + 正则化项( λ J ( f ) \lambda J(f) λJ(f),学习算法的归纳偏好)。
求解过程:使均方误差最小化,即
( w ∗ , b ∗ ) = a r g min ( w , b ) ∑ i = 1 m ( y i − w x i − b ) 2 (w^*,b^*)=arg\smash{\displaystyle\min_{(w,b)}}\sum_{i=1}^m(y_i-wx_i-b)^2 (w∗,b∗)=arg(w,b)mini=1∑m(yi−wxi−b)2 w ∗ , b ∗ w^*,b^* w∗,b∗表示w和b的解。
使用最小二乘法,对w和b求导,且令求导后式子为零,即可得到w和b最优解的闭式(closed-form)解 w = ∑ i = 1 m ( x i − x ‾ ) ( y i − y ‾ ) ∑ i = 1 m ( x i − x ‾ ) 2 w=\frac{\sum_{i=1}^m(x_i-\overline{x})(y_i-\overline{y})}{\sum_{i=1}^m(x_i-\overline{x})^2} w=∑i=1m(xi−x)2∑i=1m(xi−x)(yi−y) b = y ‾ − w x ‾ b=\overline{y}-w\overline{x} b=y−wx 其中 x ‾ = 1 m ∑ i = 1 m x i \overline{x}=\frac{1}{m}\sum_{i=1}^{m}x_i x=m1∑i=1mxi为x的均值, y ‾ = 1 m ∑ i = 1 m y i \overline{y}=\frac{1}{m}\sum_{i=1}^{m}y_i y=m1∑i=1myi为y的均值。
以上是一元线性回归的解决方案,对于更一般的多元线性回归情况
E w ^ = ( y − X w ^ ) T ( y − X w ^ ) E_{\hat{w}}=(y-X\hat{w})^T(y-X\hat{w}) Ew^=(y−Xw^)T(y−Xw^) 其中 w ^ = ( w ; b ) \hat{w}=(w;b) w^=(w;b)。
当 X T X X^TX XTX为满秩矩阵或正定矩阵时,另对 w ^ \hat{w} w^求导式为零,解得: w ^ ∗ = ( X T X ) − 1 X T y \hat{w}^*=(X^TX)^{-1}X^Ty w^∗=(XTX)−1XTy 令 x ^ i = ( x i , 1 ) \hat{x}_i=(x_i,1) x^i=(xi,1),得多元线性回归模型: f ( x ^ i ) = x ^ i T ( X T X ) − 1 X T y f(\hat{x}_i)=\hat{x}_i^T(X^TX)^{-1}X^Ty f(x^i)=x^iT(XTX)−1XTy 然而现实任务中 X T X X^TX XTX往往不是满秩矩阵,则需使用其他方法,如梯度下降、牛顿法等。
梯度下降法:一种求局部最优解的方法,对于F(x),在a点的梯度是F(x)增长最快的方向,那么它的负方向则是该点下降最快的方向,又称最速下降法。
对于多元线性回归求解目标函数: J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta)=\frac{1}{2}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2 J(θ)=21i=1∑m(hθ(x(i))−y(i))2其中, h θ ( x ( i ) ) = w ^ T x h_\theta(x^{(i)})=\hat{w}^Tx hθ(x(i))=w^Tx(其实把 w ^ \hat{w} w^换成了 θ \theta θ)。
沿着负梯度方向迭代,更新后的 θ \theta θ使得 J ( θ ) J(\theta) J(θ)更小,即
θ = θ − α ⋅ ∂ J ( θ ) ∂ θ \theta=\theta-\alpha\cdot\frac{\partial J(\theta)}{\partial \theta} θ=θ−α⋅∂θ∂J(θ) 其中 α \alpha α表示学习率。
在线性回归中,目标函数收敛而且为凸函数,是有一个极
值点,所以局部最小值就是全局最小值。
求导后有 ∂ J ( θ ) ∂ θ = ( h θ ( x ) − y ) x j . \frac{\partial J(\theta)}{\partial \theta}=(h_\theta(x)-y)x_j. ∂θ∂J(θ)=(hθ(x)−y)xj.
梯度下降又分为三类:批量梯度下降BGD、随机梯度下降SGD、小批量梯度下降MBGD
批量梯度下降的 θ \theta θ更新过程如下: θ j = θ j + 1 m ∑ i = 1 m ( y i − h θ ( x i ) ) x j i \theta_j=\theta_j+\frac{1}{m}\sum_{i=1}^m(y^i-h_\theta(x^i))x_j^i θj=θj+m1i=1∑m(yi−hθ(xi))xji
随机梯度下降的 θ \theta θ更新过程如下: θ j = θ j + ( y i − h θ ( x i ) ) x j i \theta_j=\theta_j+(y^i-h_\theta(x^i))x_j^i θj=θj+(yi−hθ(xi))xji
小批量梯度下降的 θ \theta θ更新过程如下,这里小批量取10: θ j = θ j + α 1 10 ∑ k = i i + 9 ( y k − h θ ( x k ) ) x j k \theta_j=\theta_j+\alpha\frac{1}{10}\sum_{k=i}^{i+9}(y^k-h_\theta(x^k))x_j^k θj=θj+α101k=i∑i+9(yk−hθ(xk))xjk
牛顿法:利用迭代点 θ \theta θ求一阶导数(梯度)和二阶导数(Hessen矩阵)求解。
拟牛顿法:是求解非线性优化问题最有效的方法之一
均方误差MSE: 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2 \frac{1}{m}\sum_{i=1}^m(f(x_i)-y_i)^2 m1i=1∑m(f(xi)−yi)2
均方根误差RMSE: 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2 \sqrt{\frac{1}{m}\sum_{i=1}^m(f(x_i)-y_i)^2} m1i=1∑m(f(xi)−yi)2
平均绝对误差MAE: 1 m ∑ i = 1 m ∣ f ( x i ) − y i ∣ \frac{1}{m}\sum_{i=1}^m|f(x_i)-y_i| m1i=1∑m∣f(xi)−yi∣
R Squared: R 2 = 1 − ∑ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 ∑ i = 1 m ( y ‾ − y ( i ) ) 2 R^2=1-\frac{\sum_{i=1}^m(\hat{y}^{(i)}-y^{(i)})^2}{\sum_{i=1}^m(\overline{y}-y^{(i)})^2} R2=1−∑i=1m(y−y(i))2∑i=1m(y^(i)−y(i))2
方法:
LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=None)
参数解释:
fit_intercept:是否有截据,如果没有则直线过原点
normalize:是否将数据归一化
copy_X:默认为True,当为True时,X会被copied
n_job:默认值为1,计算时使用的核数
使用试例:
from sklearn.linear_model import LinearRegression
import numpy as np
model = LinearRegression()
x_train = np.array([[2,4],[5,8],[5,9],[7,10],[9,12]])
y_train = np.array([20,50,30,70,60])
#训练模型
model.fit(x_train,y_train)
#coef_ 系数w,intercept_截距
print(model.coef_)
print(model.intercept_)
print(model.score(x_train,y_train))
print(model.predict([[6,7]]))
import matplotlib.pyplot as plt
import numpy as np
x_train = [4,8,5,10,12]
y_train = [20,50,30,70,60]
#画测试数据,散点图
def draw(x_train,y_train):
plt.scatter(x_train, y_train)
#训练
def fit(x_train,y_train):
w = np.sum((x_train-np.mean(x_train))*(y_train-np.mean(y_train)))/np.sum((x_train-np.mean(x_train))**2)
b = np.mean(y_train)-w*np.mean(x_train)
return w,b
#预测
def predict(x,w,b):
y = w*x+b
return y
#划预测线
def fit_line(w,b):
x = np.linspace(4,15,13)
y = w*x+b
plt.plot(x,y)
plt.show()
if __name__ =="__main__":
draw(x_train,y_train)
w,b = fit(x_train,y_train)
print(w,b)
fit_line(w,b)
print(predict(15,w,b))
多元线性回归(批量梯度下降)代码:
import numpy as np
x_train = np.array([[1, 0., 3], [1, 1., 3], [1, 2., 3], [1, 3., 2], [1, 4., 4]])
y_train = np.array([95.364, 97.217205, 75.195834, 60.105519, 49.342380])
m = x_train.shape[0]
#步长
alpha = 0.0001
#误差
error = np.zeros(x_train.shape[1])
#设置一个阈值 用来判断迭代什么时候结束
epsilon = 0.000001
#迭代测试
cnt=0
#设置theta的默认值
theta = np.zeros(x_train.shape[1])
while True:
cnt+=1
#计算梯度
theta=theta+alpha/m*np.sum((y_train-np.dot(x_train, theta)).reshape(m,1)*x_train,0)
#计算误差
if np.linalg.norm(theta-error)