其中的代码实现 课程中大多在Jupter中仿真实现 用的是sklearn的工具包
头文件名称 | 作用 |
---|---|
numpy | 数值计算、文件输入输出、快速排序和索引 |
pandas | 读取数据 |
matplotlib.pyplot | 数据画图 |
多特征建模
重点在于输入数据上多引了一行
作用:减小误差、减小损耗
交叉验证
将train数据集分成n个部分,然后将n各部分,按一定顺序分成训练组和测试组,逐一进行验证得到结果。
例如n=3,则12 3;13 2;23 1。
混淆矩阵confusion matrix【2*2】
以100个学生中,80个男生,20个女生。现在需要找出所有女生,结果从班级中选择了50个人,其中有20个女生,还选择了30个男生。
T是正确,F是错误;P(positive)是代表目标类型,例如这里就是女生当作女生选出来。
TP:把女生当作女生选出来选对了。应正确选择女生20人,实际上正确选择女生20人。TP=20
FP(存伪):把女生当作女生选出来选错了。应错误选择男生0人,实际上错误选择男生30人。FP=30
TN:正确的把男生当作男生拿出来。这里还剩50人没被选出来,那就是TN=50
FN(去真):把女生当作男生选出来选错了。FN=0
【这里需要自己加强理解】
完美的分类器应该使得FP FN尽可能为0
precision=
T
P
T
P
+
F
P
\frac {TP}{TP+FP}
TP+FPTP
recall= T P T P + F N \frac {TP}{TP+FN} TP+FNTP【判断成女生的所有情况中,判断对的】
将上面两个参数结合到一个F1 score的指标调和平均值给予低值更多的权重
F1=
2
1
p
r
e
c
i
s
i
o
n
+
1
r
e
c
a
l
l
\frac {2}{\frac{1}{precision}+\frac{1}{recall}}
precision1+recall12
原本的分类器直接通过分类得分来进行分类,我们使其直接传出得分暂不分类,然后自己去设置t值
阈值越低,recall值越高,精度越低
ROC曲线
二元分类中常用的评估方法,绘制true positive rate(TPR)和false positive rate(FPR)
TPR=recall=
T
P
T
P
+
F
N
\frac {TP}{TP+FN}
TP+FNTP;FPR=
F
P
T
N
+
F
P
\frac {FP}{TN+FP}
TN+FPFP
要绘制ROC曲线需要先使用roc_curve()函数计算各种阈值的TPR FPR
一个好的ROC曲线应该尽量偏向左上方,远离从原点出发的y=x的射线。比较分类器的一种方法是测量曲线下的面积(AUC),完美分类器的面积趋向于1。不好的曲线趋于0.5。
对于线性回归的进一步处理/应用
回归方程:
y
^
=
θ
0
+
θ
1
x
1
+
.
.
.
+
θ
n
x
n
\hat{y}=\theta_0+\theta_1x_1+...+\theta_nx_n
y^=θ0+θ1x1+...+θnxn[第一项为偏置项‘;
θ
为权重项
\theta为权重项
θ为权重项]
MSE(
X
⃗
,
h
θ
\vec{X},h_{\theta}
X,hθ)=
1
m
∑
i
=
1
m
(
θ
T
⋅
x
(
i
)
−
y
(
i
)
)
2
\frac1{m}\sum_{i=1}^{m}(\theta^T·x^{(i)}-y^{(i)})^2
m1∑i=1m(θT⋅x(i)−y(i))2
由上面两个式子可以得到
θ
^
=
(
x
ˉ
T
⋅
x
ˉ
)
−
1
⋅
x
ˉ
T
⋅
y
ˉ
\hat{\theta}=(\bar{x}^T·\bar{x})^{-1}·\bar{x}^T·\bar{y}
θ^=(xˉT⋅xˉ)−1⋅xˉT⋅yˉ
构造随机数——>适当在左侧补1——>根据式子进行处理——>得到
θ
\theta
θ的估计矩阵
数据标准化处理特别重要,基本上拿到数据都需要做标准化处理。因为数据大小不同,适当的处理是会节约时间的
学习率对结果的影响
影响是比较大的,当学习率小,消耗的时间比较长,但是准确率比较高。学习率应该不断的衰减,范围越小后应该越精确。
所需选取数据的多少。如:Minbatch = 10;X = A[i:i+Minbatch];
多项式回归
对于不是单调变化的数据趋势,需要加入多次方来使得曲线拟合更好。在sklearn中调用了degree,degree不应该特别高,会造成【过拟合】。基本上degree取值2~3足够
那么如果避免结果过拟合呢?
测试样本个数对总体数据的拟合结果的影响,由此可以得出:训练的时候结果不一定要很好,最后选择的应该是训练和测试都达到一个较为理想的方向。即两个MSE之间的间隙要小一些,出错就比较小。
由此可得,当样本量比较大的时候,出现过拟合的风险就会小一些。【样本比较少实际上会出现的是欠拟合】
正则化
定义:对权重参数进行惩罚,让权重参数尽可能平滑一些
θ
1
=
[
1
,
0
,
0
,
0
]
\theta_1 =[1,0,0,0]
θ1=[1,0,0,0]
θ
2
=
[
1
4
,
1
4
,
1
4
,
1
4
]
\theta_2 =[\frac{1}{4},\frac{1}{4},\frac{1}{4},\frac{1}{4}]
θ2=[41,41,41,41]
x
=
[
1
,
1
,
1
,
1
]
x =[1,1,1,1]
x=[1,1,1,1]
当x和
θ
\theta
θ结合过后,结果都等于1,但是并不代表两个
θ
\theta
θ都是值得选择的。因此,我们需要使用正则化,使得程序能够对
θ
\theta
θ进行正确选择。
正则化计算公式:
J
(
θ
)
=
M
S
E
(
θ
)
+
α
1
2
∑
i
=
1
n
θ
i
2
J(\theta)=MSE(\theta)+\alpha\frac{1}{2}\sum_{i=1}^{n}\theta_i^2
J(θ)=MSE(θ)+α21∑i=1nθi2
其中:MSE为损失函数值。求和部分是对
θ
\theta
θ进行平方上面的计算作为正则损失。但是我们希望整体的损失值即
J
(
θ
)
J(\theta)
J(θ)是越低越好,浮动的值越小越好。
岭回归(加上一个平方项)
我们可以从图二中看到,当alpha越大的时候,整个起伏会小一些。
Lasso(加上一个绝对值)
线性回归总结
-
当作是一个巧合求出了 θ \theta θ ,机器学习中心思想是迭代更新。
-
梯度下降是一种优化方式,不光在线性回归中,一些神经网络上也能用上。【重点在于学习率尽可能小,尤其是在迭代次数越来越大的时候,学习率也应该越来越小,】
-
minbatch中,一般情况下batch的数量应当越大越好。
-
多项式回归中,degree越大,抖动的程度会越大,也就是结果越复杂。一个数据的特征变换越复杂(高次项),得到结果过拟合风险越高。特征维度高一些没有关系(x—>3*x+1)。
-
数据量越少,训练集效果越好,但是实际测试效果一般。
-
正则化中,当惩罚力度越大,即alpha的值越大的时候,得到的决策方程越平稳。有两种不同的方法:岭回归和lasso
———————————分割线———————————————————
逻辑回归(一个经典的二分类算法,解释性很强
- 机器学习算法选择(先用逻辑回归再用复杂的),基本上会使用逻辑回归算法先建立一个baseline,对比算法、参数看性能提升多少
- 逻辑回归的决策边界可以是非线性的,可以通过非线性的曲线选取区域
Sigmoid函数:(是一个万金油)
g
(
z
)
=
1
1
+
e
−
z
g(z) = \frac{1}{1+e^{-z}}
g(z)=1+e−z1
自变量取值范围为任意实数,值域为[0,1]
意义:随便输入是什么,映射到0到1的区间上,我们在线性回归中可以得到一个预测值,再将该值映射到sigmoid函数中,这样就完成了一个由值到概率的转换,也就是分类任务。
- 预测函数:
h
θ
(
x
)
=
g
(
θ
T
x
)
=
1
1
+
e
−
θ
T
x
h_\theta(x)=g(\theta^Tx)=\frac{1}{1+e^{-\theta^Tx}}
hθ(x)=g(θTx)=1+e−θTx1【把预测值映射到sigmoid函数中】
其中 θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n = θ T x \theta_0+\theta_1x_1+\theta_2x_2+...+\theta_nx_n=\theta^Tx θ0+θ1x1+θ2x2+...+θnxn=θTx
分类任务:
P
(
y
=
1
∣
x
;
θ
)
=
h
θ
(
x
)
;
P
(
y
=
1
∣
x
;
θ
)
=
1
−
h
θ
(
x
)
P(y=1|x;\theta)=h_\theta(x); P(y=1|x;\theta)=1-h_\theta(x)
P(y=1∣x;θ)=hθ(x);P(y=1∣x;θ)=1−hθ(x)。
整合后可得:
P
(
y
∣
x
;
θ
)
=
h
θ
(
x
)
y
(
1
−
h
θ
(
x
)
)
1
−
y
P(y|x;\theta)=h_\theta(x)^y(1-h_\theta(x))^{1-y}
P(y∣x;θ)=hθ(x)y(1−hθ(x))1−y
解决逻辑:
1)似然函数构建,即
P
(
y
∣
x
;
θ
)
P(y|x;\theta)
P(y∣x;θ)进行乘积运算得到
L
(
θ
)
L(\theta)
L(θ)
2)对数似然:由
L
(
θ
)
L(\theta)
L(θ)得到
l
(
θ
)
l(\theta)
l(θ)
3)通过梯度下降得到求导结果:
−
1
m
∑
i
=
1
m
(
y
i
−
g
(
θ
T
x
i
)
)
x
i
j
-\frac{1}{m}\sum_{i=1}^{m}(y_i-g(\theta^Tx_i))x_i^j
−m1∑i=1m(yi−g(θTxi))xij【g就是sigmoid函数】
4)参数更新:
θ
j
=
θ
j
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
i
)
−
y
i
)
x
i
j
\theta_j=\theta_j-\alpha\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x_i)-y_i)x_i^j
θj=θj−αm1∑i=1m(hθ(xi)−yi)xij
————softmax是用来解决多分类问题的
如果遇到了三个类别(红蓝绿)具体分类方法为:区分出红色【100】;区分出蓝色【010】;区分出绿色【001】。再通过三个结果同时判断三种类别[0.7 0.2 0.3]——>那就是红色
θ
\theta
θ的建立=【
θ
\theta
θ个数(几个二分类,各分类的概率值);特征数目】
!!具体代码部分见b站《机器学习入门到精通》P44-50
鸢尾花数据集iris.csv【150*4】
- 三分类任务数据集,有四个特征向量(花瓣长度、宽度;花萼长度、宽度)
- 通过长度宽度来分析花朵属于三个类别中的哪一个
具体数据情况属性在下面的网址中
https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_iris.html#sklearn.datasets.load_iris
非线性决策边界
polynomial_degree(使得特征更为复杂一些)
!!具体代码部分见b站《机器学习入门到精通》P55
——————————————————分割线——————————
回归和分类任务的相互转换
- 逻辑回归中主要是通过sigmoid函数完成了数值映射,通过概率值比较来完成分类任务
- 以鸢尾花数据集为例:
构建棋盘点
np.meshgrid(np.linspace(1,2,2).reshape(-1,1),np.linspace(10,20,3).reshape(-1,1)
得到的就是( [ [1.,2.],[1.,2.],[1.,2.] ] )和( [ [10.,10.],[15.,15.],[20.,20.] ] )
再进行np.c_[x0.ravel(),x1.ravel()]
得到第一个数据和第二个数据中的所有可能组合(1,10)(2,10)(1,15)(2,15)…
??如何将二分类任务转换为所类别分类??
softmax【将二分类任务转换为多分类任务】
softmax计算概率:
p
^
k
=
σ
(
s
(
x
)
)
k
=
exp
(
s
k
(
x
)
)
Σ
j
=
1
K
exp
(
s
j
(
x
)
)
\hat{p}_k=\sigma(\mathbf{s}(\mathbf{x}))_k=\frac{\exp\left(s_k(\mathbf{x})\right)}{\Sigma_{j=1}^K\exp\left(s_j(\mathbf{x})\right)}
p^k=σ(s(x))k=Σj=1Kexp(sj(x))exp(sk(x))
(1)分子是用来放大每一类的得分,分母是综合,由此来得到类别概率 【放大差异 再求归一化】
损失函数(交叉熵):
J
(
Θ
)
=
−
1
m
∑
i
=
1
k
=
1
m
y
k
(
i
)
log
(
p
^
k
(
i
)
)
J(\Theta)= -\frac{1}{m}\sum_{i = 1 k = 1}^{m}y_{k}^{(i)}\log\left(\hat{p}_{k}^{(i)}\right)
J(Θ)=−m1∑i=1k=1myk(i)log(p^k(i))
(1)
y
k
(
i
)
y_{k}^{(i)}
yk(i)仅当属于当前正确类别的时候等于1
(2)
log
(
p
^
k
(
i
)
)
\log\left(\hat{p}_{k}^{(i)}\right)
log(p^k(i))概率越小,幂函数值越大,越接近1的时候,幂函数的值越小
(3)负号负负得正,属于正确类别的概率越高,损失越低
总结
- 对于传统逻辑回归,是对标签进行多变换。属于当前类别为1,反之为0。随之输入特征数质的变化,结果概率也会随之变化。
- 决策边界绘制:
(1)构建坐标数据,在合理的范围当中,不可过于精确造成过拟合。
(2)整合坐标数据,得到所有测试输入数据坐标点
(3)预测,得到所有点的概率值
(4)绘制等高线