1. 程式人生 > >R語言完整決策樹程式碼

R語言完整決策樹程式碼

#loadData
loadData <- function(){
  dataSet = matrix(c(1,1,0,"yes",1,1,1,"yes",1,0,1,"no",0,1,0,"no",0,1,1,"no"),byrow = T, nrow =5)
  colnames(dataSet) = c("a","b","c","labels")
  return (dataSet)
}

#computing ShannonEnt 實現夏農熵
calShannonEnt <- function(dataSet){
  numEntries = nrow(dataSet)
  labels = levels(factor(dataSet[,"labels"]))
  labelCount = NULL
  labelCount[labels] = rep(0,length(labels))
  for(i in 1:numEntries){
    if(dataSet[i,"labels"] %in% labels){
      temp = dataSet[i,"labels"]
      labelCount[temp] = labelCount[temp] + 1
    }
  }
  t = NULL
  shannonEnt = 0
  for(i in  1:length(labelCount)){
    t[i]= labelCount[i]*1.0 / numEntries
    shannonEnt = -t[i]*log2(t[i]) + shannonEnt
  }
#  labelCount = as.numeric(labelCount)
  return (shannonEnt)
}

#劃分資料集 split DataSet
splitDataSet <- function(dataSet,axis,value){
  retDataSet = NULL
  for(i in 1:nrow(dataSet)){
    if(dataSet[i,axis] == value){
      tempDataSet = dataSet[i,]
      retDataSet = rbind(retDataSet,tempDataSet)
    }
  }
  rownames(retDataSet) = NULL
  return (retDataSet)
}

#choose Best Feature To Split 選擇最好的資料集
chooseBestFeatureToSplita <- function(dataSet){
  numFeatures = ncol(dataSet) - 1
  baseEntropy = calShannonEnt(dataSet)
  #最大資訊增益
  bestInfoGain = 0.0
  bestFeature = -1 
  for(i in  1: numFeatures){
    featureLabels = levels(factor(dataSet[,i]))
   # featureLabels = as.numeric(featureLabels)
    newEntropy = 0.0
    for( j in 1:length(featureLabels)){
      subDataSet = splitDataSet(dataSet,i,featureLabels[j])
      prob = length(subDataSet[,1])*1.0/nrow(dataSet)
      newEntropy = newEntropy + prob*calShannonEnt(subDataSet)
    }
    infoGain = baseEntropy - newEntropy
    if(infoGain > bestInfoGain){
      bestInfoGain = infoGain
      bestFeature = i
    }
  }
  return (bestFeature)
} 

#最終判斷屬於哪一類的條件
majorityCnt <- function(classList){
  classCount = NULL
  count = as.numeric(table(classList))
  majorityList = levels(as.factor(classList))
  if(length(count) == 1){
    return (majorityList[1])
  }else{
    f = max(count)
    return (majorityList[which(count == f)][1])
  }
}

#little trick for R Language,judgement whether belongs to one classify
trick <- function(classList){
  count = as.numeric(table(classList))
  if(length(count) == 1){
    return (TRUE)
  }else
    return (FALSE)
}

#遞迴建立生成樹
creatTree <- function(dataSet){########temp是所有的需要分割的特徵
  decision_tree = list()
  classList = dataSet[,"labels"]
    #判斷是否屬於同一類
  if(trick(classList))
    return (rbind(decision_tree,classList[1]))
  #是否在矩陣中只剩Label標籤了,若只剩Label標籤,則都分完了
  if(ncol(dataSet) == 1){
    decision_tree = rbind(decision_tree,majorityCnt(classList))
    return (decision_tree)
  }
  #資料集中只剩下一個元素了 
  ########選擇bestFeature作為分割屬性
  bestFeature = chooseBestFeatureToSplita(dataSet)
  ########,接下來就需要把它刪除
  labelFeature = colnames(dataSet)[bestFeature]
  #DIECISION TREE
  decision_tree = rbind(decision_tree,labelFeature)
  #選中了那個標籤作為此次分類標籤 
  t = dataSet[,bestFeature]
  temp_tree = data.frame()
  for(j in 1:length(levels(as.factor(t)))){
    #這個標籤的兩個屬性,比如“yes”,“no”,所屬的資料集
    dataSet = splitDataSet(dataSet,bestFeature,levels(as.factor(t))[j])
    dataSet[,-bestFeature]
    #遞迴呼叫這個函式
    temp_tree = creatTree(dataSet)
    decision_tree = rbind(decision_tree,temp_tree)
  }
  
  return (decision_tree)
}
#載入資料
dataSet = loadData()
#建立決策樹
t = creatTree(dataSet)


相關推薦

R語言完整決策程式碼

#loadData loadData <- function(){ dataSet = matrix(c(1,1,0,"yes",1,1,1,"yes",1,0,1,"no",0,1,0,"no",0,1,1,"no"),byrow = T, nrow =5)

r語言決策程式碼實現

0.節點和結點的區別:節點為兩線相交,不為終點;而結點為兩線相交為終點,沒有延伸; 1.分支節點:它指向其他的節點,所以是度不為0的節點。 vs 葉子結點:度為0的結點 2.度:結點擁有的子樹數;就是說這個結點下面有幾條分支 3.樹的深度:樹有幾層 4.10折交叉驗證:常用

R語言--統計--決策

library(tree) Heart = read.csv("yumath.csv",header=TRUE,na.strings="NA") fit = tree(y1 ~ x1 + x2+ x3+x4+x5, Heart) summary(fit) plot(fit) text(fit)

r語言決策模型(少廢話版本)

#第1步:工作目錄和資料集的準備 setwd("C:/Users/IBM/Desktop/170222分類樹建模/2.23建模")#設定當前的工作目錄,重要! audit2<-read.csv("model2.csv",header=T) str(audit2) #轉

R語言決策和隨機森林

總結決策樹之前先總結一下特徵的生成和選擇,因為決策樹就是一種內嵌型的特徵選擇過程,它的特徵選擇和演算法是融合在一起的,不需要額外的特徵選擇。 一、特徵生成: 特徵生成是指在收集資料之時原始資料就具有的資料特徵,這些資料特徵由收集的資料決定(其實也就是在產品定型時設定的需要收

R語言編寫決策(rpart)CART ID3演算法

決策樹(decision tree)是一類常見的機器學習方法。以二分類任務為例,我們希望從給定訓練資料集學得一個模型用以對新示例進行分類,這個把樣本分類的任務,可看做對“當前樣本屬於正常嗎?”這個問題的‘決策’或者‘判定’過程。顧名思義,決策樹是基於樹結構來進行

基於C++語言決策實現

   感覺好久都沒有寫過程式了,一直上課沒有時間。最近有點空,然後就寫了下西瓜書中的決策樹的實現。由於本人才疏學淺,採用的實現方式和資料結構可能不合理,沒有考慮程式碼的複雜度和時間複雜度等等,僅寫下自己的實現想法(大神們就打擾了)。該程式是基於C++語言來實現的,演算法就是西瓜書

python實現決策程式碼

資料圖片 from sklearn.feature_extraction import DictVectorizer import csv from sklearn import preprocessing from numpy import * import nu

R語言:畫

原始資料長這樣: “iyear”表示年份;“nkill”表示死亡人數;“region”表示地區;“總計”表示某年份死亡總人數;nkii裡的缺失資料自動按“0”運算。 資料儲存在名為“ljs”的csv格式裡。 應提前下載好treemap包,先介紹treemap函式

ID3決策程式碼詳解(weka平臺)

1 ID3演算法流程 理論知識不必多講,下面講解ID3演算法的工作流程,以西瓜書為例: 2 演算法程式碼講解 2.1 前提必知 2.2 演算法流程 3:程式碼 整個演算法實際就 makeTree和distributionForInsta

機器學習:決策過擬合與剪枝,決策程式碼實現(三)

文章目錄 楔子 變數 方法 資料預處理 剪枝 獲取待剪集: 針對ID3,C4.5的剪枝 損失函式的設計 基於該損失函式的演算法描述 基於該損失函式的程式碼實

機器學習:結點的實現,決策程式碼實現(二)

文章目錄 楔子 定義變數: 定義方法 獲得劃分的feature 生成結點 停止條件及其處理 fit() 生成樹剪枝 楔子 前面已經實現了各種資訊量的計算,那麼我們劃分的基本有了,那

機器學習:資訊熵,基尼係數,條件熵,條件基尼係數,資訊增益,資訊增益比,基尼增益,決策程式碼實現(一)

文章目錄 初始化,涉及到使用的變數: 資訊熵 定義公式,經驗公式 程式碼: 基尼係數 定義公式,經驗公式 程式碼: 條件熵,條件基尼係數 條件熵定義公式,經驗公式

【機器學習】CART分類決策+程式碼實現

1. 基礎知識 CART作為二叉決策樹,既可以分類,也可以迴歸。 分類時:基尼指數最小化。 迴歸時:平方誤差最小化。 資料型別:標值型,連續型。連續型分類時採取“二分法”, 取中間值進行左右子樹的劃分。 2. CART分類樹 特徵A有N個取值,將每個取值作為分界點,將資料

讀書筆記:機器學習實戰(2)——章3的決策程式碼和個人理解與註釋

首先是對於決策樹的個人理解: 通過尋找最大資訊增益(或最小資訊熵)的分類特徵,從部分已知類別的資料中提取分類規則的一種分類方法。 資訊熵: 其中,log底數為2,額,好吧,圖片我從百度截的。。 這裡只解釋到它是一種資訊的期望值,深入的請看維基百科

《機器學習實戰》第三章決策 程式碼

from math import logimport operatordef calcShannonEnt(dataSet):numEntries=len(dataSet)labelCounts={}for featVec in dataSet:currentLabel=fe

機器學習實戰python版第三章決策程式碼理解

今天開始學習第三章決策樹。 前面對決策樹的講解我就不寫了,書上寫的都很清楚,就是根據特徵的不同逐步的對資料進行分類,形狀像一個倒立的樹。決策樹演算法比kNN的演算法複雜度要低,理解起來也有一定難度。 資訊增益 每一組資料都有自己的熵,資料要整齊,熵越低。也就是說屬於同一類的

R語言學習系列(資料探勘之決策演算法實現--ID3程式碼篇)

轉載自:http://blog.csdn.net/hawksoft/article/details/7760868 1、輔助類,用於計算過程和結果儲存 [csharp] view plaincopyprint? /// &

決策ID3原理及R語言python程式碼實現(西瓜書)

決策樹ID3原理及R語言python程式碼實現(西瓜書) 摘要: 決策樹是機器學習中一種非常常見的分類與迴歸方法,可以認為是if-else結構的規則。分類決策樹是由節點和有向邊組成的樹形結構,節點表示特徵或者屬性, 而邊表示的是屬性值,邊指向的葉節點為對應的分類。在對樣本的分類過程中,由頂向下,根據特徵或屬性

R語言專題,如何使用party包構建決策

r語言下面將在iris數據集上,演示如何使用party包中的函數ctree來建立一棵決策樹。iris數據集中的Sepal.Length、Sepal.Width、Petal.Length和Petal.Width,都將用來預測鳶尾花的種類。party包中的函數ctree用來建立決策樹,函數predict用來對新數