版权声明:本文为博主原创文章,转载请注明出处
机器学习的研究领域是发明计算机算法,把数据转变为智能行为。机器学习和数据挖掘的区别可能是机器学习侧重于执行一个已知的任务,而数据发掘是在大数据中寻找有价值的东西。
机器学习一般步骤
- 收集数据,将数据转化为适合分析的电子数据
- 探索和准备数据,机器学习中许多时间花费在数据探索中,它要学习更多的数据信息,识别它们的微小差异
- 基于数据训练模型,根据你要学习什么的设想,选择你要使用的一种或多种算法
- 评价模型的性能,需要依据一定的检验标准
- 改进模型的性能,有时候需要利用更高级的方法,有时候需要更换模型
机器学习算法
有监督学习算法
用于分类:k近邻,朴素贝叶斯,决策树,规则学习,神经网络,支持向量机
用于数值预测:线性回归,回归树,模型树,神经网络,支持向量机
无监督学习算法
用于模式识别(数据之间联系的紧密性):关联规则
用于聚类:k均值聚类
R语言机器学习算法实现
kNN(k-Nearest Neighbors,k近邻)
- 原理:计算距离,找到测试数据的k个近邻,根据k个近邻的分类预测测试数据的分类
- 应用k近邻需要将各个特征转换为一个标准的范围(归一化处理),可以应用min-max标准化(所有值落在0~1范围,新数据=(原数据-最小值)/(最大值-最小值)),也可以应用z-score 标准化(新数据=(原数据-均值)/标准差)。
- 对于名义变量(表示类别),可以进行哑变量编码,其中1表示一个类别,0表示其它类别,对于n个类别的名义变量,可以用n-1个特征进行哑变量编码,比如(高,中,低),可以用高、中两类的哑变量表示这三类(高:1是,0 其它,中:1是,0,其它)
- 优点:简单且有效,对数据分布没有要求,训练阶段很快;
- 缺点:不产生模型,在发现特征之间的关系上的能力有限,分类阶段很慢,需要大量的内存,名义变量和缺失数据需要额外处理
- R代码:
使用class包的knn函数,对于测试数据中的每一个实例,该函数使用欧氏距离标识k个近邻,然后选出k个近邻中大多数所属的那个类,如果票数相等,测试实例会被随机分配。
dt_pred <- knn(train = dt_train,test = dt_test,class = dt_train_labels,k = 3) #train:一个包含数值型训练数据的数据库;test:一个包含数值型测试数据的数据框;class训练数据每一行分类的一个因子变量;k:标识最近邻数据的一个整数(通常取实例数的平方根); 该函数返回一个向量,该向量含有测试数据框中每一行的预测分类
尽管kNN是并没有进行任何学习的简单算法,但是却能处理及其复杂的任务,比如识别肿瘤细胞的肿块。 - 对R自带iris数据用kNN进行训练、预测并与实际结果对比
llibrary(class)
library(gmodels)
#prepare data
set.seed(12345) #set random seed in order to repeat the result
iris_rand <- iris[order(runif(150)),]
iris_z <- as.data.frame(scale(iris_rand[,-5])) #z score normalize
train <- iris_z[1:105,]
test <- iris_z[106:150,]
train.label <- iris_rand[1:105,5]
test.label <- iris_rand[106:150,5]
#kNN
pred <- knn(train,test,train.label,k=10)
#comfusion matrix
CrossTable(pred,test.label,prop.r = F,prop.t = F,prop.chisq = F)
这个结果显示kNN对测试数据全部预测正确
朴素贝叶斯分类
- 原理:基于朴素贝叶斯定理,根据先验概率计算预测实例的属于不同类别的总似然,再将某类别的似然除以不同类别似然的和得到预测实例在某类别的概率
- 应用朴素贝叶斯算法每个特征必须是分类变量,对于数值型变量,可以将数值型特征离散化(分段),可以根据直方图查看数据明显的分隔点,如果没有明显的分隔点,可以使用三分位数,四分位数,五分位数,分段太少会把重要信息丢失
- 拉普拉斯估计:对于某些从来没有出现的概率为0的,会影响概率的估计,拉普拉斯估计本质上是在概率表的每个计数加上一个较小的数,这样保证每一类中每个特征发生的概率是非零的。
- 优点:简单、快速、有效;能处理噪声数据和缺失数据;需要用来训练的例子相对较少,但同样能处理好大量的例子;很容易获得一个预测的估计概率值;
- 缺点:依赖于一个常用的错误假设,即一样的重要性和独立特征;应用在大量数值特征的数据集时并不理想;概率的估计值相对于预测的类而言更加不可靠。
- R代码:
使用维也纳理工大学统计系开发的e1071添加包中的naiveBayes
m <- naiveBayes(train,class,laplace=0) #train:数据框或者包含训练数据的矩阵,class:包含训练数据每一行的分类的一个因子向量,laplace:控制拉普拉斯估计的一个数值,可以进行调节看是否会提高模型性能;该函数返回一个朴素贝叶斯模型对象,该对象能够用于预测
p <- predict(m,test,type="class") #m:由函数naiveBays( )训练的一个模型 ,test:数据框或者包含测试数据的矩阵,包含与用来建立分类器的训练数据的相同特征;type:值为"class"或者"raw",标识预测向量最可能的类别值或者原始预测的概率值
library(e1071)
library(gmodels)
set.seed(12345) #set random seed in order to repeat the result
iris_rand <- iris[order(runif(150)),]
train <- iris_rand[1:105,-5]
test <- iris_rand[106:150,-5]
train.label <- iris_rand[1:105,5]
test.label <- iris_rand[106:150,5]
#tranform numerical variable to classified variable
conver_counts <- function(x){
q <- quantile(x)
sect1 <- which(q[1] <= x & x<= q[2])
sect2 <- which(q[2 ]< x & x <= q[3])
sect3 <- which(q[3]< x & x <= q[4])
sect4 <- which(q[4]< x & x <= q[5])
x[sect1] <- 1
x[sect2] <- 2
x[sect3] <- 3
x[sect4] <- 4
return(x)
}
train <- apply(train,2,conver_counts)
#naiveBayes
m <- naiveBayes(train,train.label,laplace=1)
pred <- predict(m,test,type="class")
#comfusion matrix
CrossTable(pred,test.label,prop.r = F,prop.t = F,prop.chisq = F)
可见对第一类(setosa)分类上预测错误率很高,这可能反映了朴素贝叶斯算法的缺点,对于处理大量数值特征数据集时并不理想
决策树
- 原理:以树形结构建立模型。使用一种称为递归划分的探索法。这种方法通常称为分而治之,因为它利用特征的值将数据分解为具有相似类的较小的子集。从代表整个数据集的数据结点开始,该算法选择最能预测目标类的特征,然后,这些案例将被划分到这一特征的不同值的组中,这一决定形成了第一组树枝。该算法继续分而治之其他结点,每次选择最佳的候选特征,直到达到停止的标准。如果一个节点停止,它可能具有下列情况:节点上所有(几乎所有)的案例都属于同一类,没有剩余的特征来分辩案例之间的区别,决策树已经达到了预先定义的大小限制。
- C5.0算法,时最知名的决策树算法之一,单线程版本的源代码是公开的,R中有编写好的该程序。C5.0算法已经成为生成决策树的行业标准,因为它适用于大多数类型的问题,并且可以直接使用。与其它先进的机器学习模型(神经网络和支持向量机&