管道输入错误“输入包含NaN”

时间:2017-07-31 19:24:18

标签: python scikit-learn pipelining

我正在尝试创建一个管道来帮助我处理一些数据:输入均值,缩放数据,然后拟合回归量。

我在使用Imputer时遇到了一些问题,并且可能使用了它。我知道我的数据包含NaN;但是当我尝试将它们插入管道内时,我得到一个ValueError:

Traceback (most recent call last):

File "<ipython-input-124-8517b294cb64>", line 1, in <module>
modelBuild(df)

File "C:/Users/tmori/Google Drive/Projects/Product Dimension Accuracy/Qubert_PredictiveModel/qubert_predictive_model.py", line 81, in modelBuild
clf_x = pipeline.fit_transform(df[['OverallHeight-ToptoBottom', 'OverallDepth-FronttoBack']], df['OverallWidth-SidetoSide'])

File "C:\Program Files\Anaconda\lib\site-packages\sklearn\pipeline.py", line 303, in fit_transform
return last_step.fit_transform(Xt, y, **fit_params)

File "C:\Program Files\Anaconda\lib\site-packages\sklearn\base.py", line 497, in fit_transform
return self.fit(X, y, **fit_params).transform(X)

File "C:\Program Files\Anaconda\lib\site-packages\sklearn\ensemble\forest.py", line 248, in fit
y = check_array(y, accept_sparse='csc', ensure_2d=False, dtype=None)

File "C:\Program Files\Anaconda\lib\site-packages\sklearn\utils\validation.py", line 407, in check_array
_assert_all_finite(array)

File "C:\Program Files\Anaconda\lib\site-packages\sklearn\utils\validation.py", line 58, in _assert_all_finite
" or a value too large for %r." % X.dtype)

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

到目前为止,我的代码看起来像这样:

def modelBuild(df):  
    imp = Imputer()  
    scl = StandardScaler()  
    clf = RandomForestRegressor()      
    pipeline = Pipeline([('imputer', imp),  
                         ('scaler', scl),  
                         ('clf', clf)])
    clf_x = pipeline.fit_transform(df[['OverallHeight-ToptoBottom', 'OverallDepth-FronttoBack']], df['OverallWidth-SidetoSide'])

以及DataFrame数据的示例:

StagName   OverallDepth-FronttoBack  OverallHeight-ToptoBottom  \
PtagPrSKU                                                        
AABP1004                        NaN                       48.0   
AAI2179                        28.0                       32.0   
AAI2180                        28.0                       32.0   
AAI2181                        36.0                       32.0   
AAI2182                        36.0                       32.0   

StagName   OverallWidth-SidetoSide  
PtagPrSKU                           
AABP1004                      64.0  
AAI2179                       55.0  
AAI2180                       55.0  
AAI2181                       71.0  
AAI2182                       71.0

我很确定我只是错误地使用了Imputer,但是我不能在我的生活中指出哪里。

提前感谢所有帮助!

最佳, 汤姆

2 个答案:

答案 0 :(得分:0)

尝试删除PtagPrSKU行。

所以在列名后你应该只有它们的值。执行此操作的简单方法是在加载数据时使用pandas并定义skiprows。

以下对我来说很好。

问题

PtagPrSKU行为每列插入一个空单元格(这是问题所在)。

我可以在link

找到我用于此示例的文件
from sklearn.preprocessing import Imputer
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import Pipeline
import pandas as pd



def buildit(df):
    imp = Imputer()  
    scl = StandardScaler()  
    clf = RandomForestRegressor()      
    pipeline = Pipeline([('imputer', imp), ('scaler', scl),  ('clf', clf)])
    clf_x = pipeline.fit_transform(df[['OverallHeight-ToptoBottom', 'OverallDepth-FronttoBack']], df['OverallWidth-SidetoSide'])

    return clf_x



df = pd.read_excel('t.xlsx',skiprows=[1])
print(df)
buildit(df)

答案 1 :(得分:-1)

从&#39; np.nan&#39;更改您的缺失值标识符到其他东西(可能是0或非常大的数字)。我有同样的问题,这对我有用。