Python 大熊猫分类新水平

Python 大熊猫分类新水平,python,pandas,scikit-learn,categorical-data,lightgbm,Python,Pandas,Scikit Learn,Categorical Data,Lightgbm,熊猫分类如何处理新的和看不见的级别?我正在考虑一个类似于scikit的学习设置。目前,我有一些类似于: 但这相当缓慢 显然,像xgboost或lightbm这样的决策树可以直接处理分类数据,也就是说,不需要手动处理这种缓慢的转换。 但是当看到他们的代码时 他们似乎使用了LGBMLabelEncoder,这是一种标准的scikit学习LabelEncoder 我想知道它如何处理看不见的数据 如果需要手动转换,pandas.Category是否允许更快的转换-即使新数据中有未显示的级别 编辑 请参

熊猫分类如何处理新的和看不见的级别?我正在考虑一个类似于scikit的学习设置。目前,我有一些类似于:

但这相当缓慢

显然,像xgboost或lightbm这样的决策树可以直接处理分类数据,也就是说,不需要手动处理这种缓慢的转换。 但是当看到他们的代码时 他们似乎使用了
LGBMLabelEncoder
,这是一种标准的scikit学习
LabelEncoder

我想知道它如何处理看不见的数据

如果需要手动转换,pandas.Category是否允许更快的转换-即使新数据中有未显示的级别

编辑 请参阅,了解我如何无法让scikit learn的常见嫌疑犯工作的概述。
仍然在寻找比我的解决方案更有效的东西。此外,lightGBM建议使用自定义编码策略。

可能有一种新的编码策略,但它可能最适合sklearns

所以我们看到“d”基本上既不映射到“a”,“b”也不映射到“c”。 但是请注意,有一个问题可能会在下一个sklearn版本中解决

LabelBinarizer在培训期间是合适的,可以调用传递给它的值。新值将映射到所有零。使用pandas get_Dummie编写转换器(如编辑前所示)可能更可行


由于列的名称匹配,这可能非常简单。在第一步中进行拟合并存储列名,而不仅仅是在transformstep中进行变换,但只保留在拟合中标识的列名(如果测试集中不存在培训级别,则可能会添加zome zero列)。那你就完了;)

可能有一个解决方案,但它可能对SKL最有效

所以我们看到“d”基本上既不映射到“a”,“b”也不映射到“c”。 但是请注意,有一个问题可能会在下一个sklearn版本中解决

LabelBinarizer在培训期间是合适的,可以调用传递给它的值。新值将映射到所有零。使用pandas get_Dummie编写转换器(如编辑前所示)可能更可行



由于列的名称匹配,这可能非常简单。在第一步中进行拟合并存储列名,而不仅仅是在transformstep中进行变换,但只保留在拟合中标识的列名(如果测试集中不存在培训级别,则可能会添加zome zero列)。那你就完了;)

熊猫,分类的,用Nan填充它们。Scikit learn也不会处理新数据,它们很可能会被删除或替换为Nan。尝试将LabelEncoder与不可见的数据一起使用,您将得到
值错误:y包含新标签:
。为什么这个问题被否决??我想一个小的可重复的数据集和一个期望的数据集可以帮助更好地理解这个问题…@MaxU可能是因为在我看来,它更像是一个算法问题,而不是一个编程问题。这是机器学习中经常遇到的一个问题,即如何处理看不见的数据,这是一个正确的位置。我没有足够的特权独自处理这些数据。如果其他人也有这种感觉,那么只有它能被移动。这只是我的观点,但我认为这可能会得到更好的关注。真正的解决办法是,不幸的是,这些公司尚未合并。LabelEncoder+OneHotEncoder或LabelBinarizer或CountVectorizer(标记器=lambda x:x)都是可能的解决方案(尽管没有一个是很好的)。Pandas.category只需用Nan填充它们。Scikit learn也不会处理新数据,它们很可能会被删除或替换为Nan。尝试将LabelEncoder与不可见的数据一起使用,您将得到
值错误:y包含新标签:
。为什么这个问题被否决??我想一个小的可重复的数据集和一个期望的数据集可以帮助更好地理解这个问题…@MaxU可能是因为在我看来,它更像是一个算法问题,而不是一个编程问题。这是机器学习中经常遇到的一个问题,即如何处理看不见的数据,这是一个正确的位置。我没有足够的特权独自处理这些数据。如果其他人也有这种感觉,那么只有它能被移动。这只是我的观点,但我认为这可能会得到更好的关注。真正的解决办法是,不幸的是,这些公司尚未合并。LabelEncoder+OneHotEncoder或LabelBinarizer或CountVectorizer(标记器=lambda x:x)都是可能的解决方案(虽然没有一个是很好的)。但这缺乏重点-您不能保证第二个具有潜在不可见的分类级别或以不同顺序排列的级别的df被正确编码。您是对的,缺少排序可能会丢失,但是,在处理具有离散值的列时,每个列中的新类别/值都将映射为零。关于排序,如果df_1包含a,b,并且映射到1,2,而df_2包含b,c,则应映射到2,0,这样就不会有问题了?或者我误解了这一点?我会在答案中添加一个示例,给我一点时间,fit函数中似乎有一个错误;)更新了它并删除了以前的类,而不是使用sklearn中的labelbinarizer。但是,如果您感兴趣,我也可以使用pandas
get_dummies
(或自己尝试)构建一个相关解决方案,但这缺乏重点-您不能保证第二个具有潜在不可见的分类级别或不同顺序的级别的df被正确编码。您是对的,缺少排序可能会丢失,但是,在处理具有离散值的列时,每个列中的新类别/值都将映射为零。关于排序,如果df_1包含a,b,并且映射到1,2,而df_2包含b,c,则应映射到2,0,这样就不会有问题了?或者我误解了这一点?我会在答案中添加一个示例,给我一点时间,fit函数中似乎有一个错误;)upda
def: fit() 
  for each column:
   fit a label encoder:
def: transform()
  for each column:
     check if column was unseen
       yes(unseen) replace 
       no: label encode
from sklearn.preprocessing import LabelBinarizer
df= pd.DataFrame({'A':['a','b','c','a']})
lb = LabelBinarizer()
lb.fit(df["A"])
lb.transform(df["A"])

[[1 0 0]
 [0 1 0]
 [0 0 1]
 [1 0 0]]

df2 = pd.DataFrame({'A':['a','b','d']})
lb.transform(df2['A'])
[[1 0 0]
 [0 1 0]
 [0 0 0]]