【问题标题】:using DictVectorizer to convert strings使用 DictVectorizer 转换字符串
【发布时间】:2018-04-30 06:41:20
【问题描述】:
satisfaction_level  last_evaluation number_project  average_montly_hours    time_spend_company  Work_accident   left    promotion_last_5years   dept    salary
0.38    0.53    2   157 3   0   1   0   TECHNICAL   low
0.8 0.86    5   262 6   0   1   0   HR  medium
0.11    0.88    7   272 4   0   1   0   HR  medium
0.72    0.87    5   223 5   0   1   0   FINANCE low
0.37    0.52    2   159 3   0   1   0   MARKETING   low
0.41    0.5 2   153 3   0   1   0   TECHNICAL   low
0.1 0.77    6   247 4   0   1   0   HR  low
0.92    0.85    5   259 5   0   1   0   FINANCE low
0.89    1   5   224 5   0   1   0   HR  low

我使用了上述数据并尝试使用 DictVectorizer 转换 C。代码如下


import pandas as pd
from sklearn.feature_extraction import DictVectorizer

dv=DictVectorizer() 
hr_data=pd.read_csv(r"C:\Users\IBM_ADMIN\Desktop\data\HR_comma_sep.csv")
dv.fit_transform(X=hr_data.dept)

但它抛出了错误:

'str'对象没有属性'items'

【问题讨论】:

    标签: python pandas machine-learning scikit-learn dictvectorizer


    【解决方案1】:

    使用LabelEncoder:

    In [304]: df.dept
    Out[304]:
    0    TECHNICAL
    1           HR
    2           HR
    3      FINANCE
    4    MARKETING
    5    TECHNICAL
    6           HR
    7      FINANCE
    8           HR
    Name: dept, dtype: object
    
    In [305]: from sklearn.preprocessing import LabelEncoder
    
    In [306]: le = LabelEncoder()
    
    In [307]: df['dept'] = le.fit_transform(df['dept'])
    
    In [308]: df.dept
    Out[308]:
    0    3
    1    1
    2    1
    3    0
    4    2
    5    3
    6    1
    7    0
    8    1
    Name: dept, dtype: int64
    
    In [309]: le.classes_
    Out[309]: array(['FINANCE', 'HR', 'MARKETING', 'TECHNICAL'], dtype=object)
    

    【讨论】:

      【解决方案2】:

      或者我们可以使用category

      df.dept.astype('category').cat.codes
      Out[925]: 
      0    3
      1    1
      2    1
      3    0
      4    2
      5    3
      6    1
      7    0
      8    1
      dtype: int8
      
      df.dept.astype('category').cat.categories
      Out[926]: Index(['FINANCE', 'HR', 'MARKETING', 'TECHNICAL'], dtype='object')
      

      【讨论】:

      • 美观又简单。
      【解决方案3】:

      这是一个老问题,但我遇到了同样的问题并解决了: 首先,将数据框改为字典

      data_dict = data.to_dict()
      
      dv = DictVectorizer(sparse = False, dtype = int)
      dv.fit_transform(data['column'])
      

      为我工作!

      【讨论】:

      • 您的意思是输入dv.fit_transform(data_dict['column']) 吗?您创建了字典,但从不使用它。
      【解决方案4】:

      其实你也应该试试这个:

      如果值是字符串,则先使用LabelEncoder将它们转换为数字类别,然后使用DictVectorizer:

      le = LabelEncoder()
      data_le = le.fit_transform(data)
      

      【讨论】:

        【解决方案5】:

        这可能是因为DictVectorizer 是一个用于字典的类,而您将其应用于 Series 对象(通过字典或属性样式访问列的结果)。对于这种情况,我建议 OneHotEncoder 来自 sklearn.preprocessing 的课程。

        DictVectorizer 适用于字典:

        vec = DictVectorizer(sparse = False, dtype = int)
        data = [{'character': 'Porthos'},{'character': 'Athos'},
                {'character': 'Aramis'}, {'character': 'Athos'},
                {'character': 'Aramis'}
        
        vec.fit_transform(data)
        array([[0, 0, 1],
               [0, 1, 0],
               [1, 0, 0],
               [0, 1, 0],
               [1, 0, 0]])
        

        但对于 Series 或 DataFrames 而言并非如此:

        data = pd.DataFrame(data)
        vec.fit_transform(data)
        
        *long error*
        AttributeError: 'str' object has no attribute 'items'
        

        对于 Pandas 的 DataFrames 和 Series,请使用 OneHotEncoder

        from sklearn.preprocessing import OneHotEncoder
        vec = OneHotEncoder(sparse = False, dtype = int)
        vec.fit_transform(data)
        array([[0, 0, 1],
               [0, 1, 0],
               [1, 0, 0],
               [0, 1, 0],
               [1, 0, 0]])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-21
          • 1970-01-01
          • 2020-06-30
          • 2014-05-05
          • 1970-01-01
          • 2017-01-12
          • 2016-03-23
          • 1970-01-01
          相关资源
          最近更新 更多