机器学习西瓜书 学习笔记(三)— 线性模型(分类模型)


逻辑回归 / 对数几率回归(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+ez1=1+e(wTx+b)1ln1yy=wTx+b y y y:样本 x \bm x x 作为正例的可能性 1 − y \qquad 1-y 1y:样本 x \bm x x 作为反例的可能性
【几率比 (odds ratio)】 x \bm x x 作为正例的相对可能性 y 1 − y \qquad \frac y{1-y} 1yy
【对数几率 (log odds,logit) 】 ln ⁡ y 1 − y \qquad \ln \frac y{1-y} ln1yy
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=Φ(xw)=xwϕ(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^+} 1yy=1yy×m+m基于假设“训练集是真实样本总体的无偏采样”
欠采样、过采样、阈值移动
再缩放也是【代价敏感学习】的基础

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值