🙂

機械学習:if構文とforループ処理をベクトル化する

2024/01/10に公開

機械学習やデータ分析の分野で、PythonのPandasライブラリなどで処理をベクトル化することで、計算の高速化とコードの簡潔化が実現できます。
if構文とforループを使ったコードとの比較をします。

下記のデータフレームにC列を加えます。条件に応じて、C列の値を1にします。

import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [5, 6, 7, 8]})

従来のif構文とforループの例

以下は、DataFrameの各行に対して条件をチェックし、特定の条件を満たす行に対して特定の操作を行う、典型的なif構文とforループを使用したコードです:

df['C'] = 0
for i in range(len(df)):
    if df.iloc[i]['A'] > 2:
        df.at[i, 'C'] = 1

実行結果

ベクトル化された処理の例

同じ操作をベクトル化すると、以下のようになります:

df['C'] = 0
df.loc[df['A'] > 2, 'C'] = 1

実行結果

ベクトル化されたコードは、A 列の値が2より大きいすべての行を一度に選択し、C 列に1を設定しています。これにより、forループを使うよりもはるかに高速に処理が行われます。

ベクトル化が高速な理由

ベクトル化された操作は、データの一部分に対する個別のアクセスや更新の代わりに、データセット全体に対して一括で処理が行われます。そのため、高速での処理が可能です。

感想

これまでPHPメインでコードを書いていたのでベクトル化に慣れていませんでした。Courseraで機械学習の講座を受講した際、アンドリュー先生が「ベクトル化の利点」について強調していました。そのときは「ふーん」ぐらいにしか思っていませんでした^^;
ですが、実際にコードを書くと、ベクトル化のすごさを感じます。

Discussion