Evernote Export
1.什么是回归?
regression
在监督学习中,包括了输入和输出的样本,在此基础上,我们能够通过新的输入来表示结果,映射到输出
输出包含了离散输出和连续输出
2.回归与函数逼近
回归并不是指向平均值回落,而是使用函数形式来逼近一堆数据点
3.线性回归
什么是线性方程?
线性方程就是直线方程,可以理解为
Y=mx+b
这里的m是斜率,b是截距,这是一个线性方程而不是平面方程
什么是回归分析?
回归分析是统计的概念。这里的想法是观察数据和构建一个方程,使我们可以为丢失的数据或未来数据的预测。
什么是线性回归?
线性回归是模型之间的线性关系因变量(Y)和自变量(X1、X2、X3等的关系)
Y=θ0+θ1X1+θ2X2+...+θnXn
序号 | 统计学分数 | 编程学分数 | 数据科学分数 |
---|---|---|---|
A | 50 | 80 | 65 |
B | 80 | 65 | 83 |
C | 60 | 60 | 69 |
D | 95 | 80 | 92 |
E | 95 | 50 | 84 |
F | 40 | 90 | 55 |
这里的y是一个输出变量,X1,X2...Xn是输入变量和θ0,θ1...θn被称为参数或者权重
所以在上面的得分数据集中,y是数据科学的评分。X1代表统计得分,X2是在编程得分
y=θ0+θ1x1+θ2x2
为什么这些θ就是所谓的权重
每个θ告诉我们如何重视想用的X在预测的输出。这表示,如果一个特定的θ相比其他值小,相应的X起着预测输出多大的作用。
为什么会出现错误
尽管能够根据线性方程预测,但是在现实世界中,情况是多元性的,不可能使用简单的线性方程就会实现预测,这会导致模型的错误。
所以我们要考虑误差
绝对误差综合:∑i=1m∣yi^−yi∣
误差平方的总和:21∑i=1m(y^−yi)2
我们会在梯度下降算法以后使用这个表达式来考虑优化模型
为什么梯度下降与误差平方是有用的?
梯度下降算法使用被最小化的函数的导数。
4.找到最佳拟合
f(x)=c
E(c)=∑i=1n(yi−c)2
5.多项式的阶
Xw≈y
XTXw≈XTy
(XTX)−1XTXw≈(XTX)−1XTy
w=(XTX)−1XTy
6.误差
出现误差的原因是多方面的
7.交叉验证
交叉验证的目的是为了泛化我们的机器学习模型,所以不能直接在测试集中直接建模
8.小结
1.回归的历史
2.模型的选择-过拟合、欠拟合,一般拟合、交叉验证
3.线性回归和多项式回归
4.平方误差下的最佳常数和过程中用的微积分
5.一般处理方法
6.表示法以及回归的应用
线性回归算法
- 解决回归问题
- 思想简答,实现容易
- 许多强大的非线性模型的基础
- 结果具有很好的可解释性
- 蕴含机器学习中的很多重要思想
一类机器学习算法的基本思路
目标:找到a和b,使得∑i=1m(y(i)−ax(i)−b)2即 损失函数(loss function) 尽可能小,当在算法中用拟合的程度来测量,即 效用函数(utility function)
典型的最小二乘法问题:最小化误差的平方a=∑i=1m(x(i)−x)2∑i=1m(x(i)−x)(y(i)−y)b=y−ax
- 通过分析问题,确定问题的损失函数或者效用函数
- 通过最优化损失函数或者效用函数,获得机器学习模型
- 所有参数学习的算法都是为了最终求解某一个值的极值,学习模型最终的参数,找到相应的参数来最优化损失函数或者效用函数
- 线性回归
- 多项式回归
- SVM
- 神经网络
- 逻辑回归
- .............
最优化原理:在经典的传统算法里使用的也是最优化思路
凸优化:解决的是特殊的优化思路
最小二乘法
简单的线性回归算法
class SimpleLinearRegression1:
def __init__(self):
self.a_ = None
self.b_ = None
def fit(self,x_train,y_train):
'''
根据训练数据集x_train,y_train训练simple linear regression模型
:param x_train:
:param y_train:
:return:
'''
assert x_train.ndim ==1 ,"simple linear regressor can only solve single feature training data."
assert len(x_train) == len(y_train),'the size of x_train must be equal to the size of y_train'
x_mean = np.mean(x_train)
y_mean = np.mean(y_train)
num = 0.0
d = 0.0
for x_i,y_i in zip(x_train,y_train):
num += (x_i-x_mean)*(y_i-y_mean)
d += (x_i - x_mean) **2
self.a_ = num /d
self.b_ = y_mean-a*x_mean
def predict(self, x_predict):
'''
给定待预测数据集x_predict,返回x_predict的结果向量
:param x_predict:
:return:
'''
assert x_predict.ndim ==1 ,"simple linear regressor can only solve single feature training data."
assert self.a_ is not None and self.b_ is not None,'must fit before predict!'
return np.array([self._predict(x) for x in x_predict])
def _predict(self,x_single):
'''
给定单个待预测数据x_single,返回x_single的预测结果值
:param x_single:
:return:
'''
return self.a_ * x_single + self.b_
def __repr__(self):
return 'SimpleLinearRegression1()'
reg1 = SimpleLinearRegression1()
reg1.fit(x,y)
y_hat1 = reg1.predict(x)
plt.scatter(x,y)
plt.plot(x,y_hat1,color='red')
plt.show()
向量化运算
使用向量化运算比简单的线性计算运算速度上要快的多
class SimpleLinearRegression2:
def __init__(self):
self.a_ = None
self.b_ = None
def fit(self,x_train,y_train):
'''
根据训练数据集x_train,y_train训练simple linear regression模型
:param x_train:
:param y_train:
:return:
'''
assert x_train.ndim ==1 ,"simple linear regressor can only solve single feature training data."
assert len(x_train) == len(y_train),'the size of x_train must be equal to the size of y_train'
x_mean = np.mean(x_train)
y_mean = np.mean(y_train)
num = (x_train-x_mean).dot(y_train-y_mean)
d = (x_train-x_mean).dot(x_train-x_mean)
self.a_ = num /d
self.b_ = y_mean-a*x_mean
def predict(self, x_predict):
'''
给定待预测数据集x_predict,返回x_predict的结果向量
:param x_predict:
:return:
'''
assert x_predict.ndim ==1 ,"simple linear regressor can only solve single feature training data."
assert self.a_ is not None and self.b_ is not None,'must fit before predict!'
return np.array([self._predict(x) for x in x_predict])
def _predict(self,x_single):
'''
给定单个待预测数据x_single,返回x_single的预测结果值
:param x_single:
:return:
'''
return self.a_ * x_single + self.b_
def __repr__(self):
return 'SimpleLinearRegression2()'
reg2 = SimpleLinearRegression2()
reg2.fit(x,y)
print(reg2.a_, reg2.b_)
y_hat2 = reg2.predict(x)
plt.scatter(x,y)
plt.plot(x,y_hat2,color='red')
plt.show()
性能测试,线性回归向量化运算比线性运算快约50倍
m = 1000000
big_x = np.random.random(size=m)
big_y = big_x * 2.0 + 3.0 + np.random.normal(size=m)
%timeit reg1.fit(big_x, big_y)
%timeit reg2.fit(big_x, big_y)
>>>
962 ms ± 60.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
25.9 ms ± 286 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
>>>
回归算法的评价
线性回归算法的评测
m1i=1∑m(ytest(i)−y^test(i))2
均方误差MSE(Mean Squared Error)
m1i=1∑m(ytest(i)−y^test(i))2=MEStest
均方根误差RMSE(Root Mean Squared Error)
m1i=1∑m∣ytest(i)−y^test(i)∣
平均绝对误差MAE(Mean Absolute Error)
R2=1−SStotalSSresidual
R2=1−∑(y(i)−y(i))2∑(y^(i)−y(i))2
衡量了自己的模型没有产生错误的指标
- R2<=1
- R2 越大越好。当我们的预测模型不犯任何错误时,R^2得到最大值1
- 当我们的模型等于基准模型时,R2 为0
- 如果R2<0,说明我们学习到的模型还不如基准模型。此时,很有可能我们的数据不存在任何线性关系。
sklearn中的线性回归算法中的score就是使用的R2评估标准
多元线性回归
数据有多少特征有多少维度,就会有多少个θ表示,θ0就是截距
目标 找到θ0 , θ1,θ2 , ...,θn 使得∑i=1m(y(i)−y^(i))2尽可能小
即(y−Xb⋅θ)T(y−Xb⋅θ)尽可能小
多元线性回归的正规方程解(Normal Equation)
θ=(XbTXb)−1XbTy
问题:时间复杂度高 O(n3)优化O(n2.4)
有点:不需要对数据进行归一化处理
解决方案: