🙂
機械学習:if構文とforループ処理をベクトル化する
機械学習やデータ分析の分野で、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