Python的 - SkLearn转嫁给使用

问题描述 投票:5回答:4

我有以下问题:我有一个熊猫数据帧,其中丢失的值由串标na。我想在其上运行的Imputer与列均值替换缺失值。按照sklearn文件,该参数missing_values要帮我这个:

missing_values:整数或“南”,可选的(缺省值=”南”)的缺失值的占位符。 missing_values的所有事件会被计算。对于丢失的编码为np.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
4个回答
3
投票

既然你说你要通过列的平均值来代替这些'na',我猜非缺失值的确漂浮。问题是,大熊猫无法识别字符串'na'作为缺失值,因此读取与D型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是D型objectcol2是D型float64的。但是,你怎么拿一把对象的意思呢?

解决的办法是告诉pd.read_csv()解释字符串'na'的缺失值:

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

所得到的数据帧具有D型float64的两列,你现在可以使用imputer。


0
投票

这是我收到的错误

IndexError:在未来,0-d布尔阵列将被解释为有效的布尔值的索引

在我来说,我有问题与“中间”的策略,改变它的意思或most_frequent工作。


0
投票

第一进口 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" (两个策略是有其遵循即中间和最经常发生在你的数据集,但默认情况下平均值。然后设置轴=(0列和1列),其他的副本,并详细),你可以阅读更多关于它的

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

数据融入你的定义Imputer的方式,然后使用变换方法改变它。这将返回数据类型=物体的阵列

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

记住这里所选列显示只包含浮动或整数类型的值,否则这可能会显示错误不能字符串转换为浮动


0
投票

还有,你需要在这里要注意几件事。

确保你是不是归咎于上键入“对象”或分类变量,你可以对你的数据是这样看:

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

现在,这是所有好,很好,但不能在范畴进行(Object类型/串)

来处理它的方法之一,是改变类别特征为数字,是这样的:

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

和Info

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

© www.soinside.com 2019 - 2024. All rights reserved.