【问题标题】:How to convert huge set of categorical data from string into numerical values automatically?如何自动将大量分类数据从字符串转换为数值?
【发布时间】:2019-06-06 03:17:41
【问题描述】:

我正在尝试构建决策树回归来预测汽车的 MSRP(制造商建议零售价)值。但是,我在将分类值转换为数值时遇到了问题。

我的问题: 我有 8 列分类特征,有些列有多达 40 种不同类型的唯一值和 20,000 个实例。我应该使用什么方法来转换分类数据以用于决策树回归?有没有办法自动输入唯一值而不是手动输入?

我尝试使用 LabelEncoder 转换分类值,但由于某种原因,第一列中 df.values(BMW、Acura...)的数组即使在我转换后也没有改变。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline 
df = pd.read_excel(r'C:\Users\user\Desktop\data.xlsx')
from sklearn.preprocessing import LabelEncoder
labelencoder = LabelEncoder()
df.values[:, 0] = labelencoder.fit_transform(df.values[:, 0])

这是我得到的结果:

array([['BMW', '1 Series M', 2011, ..., 19, 3916, 46135],
       ['BMW', '1 Series', 2011, ..., 19, 3916, 40650],
       ['BMW', '1 Series', 2011, ..., 20, 3916, 36350],
       ...,
       ['Acura', 'ZDX', 2012, ..., 16, 204, 50620],
       ['Acura', 'ZDX', 2013, ..., 16, 204, 50920],
       ['Lincoln', 'Zephyr', 2006, ..., 17, 61, 28995]], dtype=object)

我希望第一列是用于 DT 回归的数值。 任何人都可以帮忙吗?我在我的 FYP 中这样做,这是我第一次接触机器学习。

【问题讨论】:

    标签: python machine-learning decision-tree


    【解决方案1】:

    有多种方法可以使用 pandas 和 sklearn 将分类数据转换为数值:

    1. pandas.get_dummies()(一种热编码)
      示例:
    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame([['BMW', '1 Series M', 2011, 19, 3916, 46135],
           ['BMW', '1 Series', 2011,19, 3916, 40650],
           ['BMW', '1 Series', 2011,20, 3916, 36350],
           ['Acura', 'ZDX', 2012, 16, 204, 50620],
           ['Acura', 'ZDX', 2013, 16, 204, 50920],
           ['Lincoln', 'Zephyr', 2006, 17, 61, 28995]]) #Sample dataframe
    
    pd.get_dummies(df, columns = [0,1,2]) #Dummies of 1st,2nd and 3rd column
    

    输出

    2.LabelEncoder
    示例

    import numpy as np
    import pandas as pd
    from sklearn.preprocessing import LabelEncoder
    
    df = pd.DataFrame([['BMW', '1 Series M', 2011, 19, 3916, 46135],
           ['BMW', '1 Series', 2011,19, 3916, 40650],
           ['BMW', '1 Series', 2011,20, 3916, 36350],
           ['Acura', 'ZDX', 2012, 16, 204, 50620],
           ['Acura', 'ZDX', 2013, 16, 204, 50920],
           ['Lincoln', 'Zephyr', 2006, 17, 61, 28995]]) #Sample dataframe
    
    df[[0,1,2]].apply(LabelEncoder().fit_transform)
    

    输出(它只会给出需要与原始数据框组合的转换列)

    df.loc[0:,0:2] = df[[0,1,2]].apply(LabelEncoder().fit_transform) 
    #puts column back into dataframe
    

    输出

    【讨论】:

      【解决方案2】:

      实际上,您以错误的方式分配数据df.values[:, 0],请仅尝试df[:, 0]

      import numpy as np
      from sklearn.preprocessing import LabelEncoder
      le = LabelEncoder()
      
      data = [['BMW', '1 Series M', 19, 3916, 46135],
                 ['BMW', '1 Series', 19, 3916, 40650],
                 ['BMW', '1 Series', 20, 3916, 36350],
                 ['Acura', 'ZDX', 16, 204, 50620],
                 ['Acura', 'ZDX', 16, 204, 50920]]
      
      data = np.array(data, dtype="object")
      data[:,0] = le.fit_transform(data[:,0])
      data
      
      array([[1, '1 Series M', '19', '3916', '46135'],
         [1, '1 Series', '19', '3916', '40650'],
         [1, '1 Series', '20', '3916', '36350'],
         [0, 'ZDX', '16', '204', '50620'],
         [0, 'ZDX', '16', '204', '50920']], dtype=object)
      

      【讨论】:

        猜你喜欢
        • 2021-12-11
        • 1970-01-01
        • 2019-07-17
        • 1970-01-01
        • 1970-01-01
        • 2020-04-17
        • 1970-01-01
        • 2022-06-13
        • 1970-01-01
        相关资源
        最近更新 更多