| Type: | Package | 
| Title: | Selecting Attributes | 
| Version: | 0.34 | 
| Date: | 2023-08-22 | 
| Author: | Piotr Romanski, Lars Kotthoff, Patrick Schratz | 
| Maintainer: | Lars Kotthoff <larsko@uwyo.edu> | 
| BugReports: | https://github.com/larskotthoff/fselector/issues | 
| URL: | https://github.com/larskotthoff/fselector | 
| Description: | Functions for selecting attributes from a given dataset. Attribute subset selection is the process of identifying and removing as much of the irrelevant and redundant information as possible. | 
| License: | GPL-2 | 
| Imports: | digest, entropy, randomForest, RWeka | 
| Suggests: | mlbench, rpart | 
| Encoding: | UTF-8 | 
| LazyLoad: | yes | 
| NeedsCompilation: | no | 
| Packaged: | 2023-08-22 14:17:42 UTC; larsko | 
| Repository: | CRAN | 
| Date/Publication: | 2023-08-22 17:10:02 UTC | 
Package for selecting attributes
Description
Package containing functions for selecting attributes from a given dataset and a destination attribute.
Details
This package contains:
- -Algorithms for filtering attributes: cfs, chi.squared, information.gain, gain.ratio, symmetrical.uncertainty, linear.correlation, rank.correlation, oneR, relief, consistency, random.forest.importance 
- -Algorithms for wrapping classifiers and search attribute subset space: best.first.search, backward.search, forward.search, hill.climbing.search 
- -Algorithm for choosing a subset of attributes based on attributes' weights: cutoff.k, cutoff.k.percent, cutoff.biggest.diff 
- -Algorithm for creating formulas: as.simple.formula 
Author(s)
Piotr Romanski
Maintainer: Lars Kotthoff <larsko@uwyo.edu>
Converting to formulas
Description
Converts character vector of atrributes' names and destination attribute's name to a simple formula.
Usage
as.simple.formula(attributes, class)
Arguments
| attributes | character vector of attributes' names | 
| class | name of destination attribute | 
Value
A simple formula like "class ~ attr1 + attr2"
Author(s)
Piotr Romanski
Examples
  data(iris)
  result <- cfs(Species ~ ., iris)
  f <- as.simple.formula(result, "Species")
Best-first search
Description
The algorithm for searching atrribute subset space.
Usage
best.first.search(attributes, eval.fun, max.backtracks = 5)
Arguments
| attributes | a character vector of all attributes to search in | 
| eval.fun | a function taking as first parameter a character vector of all attributes and returning a numeric indicating how important a given subset is | 
| max.backtracks | an integer indicating a maximum allowed number of backtracks, default is 5 | 
Details
The algorithm is similar to forward.search besides the fact that is chooses the best node from all already evaluated ones and evaluates it. The selection of the best node is repeated approximately max.backtracks times in case no better node found.
Value
A character vector of selected attributes.
Author(s)
Piotr Romanski
See Also
forward.search, backward.search, hill.climbing.search, exhaustive.search 
Examples
  library(rpart)
  data(iris)
  
  evaluator <- function(subset) {
    #k-fold cross validation
    k <- 5
    splits <- runif(nrow(iris))
    results = sapply(1:k, function(i) {
      test.idx <- (splits >= (i - 1) / k) & (splits < i / k)
      train.idx <- !test.idx
      test <- iris[test.idx, , drop=FALSE]
      train <- iris[train.idx, , drop=FALSE]
      tree <- rpart(as.simple.formula(subset, "Species"), train)
      error.rate = sum(test$Species != predict(tree, test, type="c")) / nrow(test)
      return(1 - error.rate)
    })
    print(subset)
    print(mean(results))
    return(mean(results))
  }
  
  subset <- best.first.search(names(iris)[-5], evaluator)
  f <- as.simple.formula(subset, "Species")
  print(f)
  
CFS filter
Description
The algorithm finds attribute subset using correlation and entropy measures for continous and discrete data.
Usage
cfs(formula, data)
Arguments
| formula | a symbolic description of a model | 
| data | data to process | 
Details
The alorithm makes use of best.first.search for searching the attribute subset space.
Value
a character vector containing chosen attributes
Author(s)
Piotr Romanski
See Also
Examples
  data(iris)
  
  subset <- cfs(Species~., iris)
  f <- as.simple.formula(subset, "Species")
  print(f)
Chi-squared filter
Description
The algorithm finds weights of discrete attributes basing on a chi-squared test.
Usage
chi.squared(formula, data)
Arguments
| formula | a symbolic description of a model | 
| data | a symbolic description of a model | 
Details
The result is equal to Cramer's V coefficient between source attributes and destination attribute.
Value
a data.frame containing the worth of attributes in the first column and their names as row names
Author(s)
Piotr Romanski
Examples
  library(mlbench)
  data(HouseVotes84)
  weights <- chi.squared(Class~., HouseVotes84)
  print(weights)
  subset <- cutoff.k(weights, 5)
  f <- as.simple.formula(subset, "Class")
  print(f)
Consistency-based filter
Description
The algorithm finds attribute subset using consistency measure for continous and discrete data.
Usage
consistency(formula, data)
Arguments
| formula | a symbolic description of a model | 
| data | data to process | 
Details
The alorithm makes use of best.first.search for searching the attribute subset space.
Value
a character vector containing chosen attributes
Author(s)
Piotr Romanski
See Also
Examples
## Not run: 
  library(mlbench)
  data(HouseVotes84)
  
  subset <- consistency(Class~., HouseVotes84)
  f <- as.simple.formula(subset, "Class")
  print(f)
## End(Not run)
Correlation filter
Description
The algorithm finds weights of continous attributes basing on their correlation with continous class attribute.
Usage
linear.correlation(formula, data)
rank.correlation(formula, data)
Arguments
| formula | a symbolic description of a model | 
| data | data to process | 
Details
linear.correlation uses Pearson's correlation
rank.correlation uses Spearman's correlation
Rows with NA values are not taken into consideration.
Value
a data.frame containing the worth of attributes in the first column and their names as row names
Author(s)
Piotr Romanski
Examples
  library(mlbench)
  data(BostonHousing)
  d=BostonHousing[-4] # only numeric variables
  
  weights <- linear.correlation(medv~., d)
  print(weights)
  subset <- cutoff.k(weights, 3)
  f <- as.simple.formula(subset, "medv")
  print(f)
  weights <- rank.correlation(medv~., d)
  print(weights)
  subset <- cutoff.k(weights, 3)
  f <- as.simple.formula(subset, "medv")
  print(f)
Cutoffs
Description
The algorithms select a subset from a ranked attributes.
Usage
cutoff.k(attrs, k)
cutoff.k.percent(attrs, k)
cutoff.biggest.diff(attrs)
Arguments
| attrs | a data.frame containing ranks for attributes in the first column and their names as row names | 
| k |  a positive integer in case of  | 
Details
cutoff.k chooses k best attributes
cutoff.k.percent chooses best k * 100% of attributes
cutoff.biggest.diff chooses a subset of attributes which are significantly better than other.
Value
A character vector containing selected attributes.
Author(s)
Piotr Romanski
Examples
  data(iris)
  weights <- information.gain(Species~., iris)
  print(weights)
  subset <- cutoff.k(weights, 1)
  f <- as.simple.formula(subset, "Species")
  print(f)
  subset <- cutoff.k.percent(weights, 0.75)
  f <- as.simple.formula(subset, "Species")
  print(f)
  subset <- cutoff.biggest.diff(weights)
  f <- as.simple.formula(subset, "Species")
  print(f)
  
Entropy-based filters
Description
The algorithms find weights of discrete attributes basing on their correlation with continous class attribute.
Usage
information.gain(formula, data, unit)
gain.ratio(formula, data, unit)
symmetrical.uncertainty(formula, data, unit)
Arguments
| formula | A symbolic description of a model. | 
| data | Data to process. | 
| unit |  Unit for computing entropy (passed to  | 
Details
information.gain is 
H(Class) + H(Attribute) - H(Class, Attribute)
.
gain.ratio is 
\frac{H(Class) + H(Attribute) - H(Class, Attribute)}{H(Attribute)}
symmetrical.uncertainty is 
2\frac{H(Class) + H(Attribute) - H(Class, Attribute)}{H(Attribute) + H(Class)}
Value
a data.frame containing the worth of attributes in the first column and their names as row names
Author(s)
Piotr Romanski, Lars Kotthoff
Examples
  data(iris)
  weights <- information.gain(Species~., iris)
  print(weights)
  subset <- cutoff.k(weights, 2)
  f <- as.simple.formula(subset, "Species")
  print(f)
  weights <- information.gain(Species~., iris, unit = "log2")
  print(weights)
  weights <- gain.ratio(Species~., iris)
  print(weights)
  subset <- cutoff.k(weights, 2)
  f <- as.simple.formula(subset, "Species")
  print(f)
  weights <- symmetrical.uncertainty(Species~., iris)
  print(weights)
  subset <- cutoff.biggest.diff(weights)
  f <- as.simple.formula(subset, "Species")
  print(f)
Exhaustive search
Description
The algorithm for searching atrribute subset space.
Usage
exhaustive.search(attributes, eval.fun)
Arguments
| attributes | a character vector of all attributes to search in | 
| eval.fun | a function taking as first parameter a character vector of all attributes and returning a numeric indicating how important a given subset is | 
Details
The algorithm searches the whole attribute subset space in breadth-first order.
Value
A character vector of selected attributes.
Author(s)
Piotr Romanski
See Also
forward.search, backward.search, best.first.search, hill.climbing.search 
Examples
  library(rpart)
  data(iris)
  
  evaluator <- function(subset) {
    #k-fold cross validation
    k <- 5
    splits <- runif(nrow(iris))
    results = sapply(1:k, function(i) {
      test.idx <- (splits >= (i - 1) / k) & (splits < i / k)
      train.idx <- !test.idx
      test <- iris[test.idx, , drop=FALSE]
      train <- iris[train.idx, , drop=FALSE]
      tree <- rpart(as.simple.formula(subset, "Species"), train)
      error.rate = sum(test$Species != predict(tree, test, type="c")) / nrow(test)
      return(1 - error.rate)
    })
    print(subset)
    print(mean(results))
    return(mean(results))
  }
  
  subset <- exhaustive.search(names(iris)[-5], evaluator)
  f <- as.simple.formula(subset, "Species")
  print(f)
  
Greedy search
Description
The algorithms for searching atrribute subset space.
Usage
backward.search(attributes, eval.fun)
forward.search(attributes, eval.fun)
Arguments
| attributes | a character vector of all attributes to search in | 
| eval.fun | a function taking as first parameter a character vector of all attributes and returning a numeric indicating how important a given subset is | 
Details
These algorithms implement greedy search. At first, the algorithms expand starting node, evaluate its children and choose the best one which becomes a new starting node. This process goes only in one direction. forward.search starts from an empty and backward.search from a full set of attributes.
Value
A character vector of selected attributes.
Author(s)
Piotr Romanski
See Also
best.first.search, hill.climbing.search, exhaustive.search 
Examples
  library(rpart)
  data(iris)
  
  evaluator <- function(subset) {
    #k-fold cross validation
    k <- 5
    splits <- runif(nrow(iris))
    results = sapply(1:k, function(i) {
      test.idx <- (splits >= (i - 1) / k) & (splits < i / k)
      train.idx <- !test.idx
      test <- iris[test.idx, , drop=FALSE]
      train <- iris[train.idx, , drop=FALSE]
      tree <- rpart(as.simple.formula(subset, "Species"), train)
      error.rate = sum(test$Species != predict(tree, test, type="c")) / nrow(test)
      return(1 - error.rate)
    })
    print(subset)
    print(mean(results))
    return(mean(results))
  }
  
  subset <- forward.search(names(iris)[-5], evaluator)
  f <- as.simple.formula(subset, "Species")
  print(f)
  
Hill climbing search
Description
The algorithm for searching atrribute subset space.
Usage
hill.climbing.search(attributes, eval.fun)
Arguments
| attributes | a character vector of all attributes to search in | 
| eval.fun | a function taking as first parameter a character vector of all attributes and returning a numeric indicating how important a given subset is | 
Details
The algorithm starts with a random attribute set. Then it evaluates all its neighbours and chooses the best one. It might be susceptible to local maximum.
Value
A character vector of selected attributes.
Author(s)
Piotr Romanski
See Also
forward.search, backward.search, best.first.search, exhaustive.search 
Examples
  library(rpart)
  data(iris)
  
  evaluator <- function(subset) {
    #k-fold cross validation
    k <- 5
    splits <- runif(nrow(iris))
    results = sapply(1:k, function(i) {
      test.idx <- (splits >= (i - 1) / k) & (splits < i / k)
      train.idx <- !test.idx
      test <- iris[test.idx, , drop=FALSE]
      train <- iris[train.idx, , drop=FALSE]
      tree <- rpart(as.simple.formula(subset, "Species"), train)
      error.rate = sum(test$Species != predict(tree, test, type="c")) / nrow(test)
      return(1 - error.rate)
    })
    print(subset)
    print(mean(results))
    return(mean(results))
  }
  
  subset <- hill.climbing.search(names(iris)[-5], evaluator)
  f <- as.simple.formula(subset, "Species")
  print(f)
  
OneR algorithm
Description
The algorithms find weights of discrete attributes basing on very simple association rules involving only one attribute in condition part.
Usage
oneR(formula, data)
Arguments
| formula | a symbolic description of a model | 
| data | data to process | 
Details
The algorithm uses OneR classifier to find out the attributes' weights. For each attribute it creates a simple rule based only on that attribute and then calculates its error rate.
Value
a data.frame containing the worth of attributes in the first column and their names as row names
Author(s)
Piotr Romanski
Examples
  library(mlbench)
  data(HouseVotes84)
  
  weights <- oneR(Class~., HouseVotes84)
  print(weights)
  subset <- cutoff.k(weights, 5)
  f <- as.simple.formula(subset, "Class")
  print(f)
RandomForest filter
Description
The algorithm finds weights of attributes using RandomForest algorithm.
Usage
random.forest.importance(formula, data, importance.type = 1)
Arguments
| formula | a symbolic description of a model | 
| data | data to process | 
| importance.type | either 1 or 2, specifying the type of importance measure (1=mean decrease in accuracy, 2=mean decrease in node impurity) | 
Details
This is a wrapper for importance.
Value
a data.frame containing the worth of attributes in the first column and their names as row names
Author(s)
Piotr Romanski
Examples
  library(mlbench)
  data(HouseVotes84)
  
  weights <- random.forest.importance(Class~., HouseVotes84, importance.type = 1)
  print(weights)
  subset <- cutoff.k(weights, 5)
  f <- as.simple.formula(subset, "Class")
  print(f)
RReliefF filter
Description
The algorithm finds weights of continous and discrete attributes basing on a distance between instances.
Usage
relief(formula, data, neighbours.count = 5, sample.size = 10)
Arguments
| formula | a symbolic description of a model | 
| data | data to process | 
| neighbours.count | number of neighbours to find for every sampled instance | 
| sample.size | number of instances to sample | 
Details
The algorithm samples instances and finds their nearest hits and misses. Considering that result, it evaluates weights of attributes.
Value
a data.frame containing the worth of attributes in the first column and their names as row names
Author(s)
Piotr Romanski
References
- -Igor Kononenko: Estimating Attributes: Analysis and Extensions of RELIEF. In: European Conference on Machine Learning, 171-182, 1994. 
- -Marko Robnik-Sikonja, Igor Kononenko: An adaptation of Relief for attribute estimation in regression. In: Fourteenth International Conference on Machine Learning, 296-304, 1997. 
Examples
  data(iris)
  
  weights <- relief(Species~., iris, neighbours.count = 5, sample.size = 20)
  print(weights)
  subset <- cutoff.k(weights, 2)
  f <- as.simple.formula(subset, "Species")
  print(f)