Uribo182
@Uribo182

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

予測モデルが使えない

Q&A

Closed

解決したいこと

予測モデルが使えない

例)
Ruby on RailsでQiitaのようなWebアプリをつくっています。
記事を投稿する機能の実装中にエラーが発生しました。
解決方法を教えて下さい。

発生している問題・エラー

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
ValueError                                Traceback (most recent call last)
Input In [118], in <cell line: 30>()
     28 # 回帰モデルの呼び出し
     29 model = LinearRegression()
---> 30 model.fit(X_train,y_train)

File ~\anaconda3\lib\site-packages\sklearn\linear_model\_base.py:662, in LinearRegression.fit(self, X, y, sample_weight)
    658 n_jobs_ = self.n_jobs
    660 accept_sparse = False if self.positive else ["csr", "csc", "coo"]
--> 662 X, y = self._validate_data(
    663     X, y, accept_sparse=accept_sparse, y_numeric=True, multi_output=True
    664 )
    666 if sample_weight is not None:
    667     sample_weight = _check_sample_weight(sample_weight, X, dtype=X.dtype)

File ~\anaconda3\lib\site-packages\sklearn\base.py:581, in BaseEstimator._validate_data(self, X, y, reset, validate_separately, **check_params)
    579         y = check_array(y, **check_y_params)
    580     else:
--> 581         X, y = check_X_y(X, y, **check_params)
    582     out = X, y
    584 if not no_val_X and check_params.get("ensure_2d", True):

File ~\anaconda3\lib\site-packages\sklearn\utils\validation.py:964, in check_X_y(X, y, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, estimator)
    961 if y is None:
    962     raise ValueError("y cannot be None")
--> 964 X = check_array(
    965     X,
    966     accept_sparse=accept_sparse,
    967     accept_large_sparse=accept_large_sparse,
    968     dtype=dtype,
    969     order=order,
    970     copy=copy,
    971     force_all_finite=force_all_finite,
    972     ensure_2d=ensure_2d,
    973     allow_nd=allow_nd,
    974     ensure_min_samples=ensure_min_samples,
    975     ensure_min_features=ensure_min_features,
    976     estimator=estimator,
    977 )
    979 y = _check_y(y, multi_output=multi_output, y_numeric=y_numeric)
    981 check_consistent_length(X, y)

File ~\anaconda3\lib\site-packages\sklearn\utils\validation.py:800, in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator)
    794         raise ValueError(
    795             "Found array with dim %d. %s expected <= 2."
    796             % (array.ndim, estimator_name)
    797         )
    799     if force_all_finite:
--> 800         _assert_all_finite(array, allow_nan=force_all_finite == "allow-nan")
    802 if ensure_min_samples > 0:
    803     n_samples = _num_samples(array)

File ~\anaconda3\lib\site-packages\sklearn\utils\validation.py:114, in _assert_all_finite(X, allow_nan, msg_dtype)
    107     if (
    108         allow_nan
    109         and np.isinf(X).any()
    110         or not allow_nan
    111         and not np.isfinite(X).all()
    112     ):
    113         type_err = "infinity" if allow_nan else "NaN, infinity"
--> 114         raise ValueError(
    115             msg_err.format(
    116                 type_err, msg_dtype if msg_dtype is not None else X.dtype
    117             )
    118         )
    119 # for object dtype data, we only check for NaNs (GH-13254)
    120 elif X.dtype == np.dtype("object") and not allow_nan:

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

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

import os 
os.chdir(r'C:\フォルダー名')

import pandas as pd
#import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
from sklearn.model_selection import train_test_split
#from sklearn.ensemble import RandomForestClassifier


# CSVファイルの読み込み
df = pd.read_csv(r'C:\フォルダー名/ファイル名.csv')
#df = StandardScaler().fit_transform(df) 

# 説明変数
X=df.iloc[1:,2:11]
#X.drop(X.columns[np.isnan(X).any()], axis=1)
# 目的変数
y=df.iloc[1:,11]
#y.drop(y.columns[np.isnan(y).any()], axis=1)


#訓練データ,テストデータに分ける
X_train, X_test, y_train, y_test =train_test_split(X,y,random_state=0)


# 回帰モデル
model = LinearRegression()
model.fit(X_train,y_train)

#print(X_train)

自分で試したこと

X=df.iloc[1:,2:11]
の下に下記のコードを記載してみましたがNGでした。

#X.drop(X.columns[np.isnan(X).any()], axis=1)

0

1Answer

何かしらのコンペの内容っぽいですが、もう少し質問を一般化した方が良いでしょう。(データとかディレクトリとかは隠した方が良いかと…)

試されている通り、NaNが含まれていることが原因です。いわゆる欠損値除外/補完といわれる処理をする必要があります。
最も簡単で初歩的な処理は、欠損値を含むデータを除外することです。
例えばdf.dropna(how='any', axis = 0)のような処理をX, yに分ける前に行う、と言ったことが考えられます。
参考としては https://note.nkmk.me/python-pandas-nan-dropna/ などでしょうか。

そのほかの処理についても https://note.nkmk.me/python-pandas-nan-dropna-fillna/ を参考にしてみてください。

1Like

Comments

  1. @Uribo182

    Questioner

    早速のコメントありがとうございます。
    ディレクトリーは一般名にしていたと思っていたのですが、手違いでそのままになっていまいた。(;^_^A

    アドバイス頂きました内容を今晩やってみます。
  2. @Uribo182

    Questioner

    無事に欠損値を処理できました。参考URLもありがとうございます、いろんな欠損値の削除方法だけでなく、広範囲にわたった情報があり参考になります。

Your answer might help someone💌