Prateek Joshi:Python による AI プログラミング入門

作成日:2021-02-18
最終更新日:

概要

サポートページには、本書のコードが置かれている。
https://github.com/oreilly-japan/artificial-intelligence-with-python-ja/

感想

以下の実験は、Anaconda 環境のもと、base を中心に、いくつかは仮想環境で実施した。 base は以下のとおりである。
Python 3.8.5
numpy 1.19.2
gym 0.18.0
kanren 0.2.3
pyglet 1.5.0
scikit-learn 0.24.1 simpleai 0.8.2
sympy 1.7.1
tensorflow 2.2.0


1章 人工知能の概要

p.18 で、(conda install ではインストールできず) 「pip install でインストールする必要があるパッケージは次のとおりです。」

pandas_datareader kanren simpleai deap easyai hmmlearn pystruct neurolab gym

その後、私が試したところでは、少なくとも次のパッケージが conda install でもインストールできる。

  (base) $ conda install -c anaconda pandas-datareader
  (base) $ conda install -c conda-forge deap
  (base) $ conda install -c conda-forge hmmlearn 

2章 教師あり学習を用いた分類と回帰

2.14 節 サポートベクター回帰を用いた住宅費の推定を行ってみた。有効数字4桁目以降が若干違うが、 同じ値が得られた。

3章 アンサンブル学習を用いた予測分析

3.3 節までは検証できた。

4章 教師なし学習を用いたパターン検出

4.7 節で pandas_datareader パッケージを使うことになっている。 インストールはできて、Quandl の API を取得するところまでいったのだが、結局株価は取得できなかった。
https://scrapbox.io/PythonOsaka/pandas-datareader%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86
に例のある Yahoo Finance からアップル社の株価データのダウンロードは成功したので、 Quandl 社からデータの取得のどこかに問題があったのだろう。なお、上記の解説で、

  [Quandl https://www.quandl.com/]
  株式、投資信託、ETFの過去のデータを提供しています。
  データの品質は必ずしも良いとは言えません。

とあった。


5章 推薦エンジンを作る

5.1 節の例題は動作した。


6章 論理プログラミング

6.5 節の例題は動作した。


7章 ヒューリスティック探索

Base 環境で確認した。 7.5 節の最期、最小不一致のヒューリスティックの解は、 本書では次のようになっているが、: Minimum conflicts: {'Anna': 1, 'John': 3, 'Patricia': 4, 'Tom': 2}
私が実施した環境ではこうなった:
Minimum conflicts: {'John': 1, 'Anna': 3, 'Tom': 4, 'Patricia': 4}
私が得た結果でも与えられた制約はすべて充足している。これも問題ないと思う。


8章 遺伝的アルゴリズム

DEAP という Python パッケージを用いる。pip でインストールするように本書では解説されているが、 私は conda で base 環境に入れることにした。

$ conda install -c conda-forge deap

無事インストールできた。

8.3 節は本書の通り動作した。


9章 人工知能を使ったゲーム

9.7 節は easyai パッケージを使う。このパッケージを使ったコイン取りゲームはうまく動いた。 なお、日本では「石取りゲーム」といっていたような気がする。


10 章 自然言語処理

NLTK というパッケージは pip3 で入れるよう本文にはあるが、 わたしはすでに Anaconda を入れているため、conda でインストールした。

$ conda install -c anaconda nltk

無事に入ったようだ。そこで、NLTK を用いて 10.2 節のテキストデータのトークン化をやってみた。

$ print(sent_tokenize(input_text))
(中略)
LookupError: 
**********************************************************************
  Resource punkt not found.
  Please use the NLTK Downloader to obtain the resource:

  >>> import nltk
  >>> nltk.download('punkt')
  
  For more information see: https://www.nltk.org/data.html

  Attempted to load tokenizers/punkt/PY3/english.pickle
(後略)

nltk.download('punkt')をせよといっている。こんなこと、やっていなかった、と思って前のページを見てみると、 p.228 に 次の記載があった:

すると、NLTK Downloader が起動します(図10-1)。ダウンロードするデータをここで選べます。 [all] を選んで [Download] ボタンを押してください。完了するまで時間がかかります。

データは ~/ntlk_data ディレクトリに入っていることを確認した。そこで改めて sent_tokenize をやり直すと、 正しく本書 pp.230-231 のとおりトークン分割された。あせってはいけませんね。


11 章 連続データの確率的推論

pandas, hmmlearn, pystruct, cvxopt のパッケージを pip3 でインストールするように本書では解説されている。 Anaconda の場合は、pandas は最初からインストールされていること、 cvxopt は次の conda コマンドでインストールできることが書かれている。
$ conda install pandas cvxopt
私は Anaconda を使っているので conda で入れることにする。pandas は 1.2.1 が入っているが、 hmmlearn, pystruct, cvxopt は入っていない。まず、cvxopt を入れてみよう。 次のコマンドに pandas が要るとは思えないが、ともかく、書いた通りにしてみる。

(base) $ conda install pandas cvxopt
(中略)
The environment is inconsistent, please check the package plan carefully
The following packages are causing the inconsistency:

  - defaults/noarch::seaborn==0.11.1=pyhd3eb1b0_0
  - defaults/linux-64::_anaconda_depends==2020.07=py38_0
  - defaults/linux-64::scikit-image==0.17.2=py38hdf5156a_0
  - defaults/linux-64::anaconda-navigator==1.10.0=py38_0
  - defaults/noarch::imageio==2.9.0=py_0
  - defaults/linux-64::matplotlib-base==3.3.4=py38h62a2d02_0
  - defaults/noarch::dask==2021.2.0=pyhd3eb1b0_0
  - defaults/linux-64::matplotlib==3.3.4=py38h06a4308_0
  - defaults/linux-64::anaconda==custom=py38_1
  - defaults/linux-64::bokeh==2.2.3=py38_0
 done

  ## Package Plan ##

  environment location: /home/username/anaconda3

  added / updated specs:
    - cvxopt
    - pandas


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    cvxopt-1.2.0               |   py38ha87f1a5_0         483 KB
    glpk-4.65                  |       h3ceedfd_2         744 KB
    gsl-2.4                    |       h14c3975_4         1.8 MB
    metis-5.1.0                |       hf484d3e_4         3.7 MB
    pandas-1.2.2               |   py38ha9443f7_0         8.8 MB
    suitesparse-5.2.0          |       h9e4a6bb_0         1.3 MB
    ------------------------------------------------------------
                                           Total:        16.8 MB

The following NEW packages will be INSTALLED:

  cvxopt             pkgs/main/linux-64::cvxopt-1.2.0-py38ha87f1a5_0
  glpk               pkgs/main/linux-64::glpk-4.65-h3ceedfd_2
  gsl                pkgs/main/linux-64::gsl-2.4-h14c3975_4
  metis              pkgs/main/linux-64::metis-5.1.0-hf484d3e_4
  pillow             pkgs/main/linux-64::pillow-8.1.0-py38he98fc37_0
  suitesparse        pkgs/main/linux-64::suitesparse-5.2.0-h9e4a6bb_0

The following packages will be UPDATED:

  ca-certificates    anaconda::ca-certificates-2020.10.14-0 --> pkgs/main::ca-certificates-2021.1.19-h06a4308_0
  certifi                anaconda::certifi-2020.6.20-py38_0 --> pkgs/main::certifi-2020.12.5-py38h06a4308_0
  pandas                               1.2.1-py38ha9443f7_0 --> 1.2.2-py38ha9443f7_0


Proceed ([y]/n)? y
(後略)

次に hmmlearn だ。これは https://anaconda.org/omnia/hmmlearn に従い、次のコマンドで導入しようとした。

(base) $ conda install -c omnia hmmlearn
(後略)

しかし 10 分以上たっても終わらない。ひょっとして、Python 3.8 だからだろうか。 Python 3.7 ではどうだろうか。

  (py37) $ conda install -c omnia hmmlearn

これもうまくいかない。だとすると、Python のバージョンの問題ではなく、 チャネルの問題なのかもしれない。チャネルを変えてみた。

  (base) $ conda install -c conda-forge hmmlearn

これはうまくいった。

次は pystruct だ。anaconda には登録されていないようだ。
https://pystruct.github.io/installation.html
に従い、次の手順をとった。 cvxopt は anaconda で既に導入したから、次のコマンドを実行すればいいはずだ。

(base) $ pip install --user --upgrade pystruct
Collecting pystruct
  Downloading pystruct-0.3.2.tar.gz (5.6 MB)
     |████████████████████████████████| 5.6 MB 4.9 MB/s
Collecting ad3
  Downloading ad3-2.2.1.tar.gz (812 kB)
     |████████████████████████████████| 812 kB 8.7 MB/s
Requirement already satisfied: numpy in /home/satosi/anaconda3/lib/python3.8/site-packages (from pystruct) (1.19.2)
Building wheels for collected packages: pystruct, ad3
  Building wheel for pystruct (setup.py) ... error
  ERROR: Command errored out with exit status 1
(中略)
  ERROR: Failed building wheel for pystruct
  Running setup.py clean for pystruct
  Building wheel for ad3 (setup.py) ... /
(後略)

とにかく失敗した。おそらく、
https://github.com/oreilly-japan/artificial-intelligence-with-python-ja
に書いてあることを実行すればインストールできるのだろう。萎えた気持ちを奮い立たせて、 実行した。その結果、pystruct もインストールできた。

では、p.271 以降で説明されている、「11.7 CRF を用いたアルファベット列の識別」はできるのだろうか。 まず、p.272 の最初の5行を Jupyter Notebook に入れたところ、早速次のエラーが出た。

  ModuleNotFoundError                       Traceback (most recent call last)
  (中略)
  ~/anaconda3/lib/python3.8/site-packages/pystruct-0.3.2-py3.8-linux-x86_64.egg/pystruct/utils/inference.py in 
    1 import itertools
----> 2 from sklearn.externals.joblib import Parallel, delayed
    3 
    4 import numpy as np
    5 

ModuleNotFoundError: No module named 'sklearn.externals.joblib'

この sklearn.externals.joblib というのは現在は使われていない。次の通り、 sklearn.externals.joblib を joblib に置き換えればよい。

# from sklearn.externals.joblib import Parallel, delayed # 変更前
from joblib import Parallel, delayed # 変更後

上記の置き換えは、pystruct 配下の下記のファイルに対して行う。

これによって、11.7 節のコードは無事動いた。


12章 音声認識

p.289 の python_speech_features を、本書のサポートページにあるフォルダをローカルに保存してインポートしようとしたら、 循環参照が起きてインポートに失敗した。

>>> from python_speech_features import mfcc
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/mnt/c/Users/username/python_speech_features/__init__.py", line 1, in <module>
    from .base import *
  File "/mnt/c/Users/username/python_speech_features/base.py", line 5, in <module>
    from python_speech_features import sigproc
ImportError: cannot import name 'sigproc' from partially initialized module 'python_speech_features' →
(most likely due to a circular import) (/mnt/c/Users/username/python_speech_features/__init__.py)
>>>

どうせなら Anaconda でインストールしよう。しかし、
https://anaconda.org/contango/python_speech_features/files
を見ると、Python 3.6 までの対応のようだ。Python3.6 の仮想環境でインストールすることにしよう。

(py36) $ conda install -c contango python_speech_features

無事インストールできた。ではこの環境で Jupyter Notebook を起動してみよう。

(py36) $ jupyter notebook

コマンド 'jupyter' が見つかりません。次の方法でインストールできます:

sudo apt install jupyter-core

そうか。こちらには Jupyter Notebook がなかったのか。では入れるとするか。 いや、せっかく入れるのならば Jupyter Notebook の後継である JupyterLab がいいのかな。

(py36) $conda install -c conda-forge jupyterlab

成功した。こちらで JupyterLab も動き、12.6 節まで再現できた。12.7 節は hmmlearn が必要だ。 これはインストールに失敗したが、これは conda のチャンネルの問題だったようだ。 py36 の環境で、
(py36) $ conda install -c conda conda-forge hmmlearn
として解決した。 この環境で、12.7 節の内容も再現できた。


13章 物体検出と追跡

13.2 節まで検証した。ただし、カメラからのキャプチャはできなかった。


14章 人工ニューラルネットワーク

14.2 では、neurolab というライブラリを用いることになっている。 早速 Anaconda のインストールをもくろんだが、
https://anaconda.org/labfabulous/neurolab/files
を見てみると、名前が osx-64/neurolab-0.2.3-np17py27_0.tar.bz2 とある。 これは、合わないだろう。pip で入れることにする。base 環境に入るだろうか。

(base) $ pip3 install neurolab
(中略)
Successfully installed neurolab-0.3.5

14.2 節の内容を実施してみて、本書の通り動作することを確認した。


15章 強化学習

base 環境で実施した。

15.5 節の内容を追試した。p.360 のコード env.close() のあとで、次のような警告が出た。画面は問題なく出ている。 15.6 節以降は追って実施したい。

  /home/satosi/anaconda3/lib/python3.8/site-packages/gym/logger.py:30: UserWarning: WARN: →
  You are calling 'step()' even though this environment has already returned done = True. →
  You should always call 'reset()' once you receive 'done = True' -- →
  any further steps are undefined behavior.
  warnings.warn(colorize('%s: %s'%('WARN', msg % args), 'yellow'))

16章 畳み込みニューラルネットを用いたディープラーニング

base 環境で実施した。16.4 節まで実施した。

付録A 退屈なことは Python にやらせよう - 4色問題篇

本文 p.391 のコードは次の通りである:

_, contours, _ = cv2.findContours(gray_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

しかし、このコードを実行すると次のエラーが出る:

  ValueError                                Traceback (most recent call last)
  <ipython-input-3-4fbf1d056018> in <module>
  ----> 1 _, contours, _ = cv2.findContours(gray_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        2 
        3 for i, cnt in enumerate(contours):
        4     gray_image = cv2.drawContours(gray_image, [cnt], 0, i+1, cv2.FILLED)
        5 
  
  ValueError: not enough values to unpack (expected 3, got 2)

本書のサポートページによると、次のコードに直さなければならない。

contours, _ = cv2.findContours(gray_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2:]

他は変更なく、塗分けまで問題なく実施することができた。

誤植

https://github.com/oreilly-japan/artificial-intelligence-with-python-ja
にない誤植は下記の通り。

p.285 下から1段め、<generated_audo.wav というファイルが書き出されます。> とあるが、正しくは、<generated_audio.wav というファイルが書き出されます。>である。

書誌情報

書 名Python による AI プログラミング入門
著 者Prateek Joshi
発行日2018 年 8 月 8 日(初版第1刷)
発行所オライリー・ジャパン
発売元オーム社
定 価3400 円
サイズA5 判
ISBN978-4-87311-826-0
その他越谷市立図書館で借りて読む

まりんきょ学問所コンピュータの部屋コンピュータの本ニューロコンピューティング・人工知能 > Prateek Joshi:Python による AI プログラミング入門


MARUYAMA Satosi