专栏首页素质云笔记转载︱案例 基于贪心算法的特征选择

转载︱案例 基于贪心算法的特征选择

本文转载于R语言中文社区,详情链接

相关帖子

转载︱案例 基于贪心算法的特征选择

用GA算法设计22个地点之间最短旅程-R语言实现

————————————————————————————————————————————————————————

greedy Algorithm Feature Selection

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑, 它所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心 策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

算法设计:

  1. 初始化问题的目标值
  2. while(实现优化目标的约束条件){ 利用筛选策略,求出解空间的一个可行解 }
  3. 将所有可行解组合成目标解空间。
options(warn = -1)
require(magrittr)
require(dplyr)
require(glmnet)
# Greedy Algorithm
GreedyAlgorithm = function(dataSet) {
  # 基于逻辑回归,以AUC作为评价指标,采用贪心算法进行特征筛选
  # 
  # Args:
  #   dataSet: A dataframe that contains a feature "label"
  # 
  # Returns:
  #   A vector of selected features
  features = data.frame(name = colnames(dataSet)) %>%
    dplyr::filter(name != "label")  # select all features of the dataSet except "label"
  features = as.vector(features$name)    
  featureSelect = c("label")  # init the feature vector to be selected
  scoreBefore = data.frame()  # init the storage whice stores the (feature,aucScore) tuple from the end of each iteration 
  while((nrow(scoreBefore)<2||scoreBefore[length(scoreBefore),2]>
        scoreBefore[length(scoreBefore) - 1,2])&&nrow(scoreBefore)<length(features)){
    score = data.frame()
    for(feature in features){
      if(length(intersect(feature,featureSelect)) == 0){
        trainData = dataSet[,append(featureSelect,feature)]
        model = glm(label~.,family = "binomial",data = trainData,epsilon = 1e-10)
        prediction = predict(model,trainData)
        aucValue = auc(trainData$label,prediction)
        score = rbind(score,data.frame(feature = feature,aucValue = aucValue))
      }
    }
    featureSelect = unique(append(featureSelect,as.character(score[which.max(score$aucValue),1])))
    scoreBefore = rbind(scoreBefore,score[which.max(score$aucValue),])
  }
  featureSelect = head(featureSelect,length(featureSelect)-1)  # delete the last feature that can't fit the iteration condition 
  return(featureSelect[-1])  # reture the selected features except "label"
}

KS值表征了模型将正例和负例区分开来的能力。值越大,模型的预测准确性越好。通常情况下,KS>0.3即可认为模型有比较好的预测准确性。

KS值计算方法:

将所有样本根据预测得分从低到高排序均分成N组,分别计算这N组的实际好样本数、坏样本数、累积好样本数、累积坏样本数、累积好样本数占比、 累积坏样本数占比,差值。其中,实际好坏样本数分别为该组内的好坏样本数,累积好坏样本数为该组累积的好坏样本数,累积好坏样本数占比为 累积好坏样本数占总好坏样本数的比值,差值为累积坏样本数占比减去累计好样本数占比。KS指标为差值绝对值的最大值。

# ksValue
KsValue = function(prediction,n){
  # Compute the ks value of a model
  # 
  # Args:
  #   prediction: A vector that the prediction of a model
  #   n: The group number 
  # 
  # Returns:
  #   A vector that the difference value between the rate cumulative bad sample and the rate of cumulative good sample 
  dataResult = sort(prediction,decreasing = T)
  a = c()
  b = c()
  c = c()
  a[1] = 0
  b[1] = 0
  c[1] = 0
  if(length(dataResult)%%n==0){
    cut = length(dataResult)/n
    for (i in 2:(n+1)) {
      a[i] = sum(dataResult[(cut*(i-2)+1):(cut*(i-1))])
      b[i] = length(dataResult[(cut*(i-2)+1):(cut*(i-1))])-a[i]
    }
  }else{
    cut = round(length(dataResult)/n)
    for (i in 2:n) {
      a[i] = sum(dataResult[(cut*(i-2)+1):(cut*(i-1))])
      b[i] = length(dataResult[(cut*(i-2)+1):(cut*(i-1))])-a[i]
    }
    a[n+1] = sum(dataResult[(cut*(n-2)+1):(cut*(n-1))])
    b[n+1] = length(dataResult[(cut*(n-2)+1):(cut*(n-1))])-a[n+1]
  }
  c = abs(cumsum(a)/sum(a)-cumsum(b)/sum(b))
  return(c)
}
require(caret)
require(pROC)
data = read.csv("/data/workspace/Rworkspace/data_test.csv",encoding = "UTF-8")
data %<>%
  mutate(label = ifelse(target>30,1,0))
data = data[,-1]
data = data.frame(apply(data, 2, function(x) ifelse(is.na(x),median(x,na.rm = T),x)))
# 剔除近似常量的变量
# feature1 = nearZeroVar(data)
# data = data[,-feature1]
# 剔除相关度过高的自变量
# dataCor = cor(data)
# highcor = findCorrelation(dataCor,0.8)
# data = data[,-highcor]
# 利用贪心算法进行特征选择
# feature = GreedyAlgorithm(dataSet = data)
load("/data/workspace/Rworkspace/featureSelect.RData")  # 数据量较大,生成html过程中该算法比较耗时,所以直接加载测试时已经选取的特征
set.seed(521)
ind = base::sample(2,nrow(data),replace=T,prob=c(0.7,0.3))
trainData = data[ind==1,]
testData = data[ind==2,]
model = cv.glmnet(as.matrix(trainData[,feature]),trainData[,"label"],
                    family = "binomial",type.measure = "auc",alpha = 0,
                    lambda.min.ratio = 0.0001)
prediction = predict(model,as.matrix(testData[,feature]),s="lambda.min",type="response")
# compute ksValue
ksValue = KsValue(prediction,10)
par(mfrow = c(2,1))
plot(density(ksValue),type = 'l',main = "ksValue Plot",xlab = "cutPoint",ylab = "density_ks")
ks_value = max(ksValue)
text(.2,1.0,paste("ksValue = ",ks_value))
roc(testData$label, as.vector(prediction), auc = T,plot = T,print.auc=T)
## 
## Call:
## roc.default(response = testData$label, predictor = as.vector(prediction),     auc = T, plot = T, print.auc = T)
## 
## Data: as.vector(prediction) in 5130 controls (testData$label 0) < 429 cases (testData$label 1).
## Area under the curve: 0.7385
par(mfrow=c(1,1))

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • R语言中的因子型变量

    R语言的数据类型中,因子(Factor)型比较特殊,也让许多初学者感到难以理解。其实就像整型用来存储整数、字符型用来存储字符或字符串类似,因子型是用来存储类别的...

    三猫
  • 100篇泛癌研究文献解读之癌症相关基因的饱和度分析

    为了分析不同类型、组织起源肿瘤的共性、差异以及新课题。TCGA于2012年10月26日-27日在圣克鲁兹,加州举行的会议中发起了泛癌计划。参考:https://...

    生信技能树
  • 【01】从零开始学Python—数据分析与挖掘概述

    马云曾说“中国正迎来从IT时代到DT时代的变革”,DT就是大数据时代。数据已成为企业的核心资产和宝贵资源,企业愈加重视和善加利用数据分析与挖掘技术。

    1480
  • 巧用R语言中常见的各类偏移窗口函数

    已经介绍了R语言中的排名窗口函数,本节介绍一下R语言中的偏移窗口函数,如果使用纯R语言语句实现“偏移”效果,很是复杂,可以说偏移窗口函数是处理“偏移”数据...

    1480
  • (免费课程转载)3小时课程带你重复一篇3分生信SCI(中)

    大家好,欢迎再次来到MedGo干货课堂,在上期3小时课程带你重复一篇3分生信SCI(上)中,我们着重为大家讲解了GEO芯片的meta分析。很多同学和老师课后向我...

    用户1359560
  • 巧用R中的各种排名窗口函数

    在sql中巧用窗口函数可以解决很多复杂的问题,窗口函数有4种函数类型:排名函数、偏移函数、聚合函数和分布函数,详细介绍可以浏览:

    1480
  • 这大概是今年最值得推荐的“数据分析工具”

    BI全称商业智能(Business Intelligence),在传统企业中,它是一套完整的解决方案。将企业的数据有效整合,快速制作出报表以作出决策。涉及数据仓...

    用户5406627
  • 100篇泛癌研究文献解读之生存分析相关基因

    为了分析不同类型、组织起源肿瘤的共性、差异以及新课题。TCGA于2012年10月26日-27日在圣克鲁兹,加州举行的会议中发起了泛癌计划。参考:https://...

    生信技能树
  • TCGA年度(共4年)研讨会资料分享

    TCGA年度(共4年)研讨会PPT官网是: http://www.genome.gov/17516564

    生信技能树
  • ICML 2019论文接收结果可视化:清华、北大、南大榜上有名

    接收论文列表:https://icml.cc/Conferences/2019/AcceptedPapersInitial

    机器之心

扫码关注云+社区

领取腾讯云代金券