Как я могу в одно касание закодировать мой набор данных с несколькими категориальными переменными в R? - PullRequest
0 голосов
/ 22 октября 2018

Кто-нибудь знает, как я могу лучше очистить эти данные, чтобы я мог выполнить логистическую регрессию на них?

Я пытаюсь в горячем виде кодировать переменные с несколькими категориями, такими как раса, рабочий класс и т. Д. (как показано в примере набора данных ниже), но не уверен, как это сделать.

Я планировал изменить доход на 1 и 0, поскольку есть только 2 категории, но я не могу сделать то же самое для остальных.

Мой текущий план - запустить логистическую регрессию со всеми перечисленными переменными:

data <- read.csv("adult_income.csv")
mylogit <- glm(formula = income ~ age + workclass + educaitonal-num + 
                   martial status + occupation + race + gender + 
                   capital-gain + capital-loss + hours-per-week + 
                   native-country, data = data, family = "binomial")

Пример набора данных: 1

Явсе еще довольно плохо знаком с R, поэтому я прошу прощения за любую ошибку новичка!

Ответы [ 3 ]

0 голосов
/ 27 октября 2018

С data.table и mltools:

df <- as.data.table(df)
df_oh <- one_hot(df)

Результат и объяснение

head(df_oh)
   age education_level marital_status_Divorced marital_status_Married marital_status_Never marital_status_Widowed occupation_Admin occupation_Banking occupation_Farming occupation_Fishing occupation_Poledancing gender_Man gender_Unicorn gender_Woman    hours income_<=50K income_>50K
1:  26              12                       0                      0                    0                      1                0                  0                  0                  0                      1          0              0            1 39.69357            0           1
2:  70              12                       0                      0                    0                      1                0                  0                  0                  0                      1          1              0            0 39.35318            0           1
3:  21              14                       1                      0                    0                      0                1                  0                  0                  0                      0          0              0            1 40.72573            1           0
4:  56               1                       0                      1                    0                      0                0                  1                  0                  0                      0          1              0            0 39.04525            0           1
5:  81               2                       0                      0                    0                      1                0                  0                  1                  0                      0          0              1            0 39.21665            1           0
6:  38               5                       0                      0                    0                      1                1                  0                  0                  0                      0          1              0            0 39.94481            1           0

То, что делает one_hot(), принимает все факторные переменные (то есть, не числовые,не символ и т. д.) таблицы данных и их горячее копирование.Ему нужна таблица данных (а не, скажем, фрейм данных), потому что таблицы данных предоставляют некоторые функции / концепции, которые помогают гибко и быстро.

Если вы посмотрите документацию в ?one_hot, вы увидите, чтофункция также может очень хорошо обрабатывать NA s (если это касается ваших данных).

Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь добавлять комментарии.

Воспроизведение

# Load libraries
library(data.table)
library(mltools)

# Set seed for reproducibility
set.seed(1701)

# Create mock data frame
df <- data.frame(
    age = sample(18:85, 50, replace = TRUE),
    education_level = sample(1:15, 50, replace = TRUE),
    marital_status = sample(c("Never", "Married", "Divorced", "Widowed"), 50, replace = TRUE),
    occupation = sample(c("Admin", "Farming", "Poledancing", "Fishing", "Banking"), 50, replace = TRUE),
    gender = sample(c("Man", "Woman", "Unicorn"), 50, replace = TRUE),
    hours = rnorm(50, 40, 1),
    income = sample(c("<=50K", ">50K"), 50, replace = TRUE))
В результате:
> head(df)
  age education_level marital_status  occupation  gender    hours income
1  26              12        Widowed Poledancing   Woman 39.69357   >50K
2  70              12        Widowed Poledancing     Man 39.35318   >50K
3  21              14       Divorced       Admin   Woman 40.72573  <=50K
4  56               1        Married     Banking     Man 39.04525   >50K
5  81               2        Widowed     Farming Unicorn 39.21665  <=50K
6  38               5        Widowed       Admin     Man 39.94481  <=50K
0 голосов
/ 15 ноября 2018

Установить библиотеку Макеты

Пример:

library(dummies)
# example data 
df1 <- data.frame(id = 1:4, year = 1991:1994)
df1 <- cbind(df1, dummy(df1$year, sep = "_"))

Это создаст фиктивные переменные, как показано ниже:

df1
#   id year df1_1991 df1_1992 df1_1993 df1_1994
# 1  1 1991        1        0        0        0
# 2  2 1992        0        1        0        0
# 3  3 1993        0        0        1        0
# 4  4 1994        0        0        0        1
0 голосов
/ 22 октября 2018

R очень хорошо одна горячая кодировка категориальных переменных внутренне, когда вы оборачиваете переменную в функцию as.factor ().Ответ на вопрос, кстати, уже в категориальной переменной в логистической регрессии в r

...