Lesson 14

Pythonのライブラリ

Lesson 14 Chapter 1
Pythonの基礎的なライブラリ

ここでは、機械学習に限らず一般に Python を使う際に利用される基礎的なライブラリを紹介します。

NumPy

NumPy(https://numpy.org/) は Python で科学計算を行うための基本的なライブラリの1つです。 多次元配列や行列の処理、数値計算、線形代数、フーリエ変換などの数学関数など、多数の数値演算を効率的に実行することができます。

NumPy を使うにはまず環境に NumPy をインストール(Anaconda を用いる場合はconda install numpy)します。 その後、Python のプログラム中に次のようなコードを書きます。

Python
import numpy as np

これで Python で NumPy が使えるようになります (import numpyとしてもよいですが、as npとしてあとからnp.のように使うことが多いです)。 このような手順は後で紹介する他のライブラリにも共通するので覚えておきましょう。

では NumPy の利用例を見てみます。 次のように Python のリストにnp.arrayを適用することで、NumPy の配列を作ることができます。

Python
import numpy as np

a = np.array([1, 2, 3])
print(a)  # [1 2 3]

NumPy では、NumPy の配列を受け取る関数や、NumPy の配列の持つメソッド・属性が非常に多く提供されており、それらを使うことで処理を高速化できます。 例えばnp.sqrtを使うと配列の各要素の平方根が簡単に求まります。

Python
import numpy as np

a = np.array([1, 2, 3])
print(a)  # [1 2 3]
sqrt_a = np.sqrt(a)
print(sqrt_a) # [1.         1.41421356 1.73205081]

また2次元の配列として行列を表現することで、行列の演算を高速に行うことができます。 以下は行列の要素ごとの足し算や掛け算、および行列積を計算する例です。

Python
import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[7, 8], [9, 10]])

c = a + b
print(c)

d = a * b 
print(d)

e = np.dot(a, b)
print(e)

行列など多次元の配列に関する演算を行う際には、その演算が行えるような形状になっていないとエラーが生じます。 なお NumPy の配列aに対しa.ndimとすることでその次元が、 a.shapeとすることでその形状がわかります。

NumPy の機能は非常に豊富なので、配列に関して何かをしたいと考えたときに、自分でその処理をコーディングする前にそれに合ったものが NumPy の機能に存在しないかどうかを調べてみると良いでしょう。 もし存在すればコーディングの手間が省けるだけでなく、NumPy の最適化された数値計算の恩恵を受けることができます。

NumPy の実装

NumPy の内部処理は、Python ではなく主にC言語によって実装されています。 したがって NumPy を利用することで、Python を使いながら比較的処理が速いC言語の恩恵を受けられるということになります。

Pandas

続いて Python でのデータの処理・分析・可視化を行うためのライブラリである Pandas(https://pandas.pydata.org/)を紹介します。 Pandas は NumPy を基盤として構築されており、NumPy で提供される高速で効率的な配列処理を拡張して、異なる種類のデータを処理するためのデータ構造やそのためのメソッドなどが提供されています。 Pandasには主に2つのデータ構造が用意されています。1つは Series と呼ばれる1次元の配列で、もう1つは DataFrame と呼ばれる2次元のテーブルです。

まず Series の利用例を見てみましょう。次のプログラムを見てください。

Python
import NumPy as pd

fruits = ["リンゴ", "バナナ", "ブドウ", "オレンジ", "マンゴー"]
fruits_series = pd.Series(fruits)
print(fruits_series)

'''
0     リンゴ
1     バナナ
2     ブドウ
3     ミカン
4    マンゴー
dtype: object
'''

まずデータを Python のリスト["リンゴ", "バナナ", "ブドウ", "オレンジ", "マンゴー"]として表現します。 そしてそのリストをpd.Seriesによって Series に変換しています。 Pandas では Series に対するさまざまな機能があります。 例えば、通常のリストと同様にfruits_series[i]のようにしてi番目の値にアクセスできるだけでなく、次のようにすることでインデックスを自由に変えられます。

Python
import NumPy as pd

fruits = ["リンゴ", "バナナ", "ブドウ", "オレンジ", "マンゴー"]
fruits_series = pd.Series(fruits)
fruits_series.index = ["Apple", "Banana", "Grape", "Orange", "Mango"]
print(fruits_series["Banana"]) # バナナ

続いて DataFrame の利用例を見てみます。

Python
import NumPy as pd

fruits = ["リンゴ", "バナナ", "ブドウ", "オレンジ", "マンゴー"]
prices = [120, 150, 80, 100, 200]
                      
fruits_dataframe = pd.DataFrame({"Fruit": fruits, "Price": prices})
print(fruits_dataframe)
'''
Fruit  Price
0   リンゴ    120
1   バナナ    150
2   ブドウ     80
3  オレンジ    100
4  マンゴー    200
'''

DataFrame 型の変数を生成するためには、まず複数の関連するデータを Python のリストとして用意し(fruitsprices)、 それらを辞書型によってまとめ({'Fruit': fruits, 'Price': prices})、pd.DataFrameによって DataFrame化します。 すると複数のデータが表としてまとめられることがわかります。

DataFrame の機能を見てみましょう。 まず、fruits_dataframe["Price"]とすると"Price"の列にアクセスできます。 また、fruits_dataframe[fruits_dataframe["Price"] >= 120]などとすることで、ある列の値が条件を満たすような行のみを抽出することができます。

Python
import NumPy as pd

fruits = ["リンゴ", "バナナ", "ブドウ", "オレンジ", "マンゴー"]
prices = [120, 150, 80, 100, 200]
                      
fruits_dataframe = pd.DataFrame({"Fruit": fruits, "Price": prices})
print(fruits_dataframe[fruits_dataframe["Price"] >= 120])
'''
Fruit  Price
0   リンゴ    120
1   バナナ    150
4  マンゴー    200
'''

この例では、"Price"の値が120以上であるような行を取り出しています。

Pandas では、この他にもデータの読み込み、クリーニング、変換、集計、グループ化、結合などを効率的かつ簡単に行うための機能が提供されています。 ぜひ色々な機能を使って有効活用してみましょう。

Matplotlib

Matplotlib(https://matplotlib.org/)は、Python で用いるデータ可視化ライブラリであり、グラフや図を描画するために使用されます。 多くの機能が用意されていて、線グラフ、散布図、ヒストグラムなど、多様な種類のグラフを描画することができます。 また、グラフのカスタマイズも可能で、例えば軸の設定、グリッド線の表示、線の色やスタイルの変更、タイトルやラベルの追加などができます。 Matplotlib は NumPy や Pandas などの Python のデータ解析ライブラリとの相性が良く、一緒に使われることもあります。

では Matplotlib を使って$y=\sin x$のグラフを描画してみましょう。以下はそのコードです。

Python
import matplotlib.pyplot as plt
import numpy as np
                      
x = np.linspace(0, 10, 100)
y = np.sin(x)
                      
plt.plot(x, y)
plt.xlabel("x")
plt.ylabel("y")
plt.title("y=sin(x)")
plt.show()

Matplotlib を使ってグラフを描画する際にはimport matplotlib.pyplot as pltとするのが通例です。 また今回は NumPy ライブラリも使用しています。

まずx = np.linspace(0, 10, 100)とすることで$x$のデータ点を生成します。 np.linspace(0, 10, 100)とすることで0から10までを100等分してできる100個の値をもつ NumPy の配列を作ることができます。 そしてy = np.sin(x)とすることで、先ほど作った配列の要素それぞれに$\sin$関数を適用してできる NumPy の配列を作ります。

こうして100個のデータ点$(x,y)$を生成できたので、これをグラフにします。 plt.plot(x, y)でまず点をプロットし、 plt.xlabel("x")plt.xlabel("y")plt.title("y=sin(x)")で$x$軸、$y$軸、グラフにそれぞれ名前をつけます。 そして最後にplt.show()でグラフを表示します。

Matplotlib を利用することで、 Python(と他のライブラリ)で作成したデータをグラフにして可視化することができます。 機械学習でも用いられる機会は多いですが、例えば学習ループの数と損失関数の値の関係をグラフに表すときに使います。

OpenCV

OpenCV(https://opencv.org/)は、画像処理およびコンピュータビジョンのライブラリです。 画像処理としては、画像の読み込み、書き込み、リサイズ、切り抜き、回転、色空間の変換、フィルタリングなどの機能があり。 コンピュータビジョンとしては、特徴検出、物体認識、動きの検出、3D再構成などの機能があります。 Python の他、C++、Java、MATLAB などのプログラミング言語で使用することができます。

ここでは、OpenCV を使って画像を読み込み、グレースケールに変更したものやエッジ検出をしたものを表示してみましょう。 まず読み込むための画像ファイルを用意して、プログラムファイルと同じところに置いてください。Jupyter Notebook を用いる場合、「Upload」のボタンからファイルをアップロードできます。 以下のコードでは、画像ファイルの名前が"img.png"であるとしているので、用意した画像ファイルの名前に適宜読み替えてください。

Python
import cv2
                      
img = cv2.imread("img.png") # ここのファイル名を変更
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150)
                      
cv2.imshow("Original", img)
cv2.imshow("Grayscale", gray)
cv2.imshow("Canny Edges", edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

まずimport cv2として OpenCV が使えるようにします。 次にimg = cv2.imread("img.png")で画像ファイルを読み込み、imgに格納します。 そしてgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)imgをグレースケールに変更し、 またedges = cv2.Canny(gray, 50, 150)によってCanny法によるエッジ検出を行います。 なお50100というのはエッジ検出をする際のパラメータです(簡単に言うと、どのくらい画像中の値が変化している点をエッジとみなすかを決めるためのものです)。 以上でそれぞれの画像を作成できたので、cv2.imshowによって表示します。 元画像、グレースケール、エッジ検出のそれぞれの画像が表示できたでしょうか。 なおcv2.waitKey(0)およびcv2.destroyAllWindows()によって、 キーボード入力をすると画像表示のためのウインドウが閉じられるようになっています。

OpenCV は、機械学習ライブラリと併用して顔認識、人物検出、文字認識などのタスクで使われることがあります。

Lesson 14 Chapter 2
機械学習ライブラリ

scikit-learn

機械学習ライブラリの代表的なものとして、scikit-learn があります(https://scikit-learn.org/stable/)。 scikit-learn を使えば、Python で教師あり学習、教師なし学習、データ前処理、モデル評価、モデル選択などを比較的簡単に行うことができます。 例えば、線形回帰、ロジスティック回帰、決定木、ランダムフォレスト、サポートベクターマシン、k近傍法、クラスタリングなどの機械学習アルゴリズムが実装されているほか、 特徴量の選択やスケーリング、欠損値の処理、カテゴリカル変数の変換といったデータの前処理を簡単に行うことができます。 さらに、他の Python のライブラリである NumPy や Matplotlib などと併用することも可能です。

また、機械学習のための道具が豊富で使いやすいだけでなく、機械学習を試してみるためのサンプルのデータセットが scikit-learn 自体に同梱されていることや、 タスクに応じてどんな機械学習アルゴリズムを使えばよいかがすぐにわかる「scikit-learn algorithm cheat-sheet(https://scikit-learn.org/stable/tutorial/machine_learning_map/)」が公式ウェブサイトで提供されていることなど、 機械学習を学ぶ人にとって非常に役立つサポートが充実しています。

Lesson 15 では、実際に scikit-learn を用いた機械学習によっていくつかのタスクに取り組んでみます。

Lesson 14 Chapter 3
深層学習ライブラリ

深層学習を行うためのライブラリ(あるいはフレームワーク)のうち、代表的なものをここでは紹介します。

TensorFlow

TensorFlow(https://www.tensorflow.org/)とは、Google(https://www.google.co.jp/)が開発した機械学習フレームワークです。 Python の他、 C++、Java、Go に対応しています。

特徴としては以下のようなものがあります。

  • 分散学習と呼ばれる複数のマシンで協働して学習する手法をサポートしており、大規模なデータセットや複雑なモデルのトレーニングに適している
  • TensorFlow の学習過程や計算グラフなどを可視化するためのツールである TensorBoard(https://www.tensorflow.org/tensorboard)が提供されている
  • 学習を高速化するためのプロセッサである GPU(Graphics Processing Unit)や TPU(Tensor Processing Unit)が使いやすい
  • 学習済みのモデルを再利用しやすい
  • モデルの構築などのために Keras(後述)のAPI を用いることができる

TensorFlow のチュートリアルが公式ウェブサイトから提供されている(https://www.tensorflow.org/tutorials)ので、 TensorFlow の使い方を学ぶ際にはこちらを参照するのがよいでしょう。Lesson 16 では TensorFlow を用いた深層学習を実践してみます。

TensorFlow 1系と2系

TensorFlow のバージョンには 1.x と 2.x があり、それぞれ1系、2系と呼ばれます。 現在 TensorFlow を使うなら最新の2系を使うのが普通ですが、インターネット上の記事などで見つかるコードにはまだ1系のものが多く見られます。 1系と2系の間の互換性は高くなく、1系のコードをそのまま2系で使うことは難しいです。 もし互換性の問題で詰まったら、1つ1つ調べるか、公式ウェブサイトが提供する「TensorFlow 1 のコードを TensorFlow 2 に移行するhttps://www.tensorflow.org/guide/migrate?hl=ja」を参照すると良いでしょう。

PyTorch

PyTorch(https://pytorch.org/)は、Meta(https://about.meta.com/)(旧称Facebook)が開発した機械学習フレームワークです。 その特徴を以下に述べます。

  • Python あるいは NumPy に似た書き方でモデルを構築したり学習させたりすることができるため、それらを学んだことのある人にとっては学習コストが低い
  • 低レベルなAPIを用いることができるので、柔軟性が高い(ただし初心者には慣れが必要)
  • デバッグが比較的簡単にできる
  • Amazon Web Services(https://aws.amazon.com/)や Google Cloud Platform(https://cloud.google.com/)などのクラウド環境での開発に対応している

PyTorch のチュートリアルも公式ウェブサイトから提供されている(https://pytorch.org/tutorials/index.html)ので、ぜひ利用してみましょう。

なおごく最近(2023年3月)になって PyTorch 2.0 がリリースされました。

Keras

Keras(https://keras.io/)は、ニューラルネットワークのためのライブラリです。 シンプルで可読性の高いコードによってニューラルネットワークモデルを構築することができるので、初心者にも扱いやすくなっています。 また学習済みのモデルも提供されており、それに対して転移学習やファインチューニングを行うことができます。

Keras はそのシンプルさなどから、機械学習ライブラリである TensorFlow に同梱されており、import tensorflow as tfとしたら後はtf.kerasとするだけで Keras の機能にアクセスできます。 また Keras によるモデルを JavaScript にエクスポートしてブラウザで実行できるようにしたり、TensorFlow Lite(https://www.tensorflow.org/lite/)にエクスポートすることでスマートフォンで実行できるようにすることが可能になっています。

TensorFlow と Keras

元々 TensorFlow と Keras は別々のもので、独立に使うことができるものでしたが、TensorFlow に Keras が標準で同梱されるようになって以降、これらの結びつきは強くなり、 現在は Keras は 単に TensorFlow の一部として扱われるようになっています。