scikit learn - Python - SkLearn Imputer usage



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

missing_values:整型或" NaN ",可选(default= " NaN ")缺失值的占位符。missing_values的所有出现将被归罪于。对于编码为np的缺失值。南,用绳子值"NaN"。

在我的理解中,这意味着如果我写
df = pd.read_csv(filename)
imp = Imputer(missing_values='na')
imp.fit_transform(df)

,这将意味着输入器用na值替换数据帧中的任何内容,即该列的平均值。然而,我得到了一个错误:

ValueError: could not convert string to float: na

我误解了什么?这难道不应该是灌输者的工作方式吗?那么,我如何用平均值替换na字符串呢?我应该用一个来表示吗?

谢谢!

既然您说要用列的平均值替换这些'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。

这是我收到的错误

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

在我的例子中,我有"中位数"策略的问题,将其更改为mean或most_frequency工作

先导入 pandas ,再读取your_file_name.csv iloc 定义为pandas.DataFrame.iloc,是基于位置的整数索引。这里的格式为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" (另外两个)策略是它遵循的,即中值和最常出现的你的数据集,但默认是平均值。然后set axis =(0表示列,1表示行),其他是copy和verbose)您可以在

上阅读更多信息
from sklearn.preprocessing import Imputer
i = Imputer(missing_values="NaN", strategy="mean", axis=0) 

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

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

请记住这里所选的列只包含浮点或整型值,否则可能会显示错误无法将字符串转换为浮点

这里有几件事需要注意。

确保你没有输入类型"对象"或类别变量,你可以像这样查看你的数据:

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

现在这一切都很好,但不能在category (type Object/String)

上完成处理它的一种方法是将分类特性更改为数字,如下所示:
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

如果我们使用与上面相同的输入器,我们会得到一个错误(你可以尝试一下)

现在让我们将'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

相关内容

  • 没有找到相关文章

最新更新