文章目录
逻辑回归 / 对数几率回归(logistic / logit regression)- 线性概率模型
单变量 simple logistic regression or 多变量 multiple logistic regression
二分类类别预测、近似概率预测
【单位阶跃函数】- 【替代函数】-【Sigmoid函数】形似S的函数
【对数几率函数】
y
=
1
1
+
e
−
z
=
1
1
+
e
−
(
w
T
x
+
b
)
ln
y
1
−
y
=
w
T
x
+
b
y=\frac1{1+e^{-z}} = \frac1{1+e^{-(\bm w^T \bm x+b)}} \quad \ln \frac y{1-y}=\bm w^T \bm x+b
y=1+e−z1=1+e−(wTx+b)1ln1−yy=wTx+b
y
y
y:样本
x
\bm x
x 作为正例的可能性
1
−
y
\qquad 1-y
1−y:样本
x
\bm x
x 作为反例的可能性
【几率比 (odds ratio)】
x
\bm x
x 作为正例的相对可能性
y
1
−
y
\qquad \frac y{1-y}
1−yy
【对数几率 (log odds,logit) 】
ln
y
1
−
y
\qquad \ln \frac y{1-y}
ln1−yy
w
^
j
\hat w_j
w^j 表示解释变量
x
j
x_j
xj 增加一个微小量引起“对数几率”的边际变化。
e
w
^
j
e^{\hat w_j}
ew^j 表示解释变量
x
j
x_j
xj 增加一个单位引起“几率”的变化倍数。
-参数估计:极大似然法 - 凸优化理论
-拟合优度的检验:准
R
2
R^2
R2、正确预测的百分比
# logistic regression #
library(ISLR)
attach(Smarket)
# Training set
train=(Year<2005)
Smarket.2005=Smarket[!train,]
Direction.2005=Direction[!train]
# LR model
glm.fits=glm(Direction~Lag1+Lag2,data=Smarket,family=binomial,subset=train)
glm.probs=predict(glm.fits,Smarket.2005,type="response")
glm.pred=rep("Down",length(glm.probs))
# replicate the values of 'down' for 'length(glm.probs)' times
glm.pred[glm.probs>.5]="Up"
# Correctness
table(glm.pred,Direction.2005)
mean(glm.pred==Direction.2005)
# Plot the classification result
grid.x = seq(-4,4,0.1)
grid.y = seq(-4,4,0.1)
grid.xy = as.data.frame(expand.grid(grid.x, grid.y))
colnames(grid.xy) = c("Lag1", "Lag2")
grid.prob = predict(glm.fits,grid.xy,type="response")
grid.prob = matrix(grid.prob, length(grid.x), length(grid.y))
contour(grid.x, grid.y, grid.prob,levels=0.5,drawlabels=FALSE)
points(Lag1, Lag2, col=Direction)
legend(3, 4, c("Down", "Up"),pch="o" ,col=c("black","red"))
补充:Probit模型 - 使用标准正态的累积分布函数作为替代函数 (一般还是用Logit模型)
y = Φ ( x ′ w ) = ∫ − ∞ x ′ w ϕ ( t ) d t y=\Phi(\bm x'\bm w)=\int _{-\infty}^{\bm x'\bm w}\phi(t)dt y=Φ(x′w)=∫−∞x′wϕ(t)dt
线性判别分析(linear discriminant analysis,LDA)/ Fisher 判别分析
类别预测、监督降维算法
假设:每个类别都是具有相同方差或协方差的正态分布
当样例较少且预测值接近正态分布,或是多分类问题时,LDA比逻辑回归更常用
思想:给定训练样例集,设法将样例投影到一条直线上,使得同类样例的投影点尽可能接近、异类样例的投影点尽可能远离;在对新样本进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定新样本的类别
【线性判别函数】【决策边界】【决策规则】这个有点难,暂略
数学证明(书P61-62)
# LDA #
library(ISLR)
library(MASS)
attach(Smarket)
# Training set
train=(Year<2005)
Smarket.2005=Smarket[!train,]
Direction.2005=Direction[!train]
# LDA model
lda.fit=lda(Direction~Lag1+Lag2,data=Smarket,subset=train)
lda.fit
# Get the correctness
lda.pred=predict(lda.fit, Smarket.2005)
lda.class=lda.pred$class
table(lda.class,Direction.2005)
mean(lda.class==Direction.2005)
# Plot the classification result
plot(Lag1, Lag2, col=Direction)
legend(4.5, 6, c("Down", "Up"),pch="o" ,col=c("black","red"))
abline(lda.fit)
*二次判别分析(quadratic discriminant analysis,QDA)(补充,非线性)
QDA是非线性的,但为了与LDA对比,一并放在这里总结
可用于不同类别的方差和协方差不同,且数据充足的情况
【二次判别函数】【决策规则】
# QDA #
# QDA model
qda.fit=qda(Direction~Lag1+Lag2,data=Smarket,subset=train)
qda.fit
# Get the correctness
qda.class=predict(qda.fit,Smarket.2005)$class
table(qda.class,Direction.2005)
mean(qda.class==Direction.2005)
# Plot the classification result
grid.x = seq(-4,4,0.1)
grid.y = seq(-4,4,0.1)
grid.xy = as.data.frame(expand.grid(grid.x, grid.y))
colnames(grid.xy) = c("Lag1", "Lag2")
qda.class = predict(qda.fit,grid.xy)$class
qda.prob = ifelse(qda.class=="Down", 1, 0)
qda.prob = matrix(qda.prob, length(grid.x), length(grid.y))
contour(grid.x, grid.y, qda.prob,levels=0.5,drawlabels=FALSE)
points(Lag1, Lag2, col=Direction)
legend(3, 4, c("Down", "Up"),pch="o" ,col=c("black","red"))
多分类学习
拆解法:将多分类任务拆为若干个二分类任务,为拆出的每个二分类任务训练一个分类器,在测试时,对这些分类器的预测结果进行集成以获得最终的多分类结果
- 一对一(OvO):对N个类别两两匹配,训练N(N-1)/2个分类器,最终结果投票产生
- 一对其余(OvR / OvA):每次将一个类的样例作为正例,其余类的作为反例训练N个分类器;若测试时仅有一个分类器预测为正类,则对应类别标记为最终分类结果;若有多个分类器预测为正类,通常考虑各分类器的预测置信度,选择置信度最大的类别作为分类结果
- 多对多(MvM):纠错输出码技术(ECOC)- 编码(二元码/三元码)、解码,将距离最小的编码所对应的的类别作为预测结果
![]() |
![]() |
类别不平衡问题(class-imbalance)
分类任务中不同类别的训练样例数目差别很大
基本策略:再缩放 - 令
y
′
1
−
y
′
=
y
1
−
y
×
m
−
m
+
\frac{y'}{1-y'}=\frac y{1-y}\times \frac{m^-}{m^+}
1−y′y′=1−yy×m+m−基于假设“训练集是真实样本总体的无偏采样”
欠采样、过采样、阈值移动
再缩放也是【代价敏感学习】的基础