![見出し画像](https://assets.st-note.com/production/uploads/images/95871910/rectangle_large_type_2_4f1dada4f83fcf776ba76b73d384f695.jpeg?width=1200)
8章 映画レビューデータセットの読み込み時に問題発生!?
シリーズ「Python機械学習プログラミング」の紹介
本シリーズは書籍「Python機械学習プログラミング PyTorch & scikit-learn編」(初版第1刷)に関する記事を取り扱います。
この書籍は、Pythonで機械学習を学びたい方向けのテキストです。Pythonのコードを動かしたり、アルゴリズムの説明を読み、ときに数式を確認して、包括的に機械学習を学ぶことができます。
この書籍にはPythonのコードがたくさん掲載されており、1つ1つのコードをタイピングして、ソースの内容を読み取って、Jupyter Notebookなどで動かして、機械学習のお気持ちを体感できる仕掛けになっています。
しかし、ときどき、動作環境の相違などの理由で、コードが動かない、エラーが発生する、自分の環境では使いにくい、などの問題に直面することがあります。
このシリーズでは、私なりに考えた解決策などを紹介いたします。
記事の内容
この記事は「第8章 機械学習の適用-感情分析」の冒頭で、IMDb映画レビューデータセットをPandasのデータフレームに読み込む際につまずいたこととその対処策を取り上げています。
具体的には、8.1.2「映画レビューデータセットをより便利なフォーマットに変換する」の1番目のコードを動かしたときに直面した問題に対応するために実施した、以下のコード変更の内容を紹介します。
Jupyter Notebookでプログレスバーを表示
Pandasのappendメソッドの変更
Jupyter Notebookでプログレスバーを表示
PyPrindでプログレスバーを表示
「プログレスバー」は画面に処理の進捗状況を表示する便利なツールです。
書籍のコードでは、プログレスバーを表示するのに、PyPrindパッケージを用いています。
しかし、書籍のコードをそのまま動かしたときには、Jupyter Notebookにプログレスバーを表示できませんでした。
この問題の対処策は、パラメータ「stream」の設定値を 1 または 2 にすることです。
設定値を変更して、プログレスバーを表示できるようになりました。
# 元のコード(抜粋)
import sys
pbar = pyprind.ProgBar(50000, stream=sys.stdout)
# 変更後のコード sysのimportは不要
pbar = pyprind.ProgBar(50000, stream=1)
PyPrindによるプログレスバーの表示イメージです。
上が stream=1、下が stream=2 です。
テキスト文字を用いて簡易な装いになっていました。
![](https://assets.st-note.com/img/1673589676390-49HoiejOSG.png)
![](https://assets.st-note.com/img/1673589604347-xB3DeGRNRt.png)
ちなみに、PyPrindのProgBarクラスのパラメータ説明では、1 か 2 を設定するように指定されています。デフォルト値は 2 です。
1:stdout
2:stderr
stream : `int` (default = 2).
Setting the output stream.
Takes `1` for stdout, `2` for stderr, or a custom stream object
(参考)PyPrindのインストール方法
# PyPrindのインストール
# condaでインストールする場合
!echo y|conda install -c conda-forge pyprind
# pipでインストールする場合(冒頭にecho y|の記述が必要かもしれません)
!pip install pyprind
tqdmでプログレスバーを表示
「Python プログレスバー」をネットで検索すると、tqdm を利用する方が多いようです。
そこで、tqdmを用いて、Jupyter Notebookにプログレスバーを表示してみます。
まず、tqdmをインストールします。
# tqdmのインストール
# condaでインストールする場合
!echo y|conda install tqdm
# pipでインストールする場合(冒頭にecho y|の記述が必要かもしれません)
!pip install tqdm
次にコードを変更します。
変更後のコードはNotebook用の tqdm.notebook を用いています。
# 元のコード(抜粋)
import pyprind
import sys
pbar = pyprind.ProgBar(50000, stream=sys.out)
# 変更後のコード pyprindとsysのimportは不要
from tqdm.notebook import tqdm
pbar = tqdm(total=50000)
tqdmを用いて、見た目の良いプログレスバーを表示することができました。
![](https://assets.st-note.com/img/1673591018329-9hBIsvz6cS.png?width=1200)
PyPrindとtqdmのプログレスバー表示サンプルコード
Jupyter Notebookで簡単に動かせるサンプルコードです。
for文などで処理時間の長い繰り返し処理を実施する際に、プログレスバーを表示することによって進捗状況の把握が容易になります。
PyPrind、tqdmをインストールしてから実行してください。
# PyPrindでプログレスバーを表示する
import time
from pyprind import prog_bar
for i in prog_bar(range(100), stream=1):
time.sleep(0.01)
# tqdm.notebookでプログレスバーを表示する
import time
from tqdm.notebook import tqdm
for i in tqdm(range(100)):
time.sleep(0.01)
処理完了時点の画面イメージです。
処理中は(当たり前ですが)バーが動きます。
サンプルコードを動かして、バーの動きを確認してみて下さい。
![](https://assets.st-note.com/img/1673615638395-mWGrDeAnpJ.png?width=1200)
Pandasのappendメソッドの変更
書籍のコードを実行すると次のワーニングが表示されました。
![](https://assets.st-note.com/img/1673591331974-0so1WLh3XP.png?width=1200)
メッセージには「appendメソッドは非推奨であり、concatメソッドを使うように」と書かれています。
pandasはバージョン1.4.0(2022/01/04)からappendメソッドを非推奨にしたそうです。
そこで、コードのappendの部分をconcatに変更してみました。
※もっと洗練された書き方があるかもしれません。。。
# 元のコード(抜粋)
df = df.append([[txt, labels[l]]], ignore_index=True)
# 変更後のコード
df = pd.concat([df, pd.DataFrame([[txt, labels[l]]])], ignore_index=True)
これでワーニングが出なくなりました。
まとめ
tqdmによるプログレスバー表示の変更と、Pandasデータフレームのapenndからconcatへの変更を行った後の全コードを掲示します。
### の部分が変更前のコードです。
楽しくPython機械学習プログラミングを学びましょう!
from tqdm.notebook import tqdm
### import pyprind
import pandas as pd
import os
### import sys
# 'basepath'の値を展開した映画レビューデータセットのディレクトリに置き換える
basepath = 'aclImdb'
labels = {'pos':1, 'neg':0}
pbar = tqdm(total=50000)
### pbar = pyprind.ProgBar(50000, stream=1)
### pbar = pyprind.ProgBar(50000, stream=sys.stdout)
df = pd.DataFrame()
for s in ('test', 'train'):
for l in ('pos', 'neg'):
path = os.path.join(basepath, s, l)
for file in sorted(os.listdir(path)):
with open(os.path.join(path, file), 'r', encoding='utf-8') as infile:
txt = infile.read()
df = pd.concat([df, pd.DataFrame([[txt, labels[l]]])], ignore_index=True)
### df = df.append([[txt, labels[l]]], ignore_index=True)
pbar.update()
df.columns = ['review', 'sentiment']
おわりに
AI・機械学習の学習でおすすめの書籍を紹介いたします。
「AI・データサイエンスのための 図解でわかる数学プログラミング」
ビジネスの現場では今後、数学的知識の必要度が高くなると言われています。
この書籍は、図解によって数学的な考え方を直感的に説明し、Pythonのコードを動かしてみて計算を体感することを目的に書かれています。
カバーする領域は、確率統計、機械学習、数理最適化、数値シミュレーション、深層学習です。
なんとか数学的な知識を獲得したくて、現在、ゆっくり読んでいます。
時間ができたら、Pythonコードを動かしてみようと思っています。
最後まで読んでくださり、ありがとうございました。