『書籍のエラー対策』 Pythonのscikit-learnライブラリでk-means法 モデル変数のメソッドfit()を実行する際、「UserWarning: KMeans is known to have a memory leak on Windows will MKL, …」が表示される

インプレスの「スッキリわかる Pythonによる機械学習入門」のエラー対策記事です。

書籍に記述されているコードを間違いなく入力しても警告(Warning)が発生した箇所があったので対策方法を掲載します。

エラーではなく警告なので処理結果は得られるのですが、気持ちの良いものではありませんので、対策します。

警告内容

P.544 第Ⅲ部 第15章 「教師なし学習2:クラスタリング」 – 15.3.2 モデルの作成 / モデルに学習させる のコード15-7 fitメソッドで、モデルに学習させる

# モデルに学習させる
model.fit(sc_df)

を実行すると

UserWarning: KMeans is known to have a memory leak on Windows with MKL,
 when there are less chunks than available threads. You can avoid it by setting the 
 environment variable OMP_NUM_THREADS=2.

と警告が表示されます。

実行環境

下記の環境で発生を確認しています。

  • Anaconda3-2023.09-0-Windows-x86_64
  • JupyterLab 3.6.3
  • Python 3.11.5
  • pandas 2.0.3

警告の原因

KMeansクラスは使用可能なスレッドよりも分割データ数が少ない場合、MKLを使用するWindowsでメモリリークが発生することがある為です。

解決方法

OSの環境変数 OMP_NUM_THREADS に 2 を設定します。
コードに以下を記述することで解決できます。
注意点として、scikit-learnライブラリをインポートする前に記述する必要があるので、コード15-4の先頭(より手前)に追加します。

import os
os.environ["OMP_NUM_THREADS"] = "2"

Windowsの「システムのプロパティ」から環境変数を追加・設定する方法もありますが割愛します。

コメント

タイトルとURLをコピーしました