web-dev-qa-db-ja.com

ValueError:データの前処理中に、入力にNaN、無限大、またはdtype( 'float64')に対して大きすぎる値が含まれています

2つのCSVファイルがあります( トレーニングセットテストセット )。いくつかの列に表示されるNaN値があるため(statushedge_valueindicator_codeportfolio_iddesk_idoffice_id)。

NaN値を、列に対応する巨大な値に置き換えることからプロセスを開始します。次に、LabelEncodingを実行してテキストデータを削除し、数値データに変換します。ここで、カテゴリデータに対してOneHotEncodingを実行しようとすると、エラーが発生します。 OneHotEncodingコンストラクターに1つずつ入力しようとしましたが、すべての列で同じエラーが発生します。

基本的に、私の最終目標は戻り値を予測することですが、これが原因でデータ前処理の部分で立ち往生しています。この問題を解決するにはどうすればよいですか?

使ってます Python3.6データ処理用にPandasおよびSklearnを使用します。

コード

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

test_data = pd.read_csv('test.csv')
train_data = pd.read_csv('train.csv')

# Replacing Nan values here
train_data['status']=train_data['status'].fillna(2.0)
train_data['hedge_value']=train_data['hedge_value'].fillna(2.0)
train_data['indicator_code']=train_data['indicator_code'].fillna(2.0)
train_data['portfolio_id']=train_data['portfolio_id'].fillna('PF99999999')
train_data['desk_id']=train_data['desk_id'].fillna('DSK99999999')
train_data['office_id']=train_data['office_id'].fillna('OFF99999999')

x_train = train_data.iloc[:, :-1].values
y_train = train_data.iloc[:, 17].values

# =============================================================================
# from sklearn.preprocessing import Imputer
# imputer = Imputer(missing_values="NaN", strategy="mean", axis=0)
# imputer.fit(x_train[:, 15:17])
# x_train[:, 15:17] = imputer.fit_transform(x_train[:, 15:17])
# 
# imputer.fit(x_train[:, 12:13])
# x_train[:, 12:13] = imputer.fit_transform(x_train[:, 12:13])
# =============================================================================


# Encoding categorical data, i.e. Text data, since calculation happens on numbers only, so having text like 
# Country name, Purchased status will give trouble
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X = LabelEncoder()
x_train[:, 0] = labelencoder_X.fit_transform(x_train[:, 0])
x_train[:, 1] = labelencoder_X.fit_transform(x_train[:, 1])
x_train[:, 2] = labelencoder_X.fit_transform(x_train[:, 2])
x_train[:, 3] = labelencoder_X.fit_transform(x_train[:, 3])
x_train[:, 6] = labelencoder_X.fit_transform(x_train[:, 6])
x_train[:, 8] = labelencoder_X.fit_transform(x_train[:, 8])
x_train[:, 14] = labelencoder_X.fit_transform(x_train[:, 14])


# =============================================================================
# import numpy as np
# x_train[:, 3] = x_train[:, 3].reshape(x_train[:, 3].size,1)
# x_train[:, 3] = x_train[:, 3].astype(np.float64, copy=False)
# np.isnan(x_train[:, 3]).any()
# =============================================================================


# =============================================================================
# from sklearn.preprocessing import StandardScaler
# sc_X = StandardScaler()
# x_train = sc_X.fit_transform(x_train)
# =============================================================================

onehotencoder = OneHotEncoder(categorical_features=[0,1,2,3,6,8,14])
x_train = onehotencoder.fit_transform(x_train).toarray() # Replace Country Names with One Hot Encoding.

エラー

Traceback (most recent call last):

  File "<ipython-input-4-4992bf3d00b8>", line 58, in <module>
    x_train = onehotencoder.fit_transform(x_train).toarray() # Replace Country Names with One Hot Encoding.

  File "/Users/parthapratimneog/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/data.py", line 2019, in fit_transform
    self.categorical_features, copy=True)

  File "/Users/parthapratimneog/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/data.py", line 1809, in _transform_selected
    X = check_array(X, accept_sparse='csc', copy=copy, dtype=FLOAT_DTYPES)

  File "/Users/parthapratimneog/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py", line 453, in check_array
    _assert_all_finite(array)

  File "/Users/parthapratimneog/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py", line 44, 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').
3

質問を投稿した後、データセットをもう一度調べていたところ、NaNのある別の列が見つかりました。 Pandas関数を使用して、NaNを持つ列のリストを取得できたのに、これに多くの時間を無駄にしたとは信じられません。したがって、次を使用します。コードで、3つの列が欠落していることがわかりました。この関数を使用できたときに、視覚的にNaNを検索していました。これらの新しいNaNsを処理した後、コードは正しく機能しました。

pd.isnull(train_data).sum() > 0

結果

portfolio_id      False
desk_id           False
office_id         False
pf_category       False
start_date        False
sold               True
country_code      False
euribor_rate      False
currency          False
libor_rate         True
bought             True
creation_date     False
indicator_code    False
sell_date         False
type              False
hedge_value       False
status            False
return            False
dtype: bool
6

エラーは、非カテゴリ機能として扱っている他の機能にあります。

_'hedge_value'_、_'indicator_code'_などの列には、元のcsvのTRUEFALSEfillna()の_2.0_などの混合型データが含まれます。コール。 OneHotEncoderはそれらを処理できません。

OneHotEncoder fit()ドキュメントに記載されているように:

_ fit(X, y=None)

    Fit OneHotEncoder to X.
    Parameters: 

    X : array-like, shape [n_samples, n_feature]

        Input array of type int.
_

すべてのXが数値(intですが、floatでもかまいません)タイプである必要があることがわかります。

回避策として、これを実行してカテゴリカル機能をエンコードできます。

_X_train_categorical = x_train[:, [0,1,2,3,6,8,14]]
onehotencoder = OneHotEncoder()
X_train_categorical = onehotencoder.fit_transform(X_train_categorical).toarray()
_

次に、これを非カテゴリ機能と連結します。

1
Vivek Kumar

本番環境で使用するためのベストプラクティスは、Imputerを使用してから、モデルとともにpklに保存することです

これは大失敗です

df[df==np.inf]=np.nan
df.fillna(df.mean(), inplace=True)

使用する方が良い this

0
Kohn1001