【Python図解】tqdmを使って処理の進捗を確認する方法を解説!

今回の記事では下記のような読者に向けて記事を書いています。

・pythonで非常に長い処理を実行中で、処理の進行状況を可視化したい
・pythonのfor文で繰り返し処理を実施中だが、進行状況を可視化して、どれくらい時間がかかるのか見積もりたい

pythonのtqdmを活用すると、処理の進行状況を可視化できます。

特に、pythonで時間のかかる処理を行う際に、処理の進捗を視覚的に確認できるので非常に便利です。

pythonを活用したデータサイエンスでは、tqdmはfor文と一緒に使用されることが殆どなので、この記事では、『tqdmを用いてfor文の処理の進捗状況を表示する方法』に絞って解説します。
 

pythonのtqdmとは

 
pythonのtqdmは、進行状況バーを簡単に追加できるライブラリです。

機械学習では特に、for文を使った長時間かかるループ処理やデータ処理の進行状況をリアルタイムで視覚化するために使います。

進行状況バーを表示することで、例えば10分で処理が終了するのか、2日かかるのか、見積もることができます。
 

tqdmライブラリのインストール

 
tqdmライブラリはanacondaにデフォルトで入っていないのでインストールが必要。
下記コマンドでインストールしてください。

conda install conda-forge::tqdm
Tqdm | Anaconda.org

続いて具体的にpythonのfor文でtqdmを使う方法を解説していきます。
 

pythonのfor文でtqdmを使う方法

 
pythonのfor文でtqdmを使うには、下記図のように、「イテラブルオブジェクト」を「tqdm(イテラブルオブジェクト)」と記載するだけでOK。

『for文の使い方』がわからない方は下記記事参照

【python初学者向け】for文の繰り返し処理を完全図解
今回の記事では下記の悩みを解消します。 「pythonで繰り返し処理を実施する方法を知りたい」 「pythonのfor文の繰り返し処理がどのように行われてるか理解できない」 こんな悩みを解決していきます。 今回の記事では、pythonを活用...

 
ここからは、具体例を基にpythonのfor文でtqdmを使ってみます。

奇数が格納されたリストの中の要素を1個ずつ取り出してprintする際、pythonのtqdmを使って進捗バーを表示してみます。
イテラブルオブジェクト(今回はodd_numbers)をtqdm(odd_numbers)とするだけ進捗バーを表示できます。

from tqdm import tqdm

odd_numbers = [1,3,5]
for i in tqdm(odd_numbers):
    print(i)

最後に、より実践的に、for文を活用した交差検証でtqdmを用いて進捗を表示する方法を解説していきます。

for文を活用した交差検証でtqdmを使う方法

今回は「住宅価格予測問題」を基に、10分割交差検証でtqdmを使って処理の進捗を表示してみます。データの前処理は下記ブログで解説しています。

【機械学習初・中級者向け】LightGBMで回帰問題に挑戦
今回の記事は下記のような読者に向けて書いています。 「LightGBMで回帰問題に挑戦したい」 「LightGBMでハイパーパラメータを調整して予測精度を上げる方法を習得したい」 「Optunaの使い方を知りたい」 LightGBMは計算が...

前処理のコードも載せておきます。コピペして使ってください。

#データの読み込み、前処理
from sklearn.datasets import fetch_openml
import pandas as pd
housing = fetch_openml(name="house_prices", as_frame=True)
X = housing.data #説明変数
y = housing.target #目的変数
df = pd.concat([X, y], axis = 1)


df = df.drop(columns = ['Id'])
df.isnull().sum()[df.isnull().sum() > 0]

df_object = df.select_dtypes(include = ['object'])
df_object_NAN_columns = df_object.isnull().sum()[df_object.isnull().sum() > 0].index
for col in df_object_NAN_columns:
    df.loc[df[col].isnull(), col] = df.loc[df[col].isnull(), col].fillna(df[col].mode()[0])
    
    
df_numerical = df.select_dtypes(include = ['int', 'float64'])
df_numerical_NAN_columns = df_numerical.isnull().sum()[df_numerical.isnull().sum() > 0].index
for col in df_numerical_NAN_columns:
    df.loc[df[col].isnull(), col] = df.loc[df[col].isnull(), col].fillna(df[col].mean())
    
df = pd.get_dummies(df, drop_first = True)

import numpy as np
df['log_SalePrice'] = np.log10(df['SalePrice'])
df = df.drop(columns = ['SalePrice'])

 
前処理したデータに対してLightGBMを使ってモデル構築し10分割交差検証で精度の確認をします。
for文を活用した交差検証でtqdmを用いて進捗バーを表示する際は、イテラブルオブジェクト「kf.split(df)」を「tqdm(kf.split(df))」と記載すればOK。
 

from tqdm import tqdm
from sklearn.model_selection import KFold
kf = KFold(n_splits = 10, random_state = 42, shuffle = True)
import lightgbm as lgb
verification = pd.DataFrame()
verification['y_test'] = df['log_SalePrice']
for train_idx, test_idx in tqdm(kf.split(df)):
    X_train = df.iloc[train_idx, :-1]
    y_train = df.iloc[train_idx, -1]
    X_test = df.iloc[test_idx, :-1]
    y_test = df.iloc[test_idx, -1]
    model = lgb.LGBMRegressor()
    model.fit(X_train, y_train)
    verification.loc[test_idx, 'y_pred'] = model.predict(X_test)

import matplotlib.pyplot as plt
plt.figure(figsize=(5,5))
plt.scatter(verification['y_test'], verification['y_pred']) # 散布図を描画
plt.show()
from sklearn.metrics import r2_score
r2_score(verification['y_test'], verification['y_pred'])

 
下記は、途中経過で10分割交差検証が8回終了した時の画像。8itと記載されていることが確認できる。(処理の速度が早くてスクショ大変でした笑)

下記は、10分割交差検証終了後の画像。10itと記載されていることが確認できる。


 
今回の記事は以上です。
pythonのtqdmライブラリを使用することで、処理の進捗を視覚的に表示できます。
大量のデータを扱う際や、時間がかかる処理を行う際には、是非pythonのtqdmライブラリを使用してみてください。

この記事が皆さんのデータサイエンス(機械学習)の勉強の一助になることを願っています。

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