機械学習エンジニアのケイタ(@kei1992ta)です。
機械学習をする場合、プログラミング言語としてPythonを利用するのがスタンダードとなってきています。Pythonは、ウェブアプリケーションのサーバーサイドでも使われている言語ですが、高級言語であり計算速度はCやJavaと比較して遅めです。
でもここで疑問です。機械学習は大量のデータを行うのに、なぜ計算速度が遅いPythonがスタンダードになっているのでしょうか?それは、機械学習用のライブラリが非常に充実しているからです。
Pythonで書かれたコードは計算速度が遅くなりがちですが、機械学習用のnumpyやpandasといったライブラリはCythonやC++という言語で書かれており、計算速度が優れています。
つまり、Pythonで機械学習を行う上で、ライブラリをフル活用することは事実上マストになっています。面白いことに、なるべく高速に計算をするためには可能な限り自分でPythonのコードを書かない(=ライブラリをフル活用する)のが大切です。
そこで、この記事では機械学習をする際に必須のライブラリを4つ紹介したいと思います。
目次
数値計算の「NumPy」
NumPyはC言語によって実装されており、特に配列計算で真価を発揮します。機械学習では、配列の中に様々な値を入れて計算を行う機会が多々ありますが、それをすべてPythonで行うと時間がかかりすぎてしまうのです。
NumPyの組み込み関数は、配列に関するものが充実しており、配列の要素をすべて足し合わせるsum関数や、要素の平均を計算するmean関数、標準偏差を計算するstd関数などがあります。
import array #配列用の標準ライブラリを読み込む import time #時間計測用のライブラリ import numpy as np #NumPyを読み込む python_list = list(range(10000)) #pythonの配列 numpy_list = np.array(python_list) #NumPyの配列 %%timeit result = sum(python_list) #pythonの配列による計算 #150 µs ± 2.08 µs per loop %%timeit result = numpy_list.sum() #NumPyによる計算 #6.34 µs ± 98.2 ns per loop
例えば、配列に1から10000までの値を順に格納して、すべて足し合わせる計算を行ってみました。Python標準の配列を用いて関数で計算した場合、numpyで計算するよりも23.7倍も時間がかかってしまいます。
行列計算のpandas
pandasは、特に行列計算をするときに真価を発揮するライブラリです。pandasの中にあるDataFrameに行列を格納し、行・列の追加、削除を行ったり、欠損値の処理を行ったり、データクレンジングにも利用することができます。
import pandas as pd #pandasをインポート from pandas import DataFrame #pandasからDataFrameをインポート data = pd.read_csv("../Mall_Customers.csv")#CSVファイルを読み込む data.head() #最初の5行を表示する ''' CustomerID Gender Age Annual Income (k$) Spending Score (1-100) 0 1 Male 19 15 39 1 2 Male 21 15 81 2 3 Female 20 16 6 3 4 Female 23 16 77 4 5 Female 31 17 40 '''
データ可視化のmatplotlib
matplotlibはデータから様々なグラフを生成してくれるライブラリです。ヒストグラムを作ったり、とりあえずデータを散布図でプロットしてみたり、3Dのグラフを作成したりと便利な機能をたくさん持っています。
データ分析では、数値の意味や何がわかったのかを説明する機会が多くありますが、グラフなどで直感的に誰でも分かるように表現することは非常に大切です。
import pandas as pd #pandasをインポート from pandas import DataFrame #DataFrameをインポート import matplotlib.pyplot as plt #matplotlibをインポート %matplotlib inline #matplotlibで生成したグラフをJupyter Notebook内で表示させるようにする data = pd.read_csv("../Mall_Customers.csv") #CSVファイルを読み込む plt.hist(data["Spending Score (1-100)"], bins = 20) #20段階のヒストグラムを作る
これを実行すると、Jupyter Notebook(Python)の開発環境内に以下のようなグラフが出てきます。
機械学習ライブラリscikit-learn
DataFrameなどに格納したデータを元に機械学習を行うライブラリです。線形回帰・ロジスティック回帰・SVM・決定木・他クラス分類・ナイーブベイズ分類など一通り行うことができます。
交差検定(Cross-Validation)なども非常に簡単に行えることが出来るのが特徴で、手軽に予測精度を知ることができます。
import sklearn from sklearn.svm import SVC, metrics from sklearn.model_selection import train_test_split #交差検定用のモジュールをインポート #説明変数(X)と目的変数(Y)からトレーニングデータ・テストデータを作成 x_train, x_test, y_train, y_test = train_test_split(X, Y, random_state = 3) model = SVC() #オブジェクトを生成 model.fit(x_train, y_train) #トレーニングデータでモデルを作成(fit) pre_y = model.predict(x_test) #つくったモデルにテスト用データx_testを入れてyの値を予測させる #モデルに予測させたyの予測値pre_yと、実際のy_testが何%一致しているかを表示する #0.59...など一致率が表示される print(metrics.accuracy_score(pre_y, y_test))
上はscikit-learnを用いてSVGで機械学習をした際のサンプルコードです。データのクレンジング処理と、説明変数と目的変数に分割する作業は省略しています。
見ての通りですが、たったの5行でトレーニングデータ/テストデータの生成、予測モデルの構築、テストデータを用いた予測、精度の検証が行えます。
ディープラーニングのライブラリTensorFlow
機械学習の中でも、特にニューラルネットワークと呼ばれる人間の神経細胞を模した仕組みで計算を行うものをディープラーニングと言います。ディープラーニングで最も有名なライブラリのひとつがこのTensorFlowです。
TensorFlowは、データの流れを定義したグラフと呼ばれるものを作成して実行します。ここで言うデータはテンソル(Tensor)と呼ばれる量で、ベクトルや行列をより高次元に拡張したものです。テンソルの中でも、特に1次元のものをベクトル、2次元のものを行列と呼びます。
インプットとして与えたテンソル(Tensor)が、ニューラルネットワークを流れていく(=Flow)のでTensorFlowです。画像認識のためのCNN(畳み込みニューラルネットワーク)や、音声・テキスト認識のためのRNN/LSTM(再帰型ニューラルネットワーク/短長期記憶ニューラルネットワーク)などを利用することが出来ます。
GPU版もありますが、NVIDIAのGPUしかサポートしていないようです。
最後に
AIブームによって、注目されている機械学習/ディープラーニングですが、ライブラリの充実によって驚くほど簡単にできるようになりました。今回紹介したライブラリは王道中の王道のライブラリで、多くの情報がネット上に配信されているため、その点でも便利です。
ちなみに、scikit-learnやTensorFlowはかなり短いスパンで頻繁にモジュールの名前が変わったりしているので、さっとドキュメントを読める英語力があると、少し楽になりますね。
より良い機械学習ライフを!