【问题标题】:How can I use pandas get_dummies() for new data?如何使用 pandas get_dummies() 获取新数据?
【发布时间】:2020-05-05 16:16:48
【问题描述】:

我正在尝试使用 keras 构建情绪分类器并在不同的数据集上对其进行评估。我的问题是,当我尝试在不同的数据集上评估它时,get_dummies 的值是不同的。

我有 5 种情绪:仇恨、快乐、愤怒、中性和悲伤,分布如下:[1 0 0 0 0]、[0 1 0 0 0]、[0 0 1 0 0]、[0 0 0 1 0] 和 [0 0 0 0 1]。

当我尝试在另一个数据集上进行预测时,出于仇恨,它使用例如 [0 0 1 0 0] 而不是 [1 0 0 0 0]。所以 val_acc 和 val_loss 不相关而且非常糟糕。

有没有办法重新索引 get dummy?我不知道该怎么做。

我使用这样的方法:

tweets = pd.read_csv('data/text_emotion.csv', usecols=[0, 1, 3], names=['id', 'sentiment', 'text'], header=0, encoding="latin-1")
...
y = pd.get_dummies(tweets['sentiment']).values

提前谢谢你!

【问题讨论】:

    标签: python pandas keras


    【解决方案1】:

    根据问题,你可以这样做:

    A)如果您只想对一个分类列进行一次热编码,请对数据进行排序。

    B)如果这是您的所有数据,您可以附加所有数据框(您不需要操作 之后的任何其他数据集,例如基于提交的比赛),然后使用 get_dummies() ,然后再次将它们分开。

    C) 按照 YOLO 的建议,使用 sklearn 的 OHE 方法。

    【讨论】:

      【解决方案2】:

      这是因为pd.get_dummies 在编码之前没有对值进行排序。它接受输入序列并按该顺序分配。这是一个简单的例子:

      # the sequences of values are different
      
      df = pd.DataFrame({'coun':['a','b','c']*2}) # imagine as train
      df1 = pd.DataFrame({'coun':['c','b','a']*2}) # imagine as validation
      
      pd.get_dummies(df)
      
         coun_a  coun_b  coun_c
      0       1       0       0
      1       0       1       0
      2       0       0       1
      3       1       0       0
      4       0       1       0
      5       0       0       1
      
      pd.get_dummies(df1)
      
         coun_a  coun_b  coun_c
      0       0       0       1
      1       0       1       0
      2       1       0       0
      3       0       0       1
      4       0       1       0
      5       1       0       0
      

      a 的编码在这两种情况下是不同的。因此,为了解决这个问题,您可以这样做:

      from sklearn.preprocessing import OneHotEncoder
      
      ohe = OneHotEncoder()
      
      # fit on train 
      ohe.fit(df['coun'].values.reshape(-1,1))
      
      # transform on train/valid
      y_train_label = ohe.transform(df['coun'].values.reshape(-1,1)).todense()
      y_valid_label = ohe.transform(df1['coun'].values.reshape(-1,1)).todense()
      

      【讨论】:

        猜你喜欢
        • 2018-11-10
        • 2021-09-21
        • 2021-11-02
        • 2023-02-09
        • 2015-09-27
        • 2022-08-02
        • 2018-02-10
        • 2018-09-14
        • 1970-01-01
        相关资源
        最近更新 更多