機械学習に必要なライブラリについて
今回は機械学習に必要ないしは使用頻度の高いライブラリを今一度確認も踏まえて一挙にご紹介していきたいと思います。ライブラリが記事にまとめられていることで皆様学習する際にこの記事を見返すだけでご自身のアルゴリズムの構築において適切なライブラリはなんのか、またどのライブラリの組み合わせて使用するべきなのかなど参考にお役立ち出来れば幸いです。
近年の機械学習関連の開発では、多くの場合Pythonが用いられます。 本記事は、「機械学習をこれから初めてみたいけど何から始めればいいか分からない」「基本のキから学びたい」という方に向けて執筆しました。プログラミング言語「Python」の中でも、特に機械学習における使用頻度の高いライブラリを厳選し、その解説を目的としています。
「この記事の内容に沿ってPythonを学習すれば、機械学習エンジニアとして入門に必要な知識を備えられる」というレベルを目標に、機械学習モデリングを本格的に行う一歩手前まで、スムーズに学べるようかいつまんで進めます。
これらのライブラリは、数多くある機械学習ライブラリの中の一部です。本記事では、機械学習業務を進めていく上で、最も使用頻度が高く、基本となるライブラリを「数値」「テキスト」「画像」の3つの視点から厳選しました。幅広い範囲におけるデファクトスタンダードを学ぶことに重きを置いています。
読者の皆さんが、本稿を読んだ次のステップとして、Deep Learningライブラリや音声認識、強化学習など、さまざまな分野を学び始める礎の一部となるよう、身に付けておいて損のない利用方法に絞ってお伝えしていきます。
本記事では、Pythonの環境が既に整っている(コンソールにてpython hoge.pyでスクリプトを動かせる)状態を前提としています。PythonのインストールはPython.jpの環境構築ガイドがそれぞれOSごとにサポートしてくれていますので、そちらを参考にインストールを行った上で、本記事を読み進めていただければ幸いです。
機械学習におけるデータの取扱
NumPy
NumPyとは、数値計算を行うためのライブラリの1つです。機械学習業務において最も利用する機会の多いライブラリで、現在NumPyを意識せずPythonで機械学習プログラミングを行うことは、非常に困難と言ってもよいでしょう。
Pythonのライブラリはpipと呼ばれるパッケージ管理ソフトによって、インストールを行います。 コンソールより以下のコマンドを実行し、NumPyをインストールします。
pip install numpy
次に以下のようなスクリプト(sample.py)を作成します。
import numpy as np
x = np.array([1, 2, 3])
print(x.shape)
print(x)
print(x[0], x[1], x[2])
x[1]=0
print(x)
NumPyをnpという名称でimportし、1次元の配列を作成、配列の情報や中身の変更を行う簡単なスクリプトです。
コンソールでpython sample.pyと入力し実行します。 結果は以下のようになります。
(3,)
[1 2 3]
1 2 3
[1 0 3]
配列のshapeを表示した後、中身の変更に成功していることが分かります。
NumPyの大きな機能の一つがこのnumpy.ndarrayです。 Pythonにおける配列といえば、組み込みのlistやset等のクラスによって実現することが可能ですが、ndarrayは行列計算に特化されたクラスです。 内部の実装にC、Fortranが使われていることに加え、線形演算はBLASやLAPACKによって実装されており、高速な行列演算を実現しています。
機械学習の多くのアルゴリズムは、行列演算によって、高速かつ効率的に実現されています。それゆえ、機械学習ライブラリをPythonで扱う場合、ndarrayを入出力として扱う場面が非常に多くなってきます。
最低限の知識としてndarrayを利用して、2次元以上の行列を取り扱う方法を学んでおきましょう。
以下のようなスクリプト(sample2.py)を作成します。
import numpy as np
x = [[1,2],
[3,4]]
y = [[5,6],
[7,8]]
x_array = np.array(x)
y_array = np.array(y)
print(x_array)
print(y_array)
print(np.dot(x, y))
こちらはPython組み込みのリストを2つ作成、ndarrayに変換し、内積(ドット積)するスクリプトです。
コンソールでpython sample2.pyと入力し実行します。結果は以下のようにx_array、y_arrayの中身に加え、それらを内積した結果が表示されます。
[[1 2]
[3 4]]
[[5 6]
[7 8]]
[[19 22]
[43 50]]
機械学習業務において、多くの処理はライブラリ内で行われるため、このように内積を意識してスクリプトを作成する機会は非常に少なくなっています。しかし、前述の通りライブラリ内では多くの行列演算が行われているため、ライブラリへの入力としてNumPyを利用するのが一般的です。このことからPython組み込みのリストからndarray変換する処理は知っておくべきでしょう。
Pandas
Python Data Analysis Library — pandas: Python Data Analysis Library
Pandasは、数表および時系列データなどの「テーブルデータ」を取り扱うためのライブラリです。 機械学習業務においては、多くの数値やテキスト情報を扱う場面が頻繁に登場します。そうした場面において、Pandasは機械学習業界のデファクトスタンダードになりつつあるライブラリです。 一般的な表計算から、統計量の算出、データ整形、csv等のさまざまなフォーマットでの入出力といった、テーブルデータを扱う上での重要な機能が多く備わっています。
NumPyと同様にコンソールより以下のコマンドを実行しインストールします。
pip install pandas
Pandasを利用してテーブルデータを閲覧するスクリプト(sample3_1.py)を以下に示します。
import pandas as pd
x = [(‘Gauss’, 1777),
(‘Pascal’, 1623),
(‘Turing’, 1912),
(‘Bernoulli’, 1700),
(‘Fourier’, 1768),
(‘Maxwell’, 1831)]
df = pd.DataFrame(data=x, columns=[‘Name’, ‘BirthYear’])
print(df)
コンソールでpython sample3_1.pyと入力し実行します。出力は以下のようになります。
Name BirthYear
0 Gauss 1777
1 Pascal 1623
2 Turing 1912
3 Bernoulli 1700
4 Fourier 1768
5 Maxwell 1831
Pythonのリスト時点と違う点として、index idが振られていること、指定したcolumn名が振られていることが確認できると思います。この状態は、DataFrameと呼ばれるクラスに該当します。
このDataFrameを使ってさまざまな値を算出するスクリプトを前述のsample3_1.pyに追記してみます(sample3_2.py)。
print(df[‘BirthYear’].sum())
print(df[‘BirthYear’].mean())
print(df.query(“BirthYear < 1800”))
上2行では、DataFrame内のBirthYear columnの合計値、平均値をprintしています。3行目では「BirthYearが1800より小さい行」という条件をqueryとして適応し、DataFrame全体から一部のDataFrameを抽出しています。
コンソールでpython sample3_2.pyと入力し実行します。こちらの結果は以下のようになります。
10611
1768.5
Name BirthYear
0 Gauss 1777
1 Pascal 1623
3 Bernoulli 1700
4 Fourier 1768
合計や平均以外にも、分散や標準偏差など機械学習において必須となる統計量を簡単に算出することが可能です。また、機械学習では度々行われる特定の条件のデータを間引く処理(サンプリング)等においても、SQLを書くように素早く記述できます。
他にもソート、欠損値の補完、グラフの描画等、テーブルデータを取り扱う上で必須のメソッドを多く備えています。
PandasはNumPyに比べると、他ライブラリの入出力で多く利用されている機会こそ少ないものの、入出力の前後における前処理、後処理の場面で利用されています。 機械学習業務等においても、Pandasで書かれた前処理のスクリプトを渡される機会は多々あります。1つでも多くの機能の使い方を、実際に触って知っておくことをお勧めします。
Matplotlib
Matplotlib: Python plotting — Matplotlib 3.0.2 documentation
Matplotlibは、グラフ描画のためのライブラリです。機械学習においては、統計量の可視化や学習経過のグラフ化、画像の出力等の機能が多く利用されています。
NumPyやPandasと同様に、コンソールより以下のコマンドを実行しインストールします。
pip install matplotlib
少し複雑になりますが、NumPyを利用してsin関数を生成し、グラフに描画、保存するスクリプト(sample4.py)を以下に示します。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 10, 0.1)
y = np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y)
plt.savefig(‘./output.jpg’)
arangeは、一定の間隔で数値を刻むndarrayを生成します。 上記のスクリプトの場合は、0から10まで0.1刻みのndarrayを変数xに代入しています。さらに、変数xを入力とし、sin関数のy軸の値を生成し変数yに代入しています。
subplotは画像を制御するクラスと画像内のグラフを制御するクラスを返します。 画像1枚に対して複数のグラフを記載する場合があるため、それぞれ管理が分かれているという認識で大丈夫です。グラフaxに対して先程生成したndarrayをプロットし、jpg画像として保存しています。
コンソールでpython sample4.pyと入力し実行します。すると、実行した場所と同じ階層に、以下のようなoutput.jpgが生成されます。
上記では、プロットの例を示しましたが、ヒストグラムや散布図を描いたり、JavaScriptを利用してインタラクティブなグラフを生成することも可能です。機械学習においても、NumPyやPandasと組み合わせて、分析対象のデータにどんな傾向があるのか可視化したり、スコアの変化を描画する等、さまざまな場面で利用されるため、覚えておいて損はないでしょう。
必要なライブラリ及びパッケージについて少しはご理解いただけたでしょうか。
初めのうちは感覚的にどの選定をすればいいのか本記事を一度読んでもわからないことも多いと思うのでアルゴリズムを構築する際に何度も見返して確認してみてください。現役エンジニアでも全て頭に入れているわけではなく、彼らもほとんど辞書のように参考マニュアルや文献を見返したり必要なときに本棚から資料を取り出すようにうまくネットリソースを利用しているので特に覚える必要はありません。ですから、その都度確認する習慣を常に作ることが大切になってくるのです。