質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

1758閲覧

クロスバリデーションのスコアについて

shu214

総合スコア18

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2020/05/12 17:30

前提・実現したいこと

勾配ブ―スティング(lightGBM)の交差検証でスコアの平均をとりたいのですが、そこでエラーが発生します。

発生している問題・エラーメッセージ

ValueError Traceback (most recent call last) <ipython-input-55-f70fb4b38d33> in <module> 14 va_pred = model.predict(train.iloc[valid_index]) 15 va_target = y[valid_index] ---> 16 score += np.sqrt(mean_squared_error(va_pred, va_target)) / NFOLDS 17 y_oof[valid_index] = va_pred 18 print("{:2.0f}分{:2.0f}秒".format((time.time()-fold_start)//60,(time.time()-fold_start)%60)) /usr/anaconda3.7/lib/python3.7/site-packages/sklearn/metrics/regression.py in mean_squared_error(y_true, y_pred, sample_weight, multioutput) 237 """ 238 y_type, y_true, y_pred, multioutput = _check_reg_targets( --> 239 y_true, y_pred, multioutput) 240 check_consistent_length(y_true, y_pred, sample_weight) 241 output_errors = np.average((y_true - y_pred) ** 2, axis=0, /usr/anaconda3.7/lib/python3.7/site-packages/sklearn/metrics/regression.py in _check_reg_targets(y_true, y_pred, multioutput) 75 check_consistent_length(y_true, y_pred) 76 y_true = check_array(y_true, ensure_2d=False) ---> 77 y_pred = check_array(y_pred, ensure_2d=False) 78 79 if y_true.ndim == 1: /usr/anaconda3.7/lib/python3.7/site-packages/sklearn/utils/validation.py 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, warn_on_dtype, estimator) 571 if force_all_finite: 572 _assert_all_finite(array, --> 573 allow_nan=force_all_finite == 'allow-nan') 574 575 shape_repr = _shape_repr(array.shape) /usr/anaconda3.7/lib/python3.7/site-packages/sklearn/utils/validation.py in _assert_all_finite(X, allow_nan) 54 not allow_nan and not np.isfinite(X).all()): 55 type_err = 'infinity' if allow_nan else 'NaN, infinity' ---> 56 raise ValueError(msg_err.format(type_err, X.dtype)) 57 58
Input contains NaN, infinity or a value too large for dtype('float64').

該当のソースコード

Python

1NFOLDS = 4 2folds = KFold(n_splits=NFOLDS, random_state=777) 3start = time.time() 4y_preds = np.zeros(train.shape[0]) 5y_oof = np.zeros(train.shape[0]) 6score = 0 7splits = folds.split(train, y) 8 9for fold_n, (train_index, valid_index) in enumerate(splits): 10 fold_start = time.time() 11 lg_train = lgb.Dataset(train.loc[train_index], label=y[train_index]) 12 lg_test = lgb.Dataset(train.loc[valid_index], label=y[valid_index]) 13 model = lgb.train(params, lg_train, 10000, valid_sets = [lg_train, lg_test], verbose_eval=500, early_stopping_rounds=500) 14 va_pred = model.predict(train.loc[valid_index]) 15 va_target = y[valid_index] 16 score += np.sqrt(mean_squared_error(va_pred, va_target)) / NFOLDS 17 y_oof[valid_index] = va_pred 18 print("{:2.0f}分{:2.0f}秒".format((time.time()-fold_start)//60,(time.time()-fold_start)%60)) 19print("合計") 20print("{:2.0f}分{:2.0f}秒".format((time.time()-start)//60,(time.time()-start)%60)) 21print(f"\nMean RMSLE = {score}") 22print(f"Out of folds RMSLE = {np.sqrt(mean_squared_error(y_oof, y))}") 23print() 24va_pred.mean(axis=0)

試したこと

検証データとその予測値をデータフレームに格納して中身を確認しました。
欠損値や無限大は含まれていないようでした。
予測値に少数はありますが、計算不可能になるほどではないような気がします。(有効桁数が何桁かはわからないです)

ご回答よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決に至りました。
見てくださった方、考えてくださった方、本当に申し訳ありません。
ありがとうございます。

Python

1train_data = pd.read_csv('train_data.csv', index_col = 'id') 2test_data = pd.read_csv('test_data.csv', index_col = 'id')

一番最初の読み込みの部分が原因でした。
ここではデータのインデックスにidというカラムを指定しており、このカラムは1から始まります。
しかし、KFoldのCVではインデックスを通常の0始まりのものを指定しており、中身ではインデックス0のデータがないものとしてNaNとなっていようです。
僕の投稿した内容からはこの原因には気づきにくかったです。申し訳ありませんでした。

Python

1train_data = pd.read_csv('train_data.csv') 2test_data = pd.read_csv('test_data.csv')

このように直せば、問題なく動きました。

投稿2020/05/13 15:27

shu214

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問