# Feature Columns

## Overview

Feature columns are used to specify how Tensors received from the input function should be combined and transformed before entering the model. A feature column can be a plain mapping to some input column (e.g. column_numeric() for a column of numerical data), or a transformation of other feature columns (e.g. column_crossed() to define a new column as the cross of two other feature columns).

The following feature columns are available:

Feature Column Description
column_categorical_with_vocabulary_list() Construct a Categorical Column with In-Memory Vocabulary.
column_categorical_with_vocabulary_file() Construct a Categorical Column with a Vocabulary File.
column_categorical_with_identity() Construct a Categorical Column that Returns Identity Values.
column_categorical_with_hash_bucket() Represents Sparse Feature where IDs are set by Hashing.
column_categorical_weighted() Construct a Weighted Categorical Column.
column_indicator() Represents Multi-Hot Representation of Given Categorical Column.
column_numeric() Construct a Real-Valued Column.
column_embedding() Construct a Dense Column.
column_crossed() Construct a Crossed Column.
column_bucketized() Construct a Bucketized Column.

Some typical mappings of R data types to feature column are:

Data Type Feature Column
Numeric column_numeric()
Factor column_categorical_with_identity()
Character column_categorical_with_hash_bucket()

We’ll use the flights dataset from the nycflights13 package to explore how feature columns can be constructed. The flights dataset records airline on-time data for all flights departing NYC in 2013.

library(nycflights13)
print(flights)
> print(flights)
# A tibble: 336,776 x 19
year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin  dest air_time
<int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>     <dbl>   <chr>  <int>   <chr>  <chr> <chr>    <dbl>
1  2013     1     1      517            515         2      830            819        11      UA   1545  N14228    EWR   IAH      227
2  2013     1     1      533            529         4      850            830        20      UA   1714  N24211    LGA   IAH      227
3  2013     1     1      542            540         2      923            850        33      AA   1141  N619AA    JFK   MIA      160
# ... with 336,766 more rows, and 4 more variables: distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

For example, we can define numeric columns based on the dep_time and dep_delay variables:

cols <- feature_columns(
column_numeric("dep_time"),
column_numeric("dep_delay")
)

You can also define multiple feature columns at once.

cols <- feature_columns(
column_numeric("dep_time", "dep_delay")
)

## Pattern Matching

Often, you will find that you want to generate a number of feature column definitions based on some pattern existing in the names of your data set. tfestimators uses the tidyselect package to make it easy to define feature columns, similar to what you might be familiar with in the dplyr package. You can use the names = argument of feature_columns() function to define a context from which variable names will be selected.

For example, we can use the ends_with() helper to assert that all columns ending with "time" are numeric columns as follows:

library(nycflights13)

cols <- feature_columns(names = flights,
column_numeric(ends_with("time"))
)

The names parameter can either be a character vector with the names as-is, or any named R object.

If the code you are using to compose columns is more complicated, or if you need to save references to columns for use in column embeddings you can also establish a scope for given set of column names using the with_columns() function:

cols <- with_columns(flights, {
feature_columns(
column_numeric(ends_with("time"))
)
})

You can also use an alternate syntax of the form (pattern) ~ (column), which can add clarity when longer pattern rules are used, as it separates the matching rule from the column definition:

cols <- with_columns(flights, {
feature_columns(
ends_with("time") ~ column_numeric(),
)
})

Available pattern matching operators include:

Operator Description
starts_with() Starts with a prefix
ends_with() Ends with a suffix
contains() Contains a literal string
matches() Matches a regular expression
one_of() Included in character vector
everything() All columns

See help("select_helpers", package = "tidyselect") for full information on the set of helpers made available by the tidyselect package.