日々精進

新しく学んだことを書き留めていきます

pd.concatでDataFrameを列方向に連結する場合、indexが揃っているか確認する

pd.concat([df1, df2], axis="comuns")

のようにして列方向に連結する場合、df1とdf2のindexが同じ行同士を結合させるので、indexの値が揃ってないと例えば「df1にあった列はすべてnanでdf2にあった列にだけ値が入っている行」とかが出来てしまう。

reset_index()を実行してからconcatした方が安全。

pd.concatでDataFrameを列方向に連結する場合、indexが揃っているか確認する

pd.concat([df1, df2], axis="comuns")

のようにして列方向に連結する場合、df1とdf2のindexが同じ行同士を結合させるので、indexの値が揃ってないと例えば「df1にあった列はすべてnanでdf2にあった列にだけ値が入っている行」とかが出来てしまう。

reset_index()を実行してからconcatした方が安全。

SageMaker PipelinesからManaged Spot Trainingを実行した場合、中断からの再開後のログを見る方法

通常、SageMaker PipelinesからTrainingJobを実行した場合、以下の方法でログを見る。

SageMakerStudio>SageMaker resourcesでProjectを選択>Pipelineを選択>Pipeline Executionを選択>Stepを選択>Logsタブを選択>「View logs in CloudWatch console」をクリック>表示されているLog Streamをクリック

ただし、SageMaker PipelinesからManaged Spot Training Jobを実行した場合、途中でJobが中断・再開されることがある。その場合、上記の手順でログを見ても中断までのログしか見えないので「本当に再開後処理できているのか?」と不安になるが再開後は単に別のLog Streamにログが出力されているだけだった。

上記の「表示されているLog Streamをクリック」のStepで、検索ボックスに入力されている文字列の/以降の部分を削除すると再開後のStreamも表示されるようになる。

いやこれ、「View logs in CloudWatch console」をクリックしたら再開後のStreamが表示されるようにすべきでは。

lightgbmでpredictを実行すると「{ValueError}train and valid dataset categorical_feature do not match.」エラー

以下の記事を書いたときとは別の原因で掲題のエラーが発生した。

anton0825.hatenablog.com

原因は、学習時と精度検証時で使用するモデルを取り違えていたこと。

特徴量生成のコードを修正しているときで、学習回す度に特徴量の数が変わっていた。ちょっと古いモデルを読み込んで精度検証をしてしまっていたのでcategorical featureの数が違うというエラーが発生した。

まだ気付きやすいエラーが発生して良かった。。エラーが起きず精度が下がるだけとかだと原因の特定が難しい。。

SageMaker TrainingJobを実行すると「InternalServerError」エラー

CloudWatchでログを見てもエラーメッセージは出ておらず、TrainingJobの詳細画面には以下のメッセージが出ていた。

Failure reason
InternalServerError: We encountered an internal error. Please try again.

原因はディスク容量不足だった。TrainingJobの詳細画面に表示されているDiskUtilizationのグラフは60%程度だったので気付くのが遅くなった。恐らく、DiskUtilizationのグラフの更新間隔が割と広いのでグラフの使用率が100%近くなっていなかったと思われる。

ディスク足りない場合、そのことが分かるエラーメッセージにしてほしい。。

JUnitのassertThrowsで例外がthrowされることをテストしたらエラーメッセージがログに出る

以下のように、assertThrowsでExceptionがthrowされることをテストする場合。

assertThrows(Exception.class, () -> myObj.method());

想定通りの例外がthrowされた場合でも以下のようなエラーメッセージがログに出るので邪魔くさい。

Exception in thread "pool-14-thread-1" java.lang.RuntimeException: ...

原因は、javaでlambdaを実行すると自動的に別スレッドが起動され、そこでlambda関数が実行され、別スレッドで実行中にcatchされない例外があった場合自動的にエラーメッセージをログに出してしまうため。メインスレッドの方に例外を伝播してくれれば別スレッドでcatchされない場合でもエラーメッセージ出さなくていいと思うが。。

以下のように、一時的にcatchされない例外があってもエラーログを出さないようにして対応した。

Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler((t, e) -> {});
assertThrows(Exception.class, () -> myObj.method());
Thread.setDefaultUncaughtExceptionHandler(defaultHandler);

参考:

maku77.github.io