Pythonのライブラリ/パッケージについて

学習中に利用したPythonのライブラリ/パッケージについて記述します。

# 為になるリンク
[Python 機械学習ライブラリを23個一挙紹介！データ処理から深層学習まで完全網羅](https://www.codexa.net/machine-learning-python-library/)

# ライブラリ一覧
1. **[NumPy](#numpy)**  
数値計算を効率的に行うための基本的なパッケージ。ベースN次元配列パッケージ。
1. **[Scipy](#scipy)**  
高度な科学計算を行うための基本的なライブラリ。
1. **[Scikit-learn](#scikit-learn)**  
機械学習ライブラリ。
1. **[Pandas](#pandas)**  
データ解析を支援する機能を提供するライブラリ。CSV操作に便利。
1. **[matplotlib](#matplotlib)**  
PythonおよびNumPyのためのグラフ描画ライブラリ。包括的な2Dプロット。
1. **[seaborn](#seaborn)**  
matplotlibに基づくPythonデータ視覚化ライブラリ。見やすい。
1. **[PyTorch](#pytorch)**  
GPUとCPUを使用した深層学習用に最適化されたテンソルライブラリ
1. **[Tensorflow](#tensorflow)**  
機械学習に用いるためのソフトウェアライブラリ。
1. **[Keras](#keras)**  
機械学習プラットフォームTensorFlow上で実行されるディープラーニングAPI。
1. **[DEAP](#deap)**  
進化的計算フレームワーク
1. **(未)[IPython](#ipython)**  
強化されたインタラクティブコンソール
1. **(未)[SymPy](#sympy)**  
記号数学
1. **[Optuna](#optuna)**  
ハイパーパラメータ自動最適化フレームワーク
1. **[](#)**  

## NumPy
多次元配列オブジェクト(`ndarray`)、様々な派生オブジェクト（マスクされた配列や行列など）、
そして、数学的、論理的、形状操作、ソート、選択、I/O、離散フーリエ変換、基本的な線形代数、基本的な統計演算、ランダムシミュレーションなど、配列に対する高速な操作のためのルーチンの数々を提供するPythonライブラリ。


**リンク**
[(公式)：リファレンス](https://numpy.org/doc/stable/reference/)
[NumPy で行列計算](https://pythondatascience.plavox.info/numpy)

<details><summary>**関数メモ**</summary><div>

```python:
# 0または1で3*3のndarrayをランダムに作成
ndarr = np.random.randint(0, 2, (3, 3))

# numpy配列（ndarray）内の値を正否反転
np.logical_not(ndarr)
```
</div></details>



## Scipy
数値積分、補間、最適化、線形代数、統計など、多くのユーザーフレンドリーで効率的な数値ルーチンを提供する。

**リンク**
[(公式)：リファレンス](https://docs.scipy.org/doc/scipy/reference/)

<details><summary>**関数メモ**</summary><div>

```python:

```
</div></details>


## Scikit-learn
機械学習ライブラリ。サイキットラーンと読む。
以下の様な様々な分類、回帰、クラスタリングアルゴリズムを備えており、Pythonの数値計算ライブラリのNumPyとSciPyとやり取りするよう設計されている。サンプルデータセットも多数用意されている。

- サポートベクターマシン（SVM）
- ランダムフォレスト
- Gradient Boosting
- k-近傍法
- DBSCAN　など...

**リンク**
[(公式)：リファレンス](https://scikit-learn.org/stable/modules/classes)
[scikit-learn「アルゴリズム・チートシート」](https://qiita.com/sugulu_Ogawa_ISID/items/e3fc39f2e552f2355209
)
[Scikit-learn 備忘録](https://qiita.com/y-y/items/09731d19a81fb4ee0c1a) → 情報が膨大な為、別記事作成。

## Pandas
データ解析を支援する機能を提供するライブラリ。
特に、数値テーブルと時系列を操作するためのデータ構造と操作を提供する。
`DataFrame`などの独自のデータ構造が提供されており、様々な処理が可能。
表形式のデータをSQLまたはRのように操作することができ、かつ高速で処理出来る。

**リンク**
[(公式)：リファレンス](https://pandas.pydata.org/docs/reference)
[Pandas でデータフレームを扱う](https://pythondatascience.plavox.info/pandas)

<details><summary>**関数メモ**</summary><div>

```python:
# データの詳細を確認する方法（pandas_profiling ）
!pip install -U -q pandas_profiling
from pandas_profiling import ProfileReport
# レポートの作成 df:DataFrame
report = ProfileReport(df)
report
```
</div></details>

## matplotlib
PythonおよびNumPyのためのグラフ描画ライブラリ。
オブジェクト指向のAPIを提供しており、様々な種類のグラフを描画する能力を持つ。
描画できるのは主に2次元のプロットだが、3次元プロットの機能も追加されてきている。

**リンク**
[(公式)：APIの概要](https://matplotlib.org/stable/api/)
[matplotlib でグラフ作成](https://pythondatascience.plavox.info/matplotlib)

<details><summary>**関数メモ**</summary><div>

```python:

# 画像-----------------------------------------------------------
# 画像の表示
import matplotlib.pyplot as plt
# 灰色で表示
plt.imshow(img, cmap = "gray")
plt.show()

# 並べて画像表示
n_data = 4 # 表示するデータ数
row= 2 # 行数
col= 2 # 列数
fig, ax = plt.subplots(nrows=row, ncols=col)
for i, img in enumerate(list_img):
    _r= i//col
    _c= i%col
    ax[_r,_c].axes.xaxis.set_visible(False) # X軸を非表示に
    ax[_r,_c].axes.yaxis.set_visible(False) # Y軸を非表示に
    ax[_r,_c].imshow(img, cmap='gray') # 画像を表示
# -----------------------------------------------------------

```
</div></details>

## seaborn
データ可視化ライブラリ。
魅力的で有益な統計グラフィックを描画するための高レベルのインターフェイスを提供する。
洗練された図を描くことができ、matplotlibと比べて少ないコードで図が描ける。

**リンク**
[(公式)：リファレンス](https://seaborn.pydata.org/api.html)
[Seaborn でグラフ作成](https://pythondatascience.plavox.info/seaborn)

<details><summary>**関数メモ**</summary><div>

```python:

```
</div></details>

## PyTorch
コンピュータビジョンや自然言語処理で利用されているTorchを元に作られた、Pythonのオープンソースの機械学習ライブラリ。
PyTorchは次の2つの高度な機能を備えている。

- 強力なGPUサポートを備えた（NumPyのような）`Tensor`演算ができる
- テープベースの自動微分システムの上に構築された深層ニューラルネットワークが利用できる

**リンク**
[(公式)：PYTORCH DOCUMENTATION](https://pytorch.org/docs/stable/index.html)

<details><summary>**関数メモ**</summary><div>

```python:
# Pytorch tensor と numpy ndarray の変換
# numpy → tensor
x = torch.from_numpy(x.astype(np.float32)).clone()
# tensor to numpy
x = x.to('cpu').detach().numpy().copy()
# 前方次元追加し、tensor(float32)に変換
torch.tensor(x.values.reshape(1, -1), dtype=torch.float32)

# 訓練データセットの属性を確認
vars(train_dataset)
# 分類クラスの確認
train_dataset.classes

# モデルにcuda指定
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
net = net.to(device)
```
</div></details>

**PyTorchエコシステム**
PyTorchに対する新機能の追加や学習・推論の高速化などを支援するツールやライブラリを認定するもの。画像処理や自然言語処理などのパッケージライブラリが存在する。

**pytorch_lightning**
ディープラーニングフレームワーク

<details><summary>**関数メモ**</summary><div>

```python:
# アーキテクチャの確認
net = Net().cuda() # GPU
summary(net, input_size=(1, 100, 100))
```
</div></details>

**[torchvision](https://pytorch.org/vision/stable/index.html)**
一般的なデータセット、モデルアーキテクチャ、およびコンピュータビジョン用の一般的な画像変換で構成されている。

## Tensorflow
Googleが開発しオープンソースで公開している、機械学習に用いるためのソフトウェアライブラリ。
ニューラルネットワークなどの機械学習のアプリケーションに適用できる多くのシンボリックな数学ライブラリが用意されている。
TensorFlow の高レベル API は、ニューラル ネットワークを定義しトレーニングするための Keras API 仕様をベースとしている。

**リンク**
[(公式)：All symbols in TensorFlow 2](https://www.tensorflow.org/api_docs/python/tf/all_symbols)
[pytorch Tensor操作チートシート](https://qiita.com/dokkozo/items/e173acded17a142e6d02)

## Keras
Pythonで記述されたディープラーニングAPIであり、機械学習プラットフォームTensorFlow上で実行される。
ディープニューラルネットワークを用いた迅速な実験を可能にするよう設計され、最小限、モジュール式、拡張可能であることに重点を置いて開発された。
現在はTensorFlowに取り込まれ、tf.kerasの形で使われるのが一般的。

**リンク**
[(公式)：リファレンス](https://keras.io/api/)　※[日本語サイト](https://keras.io/ja/)もあるがサイドバーが見づらい。。

## DEAP
進化的計算フレームワーク。
アルゴリズムを明示的にし、データ構造を透過的にすることを目指している。

**リンク**
[(公式)：リファレンス](https://deap.readthedocs.io/en/master/api/index.html)

**遺伝的アルゴリズム**
データ（解の候補）を遺伝子で表現した「個体」を複数用意し、適応度の高い個体を優先的に選択して交叉・突然変異などの操作を繰り返しながら解を探索する。

## Optuna
ディープラーニングの各種のパラメータを自動で調整するライブラリ。

**リンク**
[(公式)：API Reference](https://optuna.readthedocs.io/en/stable/reference/index.html)

<details><summary>**関数メモ**</summary><div>

```python:
# SVCによるハイパーパラメータの探索
def objective(trial, x, t, cv):
  # 1.ハイパーパラメータごとに探索範囲を指定
  # C = trial.suggest_loguniform(name, low, high) # 連続パラメーターの値
  # C = trial.suggest_int(name, low, high[, step, log]) # integerパラメーターの値
  # gamma = trial.suggest_categorical(name, choices) # カテゴリパラメータの値
  C = trial.suggest_int('C', 2, 100) 
  gamma = trial.suggest_categorical('gamma', ['scale', 'auto'])

  # 2.学習に使用するアルゴリズムを指定
  estimator = SVC(C=C, gamma=gamma)

  # 3.学習の実行、検証結果の表示
  trial.params # 最適化するパラメータを返す。
  cross_val_score(estimator, x, t, cv=cv).mean() # 正解率
  return accuracy

cv = 5 # 交差検証の分割数
# study オブジェクトの作成
study = optuna.create_study(direction='maximize') # direction:最適化の方向
# 目的関数を最適化(10 回試行)
study.optimize(lambda trial: objective(trial, x_train, t_train, cv), n_trials=10)

# 最高の検証結果を返す。
study.best_trial
```
</div></details>


## 備考
**NumPyとScipyの違い**
NumpyはScipyと比べると機能がコンパクト。

**matplotlibとseabornの違い**
SeabornはMatplotlibの使い勝手を良くしたライブラリ。
[Pythonの可視化パッケージの使い分け](https://qiita.com/alchemist/items/544d45480ce9c1ca2c16)

**ディープラーニング（深層学習）フレームワークの違い**
[TensorflowとKeras、PyTorchの比較](https://www.tdi.co.jp/miso/tensorflow-keras-pytorch#37)