创建因子的函数介绍如下:
factor(x, levels = sort(unique(x), na.last = TRUE),
labels = levels, exclude = NA, ordered = is.ordered(x))
levels 用来指定因子可能的水平(缺省值是向量x中互异的值);labels
用来指定水平的名字;exclude表示从向量x中剔除的水平值;ordered是
一个逻辑型选项用来指定因子的水平是否有次序。回想数值型或字符型
的x。
>factor(1:3)
[1] 1 2 3
Levels: 1 2 3
>factor(1:3, levels=1:5)
[1] 1 2 3
Levels: 1 2 3 4 5
>factor(1:3, labels=c("A", "B", "C"))
[1] A B C
Levels: A B C
>factor(1:5, exclude=4)
[1] 1 2 3 NA 5
Levels: 1 2 3 5
函数levels用来提取一个因子中可能的水平值:
>f <- factor(c(2, 4), levels=2:5)
>f
[1] 2 4
Levels: 2 3 4 5
>levels(f)
[1] "2" "3" "4" "5"
因子用来存储类别变量(categorical variables)和有序变量,这类变量不能用来计算而只能用来分类或者计数。因子表示分类变量,有序因子表示有序变量。生成因子数据对象的函数是factor(),语法是factor(data, levels, labels, ...),其中data是数据,levels是因子水平向量,labels是因子的标签向量。
1、创建一个因子。
例1:
>colour <- c('G', 'G', 'R', 'Y', 'G', 'Y', 'Y', 'R', 'Y')
>col <- factor(colour)
>col1 <- factor(colour, levels = c('G', 'R', 'Y'), labels = c('Green', 'Red', 'Yellow')) #labels的内容替换colour相应位置对应levels的内容
>col2 <- factor(colour, levels = c('G', 'R', 'Y'), labels = c('1', '2', '3'))
>col_vec <- as.vector(col2) #转换成字符向量
>col_num <- as.numeric(col2) #转换成数字向量
>col3 <- factor(colour, levels = c('G', 'R'))
2、创建一个有序因子。
例1:
>score <- c('A', 'B', 'A', 'C', 'B')
>score1 <- ordered(score, levels = c('C', 'B', 'A'))
>score1
[1] A B A C B
Levels: C <B <A
3、用cut()函数将一般的数据转换成因子或有序因子。
例1:
>exam <- c(98, 97, 52, 88, 85, 75, 97, 92, 77, 74, 70, 63, 97, 71, 98,
65, 79, 74, 58, 59, 60, 63, 87, 82, 95, 75, 79, 96, 50, 88)
>exam1 <- cut(exam, breaks = 3) #切分成3组
>exam1
[1] (82,98] (82,98] (50,66] (82,98] (82,98] (66,82] (82,98] (82,98] (66,82]
[10] (66,82] (66,82] (50,66] (82,98] (66,82] (82,98] (50,66] (66,82] (66,82]
[19] (50,66] (50,66] (50,66] (50,66] (82,98] (66,82] (82,98] (66,82] (66,82]
[28] (82,98] (50,66] (82,98]
Levels: (50,66] (66,82] (82,98]
>exam2 <- cut(exam, breaks = c(0, 59, 69, 79, 89, 100)) #切分成自己设置的组
>exam2
[1] (89,100] (89,100] (0,59] (79,89] (79,89] (69,79] (89,100] (89,100]
[9] (69,79] (69,79] (69,79] (59,69] (89,100] (69,79] (89,100] (59,69]
[17] (69,79] (69,79] (0,59] (0,59] (59,69] (59,69] (79,89] (79,89]
[25] (89,100] (69,79] (69,79] (89,100] (0,59] (79,89]
Levels: (0,59] (59,69] (69,79] (79,89] (89,100]
>attr(exam1, 'levels')
[1] "(50,66]" "(66,82]" "(82,98]"
>attr(exam2, 'levels')
[1] "(0,59]" "(59,69]" "(69,79]" "(79,89]" "(89,100]"
>attr(exam2, 'class')
[1] "factor"
#一个有序因子
>x <- factor(rep(1:5,3))
>ordered(x,labels = c('a1','a2','a3','a4','a5'))
[1] a1 a2 a3 a4 a5 a1 a2 a3 a4 a5 a1 a2 a3 a4 a5
Levels: a1 <a2 <a3 <a4 <a5
TP (true positives):正类被判断为正类;
FP (false positives):负类被判断为负类;
FN (false negatives):正类被判断为负类;
TN (true negatives):负类被判断为负类;
精确率(precision): 是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是真正的正样本。那么预测为正就有两种可能了,一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP);
召回率(recall): 表示的是样本中的正例有多少被预测正确了。那也有两种可能,一种是把原来的正类预测成正类(TP),另一种就是把原来的正类预测为负类(FN);
准确率(accuracy): 所有的预测正确(正类负类)的占总的比重。
F-score值: F1值为算数平均数除以几何平均数,且越大越好,将Precision和Recall的上述公式带入会发现,当F1值小时,True Positive相对增加,而false相对减少,即Precision和Recall都相对增加,即F1对Precision和Recall都进行了加权。
1. 准确率
虽然准确率能够判断总的正确率,但是在样本不均衡的情况下,并不能作为很好的指标来衡量结果。
比如在样本集中,正样本有90个,负样本有10个,样本是严重的不均衡。对于这种情况,我们只需要将全部样本预测为正样本,就能得到90%的准确率,但是完全没有意义。对于新数据,完全体现不出准确率。因此,在样本不平衡的情况下,得到的高准确率没有任何意义,此时准确率就会失效。所以,我们需要寻找新的指标来评价模型的优劣。
2 . 精确率
精确率(Precision) 是针对预测结果而言的,其含义是在被所有预测为正的样本中实际为正样本的概率,精确率和准确率看上去有些类似,但是是两个完全不同的概念。精确率代表对正样本结果中的预测准确程度,准确率则代表整体的预测准确程度,包括正样本和负样本。
3. 召回率
召回率(Recall) 是针对原样本而言的,其含义是在实际为正的样本中被预测为正样本的概率。
准确率和召回率互相影响,理想状态下肯定追求两个都高,但是实际情况是两者相互“制约”:追求准确率高,则召回率就低;追求召回率高,则通常会影响准确率。我们当然希望预测的结果precision越高越好, recall越高越好, 但事实上这两者在某些情况下是矛盾的。这样就需要综合考虑它们,最常见的方法就是F-score。 也可以绘制出P-R曲线图,观察它们的分布情况。
4. F-score
一般来说准确率和召回率呈负相关,一个高,一个就低,如果两个都低,一定是有问题的。 一般来说,精确度和召回率之间是矛盾的,这里引入F1-Score作为综合指标,就是为了平衡准确率和召回率的影响,较为全面地评价一个分类器。F1是精确率和召回率的调和平均。