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

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

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

Kaggleは、機械学習モデルを構築するコンペティションのプラットフォームおよびその運営企業を指します。企業や政府といった組織とデータサイエンティスト・機械学習エンジニアを繋げるプラットフォームであり、単純なマッチングではなくコンペティションが特徴です。

機械学習

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4259閲覧

lightgbm:不可解な32.3Gib使用によるメモリ不足

esklia

総合スコア81

Kaggle

Kaggleは、機械学習モデルを構築するコンペティションのプラットフォームおよびその運営企業を指します。企業や政府といった組織とデータサイエンティスト・機械学習エンジニアを繋げるプラットフォームであり、単純なマッチングではなくコンペティションが特徴です。

機械学習

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/07/29 11:07

編集2021/07/30 01:13

1枚目画像のメモリの大きさを持った訓練データに対してlightgbmを使用して
時系列クロスバリデーションをしたところ、
イメージ説明

下記画像のように、メモリエラーが発生しました。たった19.40MBもの訓練データから32.3Gibもの膨大なメモリ消費をする原因がわかっていません。

イメージ説明

その時の学習実行コードは以下の通りです。(学習実行コードは下のほうへ移動しました。)

この大量のメモリ消費の原因と、解決策をご教授いただけませんか。
追記事項
バージョン

Python 3.8.10 pandas 1.2.5 lightgbm 3.1.1 notebook 6.4.0 py38haa95532_0 numba 0.53.1 py38hf11a4ad_0 numpy 1.20.2 py38ha4e8547_0 numpy-base 1.20.2 py38hc2deb75_0

生のトレインデータ
イメージ説明

加工後のトレインデータ
イメージ説明

それぞれva_period = 1で実行時の
訓練データ、検証データ
訓練データのy、検証データのyの大きさ
(254302, 10) (254302, 10)
(254302, 1) (254302, 1)

全コード # main module import matplotlib.pyplot as plt import seaborn as sns import pandas as pd import pandas_profiling as pdp import numpy as np import lightgbm as lgb from sklearn.metrics import log_loss import datetime import logging import sys, os sys.path.append('../src/') import eda import maprepro as mpre # import config # from utils import setup_logger, ModelFactory path = '../../input' sample = pd.read_csv(f'{path}/sample_submission.csv') store = pd.read_csv(f'{path}/store.csv') test = pd.read_csv(f'{path}/test.csv') train = pd.read_csv(f'{path}/train.csv') def mk_ymd(df): df['year'] = df.Date.apply(lambda x: x.split('-')[0]).astype(np.int16) df['month'] = df.Date.apply(lambda x: x.split('-')[1]).astype(np.int16) df['day'] = df.Date.apply(lambda x: x.split('-')[2]).astype(np.int16) df = df.sort_values('Date') return df train = mk_ymd(train) test = mk_ymd(test) # 時系列データであり、時間に沿って変数periodを設定したとする train['period'] = np.arange(0, len(train)) // (len(train) // 4) train['period'] = np.clip(train['period'], 0, 3) test['period'] = 4 train['StateHoliday'] = train.StateHoliday.astype('category') target = ['Sales'] notuse = ['Id','Date','Open'] use = ['Store','DayOfWeek','Open','Promo','StateHoliday','SchoolHoliday','year','month','day','period'] train_y = train[target] train_x = train[use] test_x = test[use] import warnings warnings.simplefilter('ignore') train_x = eda.reduce_mem_usage(train_x) >>>start size(BEFORE): 57.24 Mb >>>Mem. usage decreased to 19.40 Mb (AFTER:66.1% reduction) import gc gc.collect() va_period_list = [1, 2, 3] for va_period in va_period_list: is_tr = train_x['period'] < va_period is_va = train_x['period'] == va_period tr_x, va_x = train_x[is_tr], train_x[is_va] tr_y, va_y = train_y[is_tr], train_y[is_va] print(tr_x.shape, va_x.shape) print(tr_y.shape, va_y.shape) lgb_train = lgb.Dataset(tr_x, tr_y) lgb_eval = lgb.Dataset(va_x, va_y) # ハイパーパラメータの設定 params = {'objective': 'binary', 'seed': 71, 'verbose': 1, 'metrics': 'binary_logloss', 'force_col_wise':'true' # メモリが足りないから } num_round = 10 # 学習の実行 # カテゴリ変数をパラメータで指定している # バリデーションデータもモデルに渡し、学習の進行とともにスコアがどう変わるかモニタリングする categorical_features = ['StateHoliday'] model = lgb.train(params, lgb_train, num_boost_round=num_round, categorical_feature=categorical_features, valid_names=['train', 'valid'], valid_sets=[lgb_train, lgb_eval], ) # バリデーションデータでのスコアの確認 va_pred = model.predict(va_x) score = log_loss(va_y, va_pred) print(f'logloss: {score:.4f}') # 予測 pred = model.predict(test_x)

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

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

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

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

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

toast-uz

2021/07/29 22:24

単純に乱数でサイス(1017209, 10)の訓練データを作って提示されたコードを実行しても、何もエラーは出ませんでした。よって質問者様の環境またはデータに問題があるかもしれません。python、lightgbm、pandasなどの主要なライブラリバージョン、train_xを生成するコード、そのコードに取り込むデータの先頭10行程度、などを提示いただけますか?
esklia

2021/07/30 01:12

追記いたしました。よろしくお願いいたします。 ・1200×34くらいのデータではさすがに学習は回っていた記憶があります。 ・また、MemoryError: Unable to allocate 32.3 GiB for an array with shape (254302, 17072) and data type int64に記載の通り、列数が10から(254302, 17072) に膨れ上がっていることが不可解です。 ・ベースラインモデル、一番最初に学習が回るか確かめるためのモデルなのでほぼほぼ前処理は行っておりません。時系列スプリットしたかったので、時系列を特定する特徴量を追加したくらいです。
esklia

2021/07/30 01:14

ところで、toast様のお使いのパソコンのメモリが64GBとかそういうことではありませんか?32.3Gib以上のメモリがあれば回りそうなので、一応確認させていただきたいです。
toast-uz

2021/07/30 03:34 編集

回答ありがとうございます。確かに、(254302, 17072) でint64だと、計算上34GiBくらいなので、変に膨れ上がっているように見えますね。 環境条件はほぼ同一と思います。また後で再現を試みてみます。私のパソコンのメモリは8GBです。
esklia

2021/07/30 04:05

もうしわけございません。lightgbmをbinary二値分類で設定してしまっていたことが原因のようでした。
guest

回答1

0

自己解決

lightgbmをbinary二値分類で設定してしまっていたことが原因のようでした。

投稿2021/07/30 04:05

esklia

総合スコア81

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問