欢迎访问个人主页,目前访问量太低,百度搜不到的说。。。谢谢鼓励
读书笔记,并不打算翻译全文,打算将书中重要的知识点结合自己的理解将其分享,并在最后附上R语言相关函数应用,作为自己最近一段时间在机器学习方面学习总结。如果理解不正确,望指正。
ISLR,全称为An Introduction to Statistical Learning with Applications in R,算是the Elements of Statistical Learning的基础版,里面公式推导并不多,主要是讲解统计学习中的一些常用方法,以及相关方法在R语言上的应用。ISLR官方并没用出习题的答案,不过已经有人做了一份,可以学习参考ISLR答案
这一章讲解了三种分类方法。
1. Logistic Regression(逻辑回归)
2. Linear Discriminant Analysis
3. Quadratic Discriminant Analysis
下面就逐一分析一下四种分类并进行对比。
1.Logistic Regression(逻辑回归)
公式:
一般来讲,逻辑回归适合于2种问题的分类,大于2种的分类问题一般采用Discriminant Analysis(判别式分析)。
2.Linear Discriminant Analysis(线性判别式)
事实上判别式方法就是在原有的贝叶斯理论的基础上增加了对模型分布服从正态分布的假设,在线型判别式中,假设不同变量的协方差是相同的
左图中椭圆就是正态分布曲线,两两相交的边界线形成了分类的边界,右图中实线是贝叶斯估计也就是实际的分界线,可以发现,线性判别式法准确度还是很好的。
3.Quadratic Discriminant Analysis(二次判别式)
二次判别式法与线性判别式法唯一的区别就是,假设不同的变量的协方差是不同的,这造成了分界线变现在图像上是弯曲的,将自由度从 p(p+1)/2 增加到了 Kp(p+1)/2 ,K是变量的数量。增加自由度造成的影响可以在读书笔记(1)中看到。
紫色的虚线代表实际的分界线,黑色的虚线代表线性判别式的分界线,绿色的实线代表二次判别式的分界线。可以看到当分界线为线性时,线性判别式法表现较好;当分界线为非线性时,则刚好相反。
4.总结
当实际分界线为线性时,如果数据接近正态分布假设,则线性判别式法表现较好,如果数据并不接近正态分布假设,则逻辑回归法表现较好。
当实际分界线为非线性时,二次将拟合二次判别式,其他的更高次或者不规则情况下,KNN表现优异。
1.导入数据及准备
> library(ISLR)
> dim(Caravan)
[1] 5822 86
> attach(Caravan)
> summary(Purchase)No Yes
5474 348
因为后面要用到KNN,需要用到距离,所以将变量进行一下归一化处理,归一化程序就一句话,后面几句是显示一下归一化效果。
> standardized.X = scale(Caravan[,-86])
> var(Caravan[,1])
[1] 165.0378
> var(Caravan[,2])
[1] 0.1647078
> var(standardized.X[,1])
[1] 1
> var(standardized.X[,2])
[1] 1
建立测试样本和训练样本
> test = 1:1000
> train.X = standardized.X[-test,]
> test.X = standardized.X[test,]
> train.Y = Purchase[-test]
> test.Y = Purchase[test]
2.Logistic Regression(逻辑回归)
> glm.fit = glm(Purchase~., data=Caravan, family = binomial, subset = -test)
Warning message:
glm.fit: fitted probabilities numerically 0 or 1 occurred
> glm.probs = predict(glm.fit, Caravan[test, ], type="response")
> glm.pred = rep("No", 1000)
> glm.pred[glm.probs>.5]="Yes"
> table(glm.pred, test.Y)test.Y
glm.pred No YesNo 934 59Yes 7 0
> mean(glm.pred == test.Y)
[1] 0.934
3.Linear Discriminant Analysis(线性判别式)
> library(MASS)
> lda.fit = lda(Purchase~.,data = Caravan, subset = -test)
> lda.pred = predict(lda.fit, Caravan[test,])
> lda.class = lda.pred$class
> table(lda.class, test.Y)test.Y
lda.class No YesNo 933 55Yes 8 4
> mean(lda.class==test.Y)
[1] 0.937
4.Quadratic Discriminant Analysis(二次判别式)
> qda.fit = qda(Purchase~.,data = Caravan, subset = -test)
Error in qda.default(x, grouping, ...) : rank deficiency in group Yes
> qda.fit = qda(Purchase~ABYSTAND+AINBOED,data = Caravan, subset = -test)
发现直接训练会发生错误。。。尝试两个变量成功了,感觉是维度太高,目前没有发现解决办法,其他的应用与LDA相似
5.KNN
参数k是可以自己选择的,应注意knn函数变量的输入顺序
> library(class)
> knn.pred = knn(train.X, test.X, train.Y,k=1)
> mean(test.Y==knn.pred)
[1] 0.882
本文发布于:2024-02-02 22:41:53,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170688491446924.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |