回归与分类
机器学习中通常按照输出值类型的不同把问题分为回归问题和分类问题:
回归问题中预测的结果通常是一个实数,是一种定量输出,且输入变量与输出变量均为连续变量。
分类问题中预测的结果通常是有限个离散变量,是一种定性输出。通俗的讲,回归问题的得分函数是一个连续函数,而分类问题的得分函数是一个不连续的函数。
线性回归:从二维平面上来看,平面上有若干个点,找出一条直线来,使这些点尽量符合这条直线的规律。
线性回归模型
给定由 d 个属性描述的单个示例 x = (x1;…; xd) ,线性模型(linear model)试图学得一个通过属性的线性组合来进行预测的函数
公式表示为:
用向量形式写成
算法的目的就是通过已有的数据学习得到w和b
那么如何得到w和b呢?如何确定得到的w和b是最符合数据规律的呢?
均方误差
假设有m个样本的数据集D ={(x1,y1) , (x2,y2),…, (xm,ym)},
先考虑简单的情况,假设每个样本只有一个属性时,D= {(
x
i
,
y
i
x_i,y_i
xi,yi)},
i
=
1
,
2
,
⋯
 
,
m
i=1,2,\cdots,m\quad \
i=1,2,⋯,m
对于单个样本,线性回归试图学得 :
使得预测值尽量接近实际值,此时的误差为 ∣ f ( x i ) − y i ∣ |f(x_i)-y_i| ∣f(xi)−yi∣
对于整个样本,使样本中所有的示例累计的误差最小,此时得到的w和b,认为是最好的,整体误差为:
∑
i
=
0
n
(
f
(
x
i
)
−
y
i
)
2
\sum_{i=0}^{n}(f(x_i)-y_i)^2
i=0∑n(f(xi)−yi)2
=
∑
i
=
0
n
(
y
i
−
w
x
i
−
b
)
2
=\sum_{i=0}^{n}(y_i-wx_i-b)^2
=i=0∑n(yi−wxi−b)2
变量为w和b,要求上式取最小值时w和b的值。
这就是最小二乘法,可以理解为,在二维平面上找到一条直线,使所有点到这条直线的欧氏距离之和最小。
令
E
(
w
,
b
)
=
∑
i
=
0
n
(
y
i
−
w
x
i
−
b
)
2
E_{(w,b)}=\sum_{i=0}^{n}(y_i-wx_i-b)^2
E(w,b)=i=0∑n(yi−wxi−b)2
求w和b的值,分别对w和b求偏导:
令上式分别为零,得
当每个样本有d个属性时,同样的对于单个样本,线性回归试图学得:
f
(
x
i
)
=
w
T
x
i
+
b
f(x_i)=w^Tx_i+b
f(xi)=wTxi+b使得
f
(
x
i
)
≈
 
y
i
f(x_i)\approx\,y_i
f(xi)≈yi
即多元线性回归
把参数w和b写为
w
^
=
(
w
,
b
)
\hat{w}=(w,b)
w^=(w,b),数据集表示为:
X
=
(
x
11
x
12
.
.
.
x
1
d
1
x
21
x
22
.
.
.
x
2
d
1
.
.
.
x
m
1
x
m
2
.
.
.
x
m
d
1
)
=
(
x
1
T
1
x
2
T
1
.
.
.
x
n
T
1
)
X=\begin{pmatrix} x_{11}& x_{12} &...& x_{1d}&1 \\ x_{21}& x_{22} &...& x_{2d}&1 \\ &...\\x_{m1}& x_{m2} &...& x_{md}&1 \\\end{pmatrix} \quad=\begin{pmatrix} x_1^T & 1\\ x_2^T & 1 \\ ...\\x_n^T & 1\end{pmatrix} \quad
X=⎝⎜⎜⎛x11x21xm1x12x22...xm2.........x1dx2dxmd111⎠⎟⎟⎞=⎝⎜⎜⎛x1Tx2T...xnT111⎠⎟⎟⎞
标记
y
=
(
y
1
;
y
2
;
.
.
.
y
m
)
y=(y_1;y_2;...y_m)
y=(y1;y2;...ym)
把整个数据集中的样本都考虑在内,所有的误差平方和为:
E
w
^
=
(
y
−
x
w
)
T
(
y
−
x
w
)
E_{\hat{w}}=(y-xw)^T(y-xw)
Ew^=(y−xw)T(y−xw)
对
w
w
w求导得
∂
E
w
^
/
∂
w
=
2
X
T
(
X
w
^
−
y
)
\partial E_{\hat{w}}/\partial w=2X^T(X\hat{w}-y)
∂Ew^/∂w=2XT(Xw^−y)
令上式为零求得最优解:
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)
xi^=(xi,1),则得到的线性模型为:
f
(
x
i
^
)
=
x
i
^
(
X
T
X
)
−
1
X
T
y
f(\hat{x_i})=\hat{x_i}(X^TX)^{-1}X^Ty
f(xi^)=xi^(XTX)−1XTy
sklearn使用线性回归:
import numpy as np
from sklearn.linear_model import LinearRegression
import sklearn.datasets as datasets
import sklearn.datasets as datasets
import matplotlib.pyplot as plt
# 获取糖尿病数据
diabetes = datasets.load_diabetes()
print('aaaaaaaaa')
print('aa', datasets)
x = diabetes.data
y = diabetes.target
# 选择数据的属性
x = x[:, 2].reshape((442, 1))
#x = x[:, np.newaxis, 2]
#x = x[:,2,np.newaxis]
# 抽取训练数据和预测数据
X_train = x[:-20]
X_test = x[-20:]
Y_train = y[:-20]
y_test = y[-20:]
# 创建数学模型
lrg = LinearRegression()
# 训练
lrg.fit(X_train, Y_train)
# 预测
y_ = lrg.predict(X_test)
# 绘制图形
plt.scatter(X_test, y_test)
plt.plot(X_test, y_, 'r')
plt.show()
岭回归
在线性回归的模型的基础上变为:
f
(
x
i
^
)
=
x
i
^
(
X
T
X
+
λ
I
)
−
1
X
T
y
f(\hat{x_i})=\hat{x_i}(X^TX+\lambda I)^{-1}X^Ty
f(xi^)=xi^(XTX+λI)−1XTy,相当于把线性回归的系数变为
w
^
=
(
X
T
X
+
λ
I
)
−
1
X
T
y
\hat{w}=(X^TX+\lambda I)^{-1}X^Ty
w^=(XTX+λI)−1XTy,添加的
λ
I
\lambda I
λI是惩罚项,引入惩罚项可以减少不重要的属性,缩减数据规模,挑选出更具代表性的特征。
λ
\lambda
λ作为参数可以改变大小,来调节模型。岭回归用于处理下面两类问题:
1.数据点少于变量个数
2.变量间存在共线性
当变量间存在共线性时,最小二乘回归得到的系数不稳定,方差很大,这是因为系数矩阵x与它的转置矩阵相乘得到的矩阵不能求逆,而岭回归通过引入
λ
\lambda
λ参数,使得该问题得到解决。
sklearn使用岭回归,并和线性回归做对比:
# 岭回归
# 求矩阵的秩
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
print('求矩阵的秩')
X_train = np.array([[2, 1, 2, 1], [2, 3, 2, 3]])
y_train = np.array([1.2, 3]) # 注意中括号的个数
print('使用普通线性回归')
lrg = LinearRegression()
lrg.fit(X_train, y_train)
pred1 = lrg.predict([[3, 4, 4, 3]]) # 注意中括号的个数
print(pred1)
print(lrg.coef_)
print('使用岭回归')
ridge = Ridge()
ridge.fit(X_train, y_train)
pred2 = ridge.predict([[3, 4, 4, 3]])
print(pred2)
print(ridge.coef_)
print('coef_求解')
X_train = np.array([[1, 1], [1, -1]])
y_train = np.array([3, 2]) # 注意中括号的个数
lrg.fit(X_train, y_train)
coef_ =lrg.coef_
print(coef_)
print(np.dot(coef_, X_train))
print('降维')
X_train = np.array([[1, 1], [3, 3]])
y_train = np.array([1.2, 3])
lrg.fit(X_train, y_train)
print(lrg.coef_)
print(lrg.predict([[4, 3]]))
print('岭回归降维')
ridge.fit(X_train, y_train)
pred2 = ridge.predict([[4, 3]])
print(ridge.coef_)
print(pred2)
lasso回归
lasso回归和岭回归类似,对参数
w
^
\hat{w}
w^加一个限定条件:
∑
k
=
1
n
∣
w
k
∣
<
λ
\sum\limits_{k=1}^{n}|w_k|<\lambda
k=1∑n∣wk∣<λ,当
λ
\lambda
λ足够小一些影响较弱的系数就会变为0,lasso的优点和岭回归类似。
sklearn使用岭回归:
from sklearn.linear_model import Lasso
import sklearn.datasets as datasets
import matplotlib.pyplot as plt
import numpy as np
boston = datasets.load_boston()
x = boston.data
y = boston.target
print(y)
# print(x, y)
X_train = x[:-20]
x_test = x[-20:]
print(x_test.shape)
Y_train = y[:-20]
y_test = y[-20:]
print(y_test.shape)
lasso = Lasso(alpha=1) # 可改变参数alpha
lasso.fit(X_train, Y_train)
lasso_pre = lasso.predict(x_test)
print(lasso_pre.shape)
index = np.arange(1, 21)
#print(index)
plt.subplot(211)
plt.plot(index, y_test, 'r', label='real') # 原始值
#plt.show()
plt.subplot(212)
plt.plot(index, lasso_pre, 'b', label='predict') # 预测值
plt.show()
本文来自 qq_33699659 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_33699659/article/details/82950675?utm_source=copy