今回の記事では下記のような読者に向けて記事を書いています。
・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
続いて具体的にpythonのfor文でtqdmを使う方法を解説していきます。
pythonのfor文でtqdmを使う方法
pythonのfor文でtqdmを使うには、下記図のように、「イテラブルオブジェクト」を「tqdm(イテラブルオブジェクト)」と記載するだけでOK。
『for文の使い方』がわからない方は下記記事参照
ここからは、具体例を基に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を使って処理の進捗を表示してみます。データの前処理は下記ブログで解説しています。
前処理のコードも載せておきます。コピペして使ってください。
#データの読み込み、前処理 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ライブラリを使用してみてください。
この記事が皆さんのデータサイエンス(機械学習)の勉強の一助になることを願っています。