【问题标题】:Python - SkLearn Imputer usagePython - SkLearn Imputer 用法
【发布时间】:2016-11-04 03:44:51
【问题描述】:

我有以下问题:我有一个 pandas 数据框,其中缺失值由字符串 na 标记。我想在其上运行 Imputer 以用列中的平均值替换缺失值。根据 sklearn 文档,参数 missing_values 应该可以帮助我解决这个问题:

missing_values:整数或“NaN”,可选(默认=“NaN”) 缺失值的占位符。所有出现的缺失值 将被估算。对于编码为 np.nan 的缺失值,请使用字符串 值“NaN”。

在我的理解中,这意味着,如果我写了

df = pd.read_csv(filename)
imp = Imputer(missing_values='na')
imp.fit_transform(df)

这意味着 imputer 将数据框中的任何内容替换为 na 值和列的平均值。然而,相反,我得到一个错误:

ValueError: could not convert string to float: na

我误解了什么?这不是 imputer 应该如何工作的吗?那么如何用平均值替换na 字符串呢?我应该只使用 lambda 吗?

谢谢!

【问题讨论】:

    标签: python scikit-learn imputation


    【解决方案1】:

    既然你说你想用列的平均值替换这些'na',我猜非缺失值确实是浮点数。问题是 pandas 不会将字符串 'na' 识别为缺失值,因此读取 dtype 为 object 的列而不是 float 的某种风格。

    例如,考虑以下.csv 文件:

     test.csv
    
     col1,col2
     1.0,1.0
     2.0,2.0
     3.0,3.0
     na,4.0
     5.0,5.0
    

    通过简单的导入df = pd.read_csv('test.csv')df.dtypes 告诉我们col1 的dtype 为object,而col2 的dtype 为float64。但是如何取一堆对象的平均值呢?

    解决方案是告诉pd.read_csv() 将字符串'na' 解释为缺失值:

    df = pd.read_csv('test.csv', na_values='na')
    

    生成的数据框有两列 dtype float64,您现在可以使用您的 imputer。

    【讨论】:

      【解决方案2】:

      这是我收到的错误

      IndexError:将来,0-d 布尔数组将被解释为有效的布尔索引

      就我而言,我遇到了“中值”策略的问题,将其更改为 mean 或 most_frequent 有效。

      【讨论】:

        【解决方案3】:

        首先导入 pandas ,然后读取your_file_name.csv 。并且 iloc 被定义为 pandas.DataFrame.iloc 并且是基于 purley 整数的索引,用于按位置进行定位。这里的格式是iloc[for row index , for column index] 其中a,b,c,d是整数ab,c,d也可以为空

        import pandas as pd
        dataSet = pd.read_csv('your_file_name.csv')
        X = dataSet.iloc[ a:b , c:d].values
        

        如果你在没有 .values 的情况下使用,那么你将无法将其用于 imputer 进行转换
        在这里导入 Imputer 后定义你的Imputer 参数missing_values =
        “要替换的数据中的缺失值”,strategy ="mean" (还有两个 它遵循的策略是中位数,最常发生在 您的 dataSet 但默认值是 mean 。然后设置axis =(0代表列,1代表行),其他是复制和详细)你可以阅读更多关于它的内容

        from sklearn.preprocessing import Imputer
        i = Imputer(missing_values="NaN", strategy="mean", axis=0) 
        

        将数据拟合到您定义的 Imputer 方式中,然后使用 transform 方法对其进行转换。这将返回 datatype = object 的数组

        i  = i.fit(X[a:b, c:d])
        X[a:b, c:d ] = i.transform(X[a:b,c:d])
        

        请记住,您选择的列显示仅包含浮点或整数类型值,否则可能会显示错误无法将字符串转换为浮点数

        【讨论】:

          【解决方案4】:

          这里有几点需要注意。

          确保您没有在类型“对象”或分类变量上进行估算,您可以像这样查看您的数据:

          df = pd.read_csv(filename)
          
          print(df.info(null_counts=True))
          

          最后一列应该是类型

          我们来看一个例子:

          df = pd.DataFrame({'A' : [1, 2, 2, 2, 'NaN', 3, 4, 5, 6], 'B' : [3, 3, 'NaN', 3, 3, 4, 3, 3, 3]})
          

          输出:

          df.head()
          
          
              A   B
          ---------
          0   1   3
          1   2   3
          2   2   NaN
          3   2   3
          4   NaN 3
          

          现在让我们看看类型

          df.info(null_counts=True)
          
          <class 'pandas.core.frame.DataFrame'>
          RangeIndex: 9 entries, 0 to 8
          Data columns (total 2 columns):
          0    9 non-null float64
          1    9 non-null float64
          dtypes: float64(2)
          memory usage: 224.0 bytes
          

          现在估算:

          from sklearn.preprocessing import Imputer
          imputer = Imputer(missing_values='NaN', strategy='most_frequent', axis=0)
          df_imputed = pd.DataFrame(imputer.fit_transform(df))
          df_imputed.head()
          
          
              0   1
          -----------
          0   1.0 3.0
          1   2.0 3.0
          2   2.0 3.0
          3   2.0 3.0
          4   2.0 3.0
          

          现在这一切都很好,但不能在分类(类型对象/字符串)上完成

          处理它的一种方法是将分类特征更改为数字,如下所示:

          df_with_cat = pd.DataFrame({'A': ['ios', 'android', 'web', 'NaN'], 'B' : [4, 4, 'NaN', 2]})
          df_with_cat.head()
          
          
                A     B
          -------------
          0   ios     4
          1   android 4
          2   web     NaN
          3   NaN     2
          

          还有信息

          df_with_cat.info(null_counts=True)
          
          <class 'pandas.core.frame.DataFrame'>
          RangeIndex: 4 entries, 0 to 3
          Data columns (total 2 columns):
          A    4 non-null object
          B    4 non-null object
          dtypes: object(2)
          memory usage: 144.0+ bytes
          

          我们确定 B 是数字所以,让我们这样做:

          df_with_cat['B'] = df_with_cat['B'].astype(np.float)
          df_with_cat.info()
          
          <class 'pandas.core.frame.DataFrame'>
          RangeIndex: 4 entries, 0 to 3
          Data columns (total 2 columns):
          A    4 non-null object
          B    3 non-null float64
          dtypes: float64(1), object(1)
          memory usage: 144.0+ bytes
          

          如果我们使用上面相同的 imputer,我们会得到一个错误(你可以试试)

          现在让我们将“A”类别转换为数字:

          CATEGORICAL_FEATURES = [
              'A', 
          ]
          data_dum = pd.get_dummies(df_with_cat, columns=['A'], drop_first=True)
          data_dum.head()
          
              B   A_android   A_ios   A_web
          ---------------------------------
          0   4       0         1       0
          1   4       1         0       0
          2   NaN     0         0       1
          3   2       0         0       0
          

          现在我们可以在我们的数据框上从上面运行相同的 Imputer

          【讨论】:

            猜你喜欢
            • 2019-05-23
            • 2019-05-26
            • 1970-01-01
            • 2018-03-23
            • 2019-10-17
            • 2021-08-24
            • 2020-01-23
            • 2018-11-24
            • 1970-01-01
            相关资源
            最近更新 更多