【问题标题】:converting pandas string data to numeric for decision tree将 pandas 字符串数据转换为决策树的数字
【发布时间】:2020-01-12 13:48:03
【问题描述】:

我正在尝试将几列字符串数据转换为数字以输入分类模型。具有一个修改列的示例数据集是:

输入:

data = [['tom', 10], ['nick', 15], ['juli', 14], ['nick', '12']]
data = pd.DataFrame(data, columns = ['Name', 'Age'])
data

输出:

    Name    Age
0   tom     10
1   nick    15
2   juli    14
3   nick    12

我意识到 scikit learn 不能很好地处理字符串数据,但现在我真的更愿意继续使用它,如果可能的话(公司限制)。但是,我的问题是,如果我使用

sklearn.preprocessing.LabelEncoder 

我可以使用 '.classes_' 来获取一些数值,例如:

输入:

le = preprocessing.LabelEncoder()
le.fit(data['Name'])
le.classes_
vals = le.transform(le.classes_)
vals

我明白了

输出:

array([0, 1, 2])

由于这个数组只包含三个值,我不能用

数据['名称'] = vals

因为我的列长度是 4,而我的 vals 长度是 3。

考虑到这一点,我是否有另一种方法可以在 scikit-learn 中解决这个问题,还是我唯一的选择是使用不同的库?

【问题讨论】:

  • vals = le.transform(data['Name'])

标签: python pandas scikit-learn classification decision-tree


【解决方案1】:

试试这个:

le = preprocessing.LabelEncoder()
data['Name']= le.fit_transform(data['Name'])

这将为整个列分配标签。

【讨论】:

    【解决方案2】:

    你也可以这样做:

    pd.get_dummies(data=data, columns=['Name'])
    

    输出:

      Age  Name_juli  Name_nick  Name_tom
    0  10          0          0         1
    1  15          0          1         0
    2  14          1          0         0
    3  12          0          1         0
    

    现在您的数据已准备好进行模型训练。通常 OneHot 编码比 LabelEncoding 更好,因为 LabelEncoding 意味着您的姓名之间存在数字关系。如果 Juli==0、Nick==1 和 Tom==2,则表示 July < Nick < Tom 可能会在某些模型中造成问题。

    【讨论】:

    • 我同意这个任务的one-hot encoding,但也可能值得一提的是原生sklearn OneHotEncoder(),它可以更容易在sklearn生态系统中使用
    • 啊,谢谢。我最近确实了解到您不想要隐含的订单,但我有点转过身来,根据我的阅读,我认为 get_dummies 不是 OneHot 而 LabelEncoding 是。谢谢你的更正。那么,如果我需要对数据集中的多个列执行此操作,此过程是否会改变?我猜不是,因为这只是使用布尔值?这只是为我的数据集添加了一些额外的功能。我理解正确吗?
    • 对我来说pandas 更直接,但如果你正在构建Pipelines,使用OneHotEncoder 可能会更好。如果您想添加更多列,请将它们添加到 columns=['Name'] 列表中,就这么简单,您会自动获得更新的数据框
    【解决方案3】:
    le = preprocessing.LabelEncoder()
    le.fit(data['Name'])
    le.classes_
    vals = le.transform(data['Name'])
    vals
    

    当您使用fit(data['Name']) 时,您实际上可以使用fit(data['Name'].unique()),因为只有唯一值用于拟合,但对于transform,您必须使用所有数据。

    【讨论】:

      【解决方案4】:
      from sklearn.preprocessing import Imputer
      
      imputer =Imputer(missing_values="NaN", strategy='mean', axis=0)
      
      imputer=imputer.fit(X[:,1:3])
      
      X[:,1:3]= imputer.transform(X[:,1:3])
      
      #Concept of Dummy Variable, Handling the conflict of them
      
      from sklearn.preprocessing import LabelEncoder, OneHotEncoder
      
      labelencoder_X = LabelEncoder()
      #We have to give the column number necessary to change it in numeric form
      X[:,0]=labelencoder_X.fit_transform(X[:,0])
      

      onehotencoder=OneHotEncoder(categorical_features =[0])
      
      X=onehotencoder.fit_transform(X).toarray()
      

      【讨论】:

        【解决方案5】:
        # prepare input features
        def LABEL_Encoding(X):
            objList = data.select_dtypes(include = "object").columns
            print (objList)
            le = LabelEncoder()
            for feat in objList:
                data[feat] = le.fit_transform(data[feat].astype(str))
              
            return data
        
        

        【讨论】:

          猜你喜欢
          • 2021-06-03
          • 2019-04-07
          • 2014-06-07
          • 2020-06-10
          • 2015-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多