在一种热编码中每行有多个值-建议这样做吗?

时间:2018-08-19 17:27:42

标签: r r-caret one-hot-encoding

我正在使用one_hot中的mltools函数将2个变量的熔融数据帧转换成一个宽数据帧,其中每个变量(除索引外)都是一个因子水平。

在熔融框架中有25,000行,只有2个变量-一个是800级的因子,另一个是索引,所以我可以在以后合并。

我将使用各种机器学习包,因此需要以可接受的方式表示800个因子水平。

但是,当我使用one_hot时,我得到了一个包含801列的框架,这是正确的(800个因子水平+ 1个索引)。我仍然有25,000行。索引中以唯一值表示的原始观测值的数量为1,000。

所以,我的问题是-最佳做法是,每一个热变量每行仅具有一个正值吗?现在将其折叠起来是否有缺点,所以每一行都是一个观察值?

谢谢。

1 个答案:

答案 0 :(得分:1)

我将根据您提供的信息回答问题。

您基本上拥有一个变量(具有800个水平的因子变量,由import sqlite3 import sys def login(): while True: username = input("Please enter your username: ") password = input("Please enter your password: ") with sqlite3.connect("wtf.db") as db: cursor = db.cursor() find_user = ("SELECT * FROM user WHERE username=? AND password=?") cursor.execute(find_user, [(username), (password)]) results = cursor.fetchall() if results is True: for i in results: print("Welcome "+i[1]) break else: print("Username and password not reconized or registered") again = input("Do you want to try again?(y/n) ") if again.lower() == "n": print("bye") sys.exit() login() 表示的 25,000个索引观测值(由id表示) )。您可以做的是:

  1. 按因子变量分组(例如,通过val
  2. 添加频率计数(例如,通过group_by()
  3. 一键式变量(freq = n()软件包确实非常有用)

这将使您没有索引,但是有一个 2 x 801表,其中包含每个一个热点变量(列1: 800)及其频率(在第801列中)。许多框架可以很好地处理此类数据,但是如果没有更多信息,就不可能专门回答。

mltools

代码

> str(result)
Classes ‘data.table’ and 'data.frame':  800 obs. of  801 variables:
 $ val_AAL5 : int  1 0 0 0 0 0 0 0 0 0 ...
 $ val_ABP14: int  0 1 0 0 0 0 0 0 0 0 ...
 $ val_ACQ8 : int  0 0 1 0 0 0 0 0 0 0 ...
 $ val_ADU8 : int  0 0 0 1 0 0 0 0 0 0 ...
 $ val_AEB16: int  0 0 0 0 1 0 0 0 0 0 ...
 $ val_AEX17: int  0 0 0 0 0 1 0 0 0 0 ...
 $ val_AGQ4 : int  0 0 0 0 0 0 1 0 0 0 ...
 $ val_AHS8 : int  0 0 0 0 0 0 0 1 0 0 ...
 $ val_AHV2 : int  0 0 0 0 0 0 0 0 1 0 ...
 $ val_AHX16: int  0 0 0 0 0 0 0 0 0 1 ...
 $ val_AIV19: int  0 0 0 0 0 0 0 0 0 0 ...
...

数据

df <- df %>%
    group_by(val) %>%
    summarise(freq = n()) 
dt <- as.data.table(df)
result <- one_hot(dt)