1.1 线性回归模型
对于给定的训练集数据,线性鬼给的目的是找到一个与这些数据最为吻合的线性函数。一般情况下线性回归模型假设函数为:
h
w
,
b
(
x
)
=
∑
i
=
1
n
w
i
x
i
+
b
=
w
T
x
+
b
h_{w, b}(x)=\sum_{i=1}^{n} w_{i} x_{i}+b=w^{\mathrm{T}} x+b
hw,b(x)=i=1∑nwixi+b=wTx+b其中,
w
∈
R
n
w \in \mathbf{R}^{n}
w∈Rn 与
b
∈
R
b \in \mathbf{R}
b∈R 为模型参数, 也称为回归系数。为了方便, 通常将
b
b
b 纳 句量
w
w
w, 作为
w
0
w_{0}
w0, 同时为输入向量
x
x
x 添加一个常数 1 作为
x
0
x_{0}
x0 :
w
=
(
b
,
w
1
,
w
2
,
.
.
.
.
,
w
n
)
T
w =(b,w_{1},w_{2},....,w_{n})^{\mathrm{T}}
w=(b,w1,w2,....,wn)T
x
=
(
1
,
x
1
,
x
2
,
.
.
.
,
x
n
)
T
x =(1,x_{1},x_{2},...,x_{n})^{\mathrm{T}}
x=(1,x1,x2,...,xn)T假设函数为:
h
w
(
x
)
=
∑
i
=
0
n
w
i
x
i
=
w
T
x
h_{w}(x)=\sum_{i=0}^{n} w_{i} x_{i}=w^{\mathrm{T}} x
hw(x)=i=0∑nwixi=wTx其中,
w
∈
R
n
+
1
w \in \mathbf{R}^{n+1}
w∈Rn+1,通过训练确定模型参数
w
w
w后,可使用模型对新的输入示例进行预测。
1.2 最小二乘法
∇ J ( w ) = 1 N ∑ i = k k + N ( w T x i − y i ) x i \nabla J(w)=\frac{1}{N} \sum_{i=k}^{k+N}\left(w^{\mathrm{T}} x_{i}-y_{i}\right) x_{i} ∇J(w)=N1i=k∑k+N(wTxi−yi)xi
小批量梯度下降算法的参数更新公式为:
w
:
=
w
−
η
1
N
∑
i
=
k
k
+
N
(
w
T
x
i
−
y
i
)
x
i
w:=w-\eta \frac{1}{N} \sum_{i=k}^{k+N}\left(w^{\mathrm{T}} x_{i}-y_{i}\right) x_{i}
w:=w−ηN1i=k∑k+N(wTxi−yi)xi
项目实战
Logistic回归
1. 数据准备
- 步骤1:调用numpy中genfromtxt函数加载数据集
import numpy as np
x = np.genfromtxt('wine.data',delimiter=",",usecols = range(1,14))
#读取第2到最大14列
y = np.genfromtxt('wine.data',delimiter = ',',usecols = 0)
1、参数delimiter: 分隔符,将每行中的元素分割为列的字符或者字符串,一般是用“,”,一系列整数作为参数也可以
2、参数usecols:读取的列数,一般默认是从0-max
- 步骤2:使用logistic回归鉴别第1类和第2类红酒,因为Logistic回归只能处理二元分类问题,需要将数据集第3类红酒样本去除
idx = y != 3
x = x[idx]
y = y[idx]
- 步骤3:目前y中类的标记为1和2,转换为算法使用的0和1
y -= 1
这样数据准备工作都完成了
2. 模型训练与测试
LogisticRegression的超参数如下:
梯度下降最大迭代次数 n_iter
学习率 eta
损失降低阈值tol(tol不为None时, 开启早期停止法)
- 步骤1:以超参数(n_iter = 2000, eta = 0.01, tol = 0.0001)创建模型
from logistic_regression import LogisticRegression
# 梯度下降最大迭代次数 n_iter, 学习率 eta, 损失降低阈值tol(tol不为None时, 开启早期停止法)
clf = LogisticRegression(n_iter = 2000, eta = 0.01, tol = 0.0001)
- 步骤2:调用sklearn中的train_test_split函数将数据集分为训练集和测试集,比例为7:3
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3)
- 步骤3:在应用梯度下降法时应保证各特征值相差不大。观察下面数据集特征均值及方差
x1 = x.mean(axis = 0) # mean代表均值, axis代表垂直方向,就是每个列的数据集(每个特征就是一列)
x2 = x.var(axis = 0) # var代表方差
- 步骤4:由于其中一些的特征值差别较大,需要用sklearn中的StandardScaler函数对各个特征值进行缩放
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss1 = ss.fit(x_train) # fit用于计算训练数据的均值和方差, 后面会用均值和方差来转换训练数据
print(ss1): 结果是StandardScaler(copy=True, with_mean=True, with_std=True)
1、sklearn.preprocessing.StandardScaler(copy=True, with_mean=True, with_std=True)这个函数用于给数据进行去均值和方差归一化处理
2、copy:如果为false,就会用归一化的值替代原来的值;如果被标准化的数据不是np.array或scipy.sparse CSR matrix, 原来的数据还是被copy而不是被替代
3、with_std:boolean类型,默认为True,表示将数据方差规范到1
4、with_mean:boolean类型,默认为True,表示将数据均值规范到0
总结: 这里是用于标准化,将数据的方差规范到1,均值规范到0,实际上就是标准正态分布的方差和均值
关于StandScaler中fit、transform区别的解释文章
Sklearn之数据预处理——StandardScaler,提到归一化的方法