nyの個人的Tipsまとめ

ITやデータサイエンスのことを中心にアウトプットのために更新していきます。

【書評】「ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装」

1. 本の概要

 今回は、こちらの本についてまとめます。

「ゼロから作るDeep LearningPythonで学ぶディープラーニングの理論と実装」

著者 :斎藤康毅
出版年:2016年

1章 Python入門

2章 パーセプトロン

3章 ニューラルネットワーク

4章 ニューラルネットワークの学習

5章 誤差逆伝播

6章 学習に関するテクニック

7章 畳み込みニューラルネットワーク

8章 ディープラーニング

2. 読もうと思ったきっかけ

 ズバリ、「AI実装検定A級」の試験対策です!

 この試験はまだ登場から時期があまり経っていないことから、情報量もあまりなく、公式テキストも5万ほどするので気軽に手が出しにくいです。

 そこで、合格者の経験をもとにこの本から勉強を始めてみることにしました。

 

  実際に受験対策として、有効だったかについては、別途まとめたいと思っています。

3. 得たこと、良かった点

パーセプトロンの解説が丁寧

 ニューラルネットワークの最も基礎となるパーセプトロンの説明がわかりやすかったです。

ANDやORの論理回路を例にパーセプトロンの説明がされており、ニューラルネットワークにおいて、なぜ層が増えると説明能力が上がる(非線形を表現できる)のかわかりやすく解説されていました。

 

誤差逆伝播

 計算グラフを用いて、解説されており、

    ・局所的な計算ができる

    ・途中の計算結果を保持できる

といった理由から、逆伝播の微分が簡単にできるとありました。

例では微分の難しい話ではなくリンゴを買うときの状況を使って話が進められていたのでわかりやすかったと思います。

 

4. 足りない点

Pythonの解説

 Pythonの知識をある程度持っている前提での内容だったと感じます。

1章で最低限のPythonについての解説はありましたが、本当に「最低限」という感じで、事前知識があった方が、ニューラルネットワークなどのロジックの解説に集中しやすいだろうと思います。

 

5. 最後に

以上、いくつか印象に残ったポイントを挙げましたがDeepLearningの最初の一歩であるニューラルネットワークの解説が非常に丁寧で分かりやすい本だったと思います。

 

 本当に初めて、DeepLearningやニューラルネットワークに触れる方にはいい本だと思いますが、Python微分などの数学は別の教材を使って学習をした方がスムーズに理解できるかなとも思いました。

 

AI実装検定A級についても、受験結果をまた改めてまとめていこうと思いますので、ぜひ楽しみにしていてください。

 

【Python】pandas使い方まとめⅡ~JupyterNotebookで表示する行数を増やす~

1. 目的

 自分自身備忘録としてまとめています。  なので、深く掘り下げてはいませんが、他の方の役にも立てば幸いです。

2. 悩み事

 超有名なirisデータセットを例に使います。

#データ読み込み
from sklearn.datasets import load_iris
iris = load_iris()
#データフレームとして整形
import pandas as pd
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['target'] = iris.target
df.loc[df['target'] == 0, 'target'] = "setosa"
df.loc[df['target'] == 1, 'target'] = "versicolor"
df.loc[df['target'] == 2, 'target'] = "virginica"

df

f:id:ny7777:20210911135303p:plain

 見ての通り、データを読み込みデータフレームとして表示しようとしたところ、150行中最初の5行と最後の5行しか表示されず、間は「・・・」となってしまっています。

3. 早速、コードを

3.1 表示行数を変える

#maxの表示可能行数がわかる
pd.get_option("display.max_rows")

#表示行数を指定する(今回は150行を指定)
pd.set_option('display.max_rows', 150)

df

f:id:ny7777:20210911135507p:plain  一つ目のコードは現在の表示可能行数を示します。先ほどはこれが150より小さかったため、間が端折られてしまいました。

お気づきの方もいるかもしれませんが、この"display.max_rows"が10以上でも、表示しようとしている全体の行数より小さかった場合、強制的に10行になります。 (今回"display.max_rows"= 60でしたが150以下だったので、10行しか表示されませんでした。)

 今回は150まで表示するように指定したので、右側のカーソルで一番下まですべて確認できるようになりました。

3.2 表示列数を変える

#列 ver.
pd.get_option("display.max_columns")
pd.set_option('display.max_columns', 150)

 特徴量が多くなると、今度はカラムが増え、データフレームが横に伸びていきます。

 これについても同様に上のコードを実行しておくことで、表示列数をコントロールすることができます。

4. まとめ

 今回は以上です。

 統計量などの代表値で概観を把握することも大事ですが、今回のように生のデータを目視できる状態を作りたいときもあると思います。

 その際にはぜひ、こちらを参考にしていただければと思います。

【Python】pandas使い方まとめ~mergeのhowを使いこなす~(横方向に結合する)

1. 目的

 今回は、Pythonの必須ライブラリであるpandasの挙動について整理しています。

pandasを扱うときに、「indexやKEYを使って、横方向に結合したい!」ということがしばしばあると思いますが、

この時、気を付けるべきこととして、オプション”how”の使い方をまとめます。

2. pd.mergeの基本

機械学習で特徴量の準備をするときなどにおいて、複数のデータフレームを結合するという作業はよくあると思います。

その時、KEYを一致させる必要があるので、僕はこちらのコードを書いたりします。

pd.merge( データフレーム1, データフレーム2, on="KEY")

しかし、意識せずにこのコードを使うと、二つのデータフレームのKEYが一致しない時に意図しなかった挙動をすることがあります。

そこで、"how"を使いこなすことで、自分の意図した通りにデータを結合でき、これらの問題はあらかた解決するはずです!!

3. howのオプションについて

3.1 事前準備

今回はこちらの二つのデータフレームを実際にいろんな方法で結合することでその違いを観察します。

import pandas as pd
import numpy as np
 
df1 = pd.DataFrame(
    data={'出席番号': np.array([1, 2, 3, 4, 5]), 
          '誕生月': np.array([11, 7, 2, 4, 6]),
          '性別': np.array(['男', '女', '女', '男', '女'])}
)

df2 = pd.DataFrame(
    data={'出席番号': np.array([1, 2, 6]), 
          '試験結果1': np.array([8, 7, 9]),
          '試験結果2': np.array([4 ,9 ,5])}
)

display(df1)
display(df2)

f:id:ny7777:20210829142125p:plain

上記のdf1, df2 の二つを"出席番号" をKEYとして結合します。

3.2 指定なし

pd.merge(df1, df2, on="出席番号")

f:id:ny7777:20210829143134p:plain

まずは、howによる指定なしで、結合を行ってみます。

これを見ると、両方のデータフレームに出席番号がある行だけが残っており、片方だけしか出席番号がない行は消えていることがわかります。

後述しますが、これは「how="inner"」と同じ挙動になります

3.3 how="left"

pd.merge(df1, df2, how='left', on='出席番号') 

f:id:ny7777:20210829143521p:plain

先ほどより、merge 後の行数が増えていることがわかります。

これは、df1 の出席番号と一致します。

つまり、「how="left"」は左側のデータフレーム (df1) のKEYを軸として、結合するのだといえます。

※この時の注意点として、本来データのないdf2の情報は"NaN"で穴埋めがされていることです。

この”NaN”の存在により、列の型が勝手に変わることもあります。今回においても、int型(整数)で入っていた”試験結果”の列は”NaN”が混じることにより、float型(小数)に変わっています。

こういった特徴も頭に入れておく必要があります。

3.4 how="right"

pd.merge(df1, df2, how='right', on='出席番号') 

f:id:ny7777:20210829144954p:plain 今度は先ほどと逆で、右側のデータフレーム(df2)のKEYを軸に結合が行われています。

3.5 how="inner"

pd.merge(df1, df2, how='inner', on='出席番号') 

f:id:ny7777:20210829144954p:plain how="inner"では、両方ともに含まれている”KEY”のみが残っています。

最初に表示した、"how"の指定なしの結合結果と同じになります。

この方法だと、結合による"NaN"の発生は防ぐことができますが、データの数が減ってしまうことに注意が必要です。

3.6 how="outer"

pd.merge(df1, df2, how='outer', on='出席番号') 

f:id:ny7777:20210829145458p:plain how="outer"にすれば、どちらか一方にでも存在するKEYは全て残っています。

つまり、一切のデータが失われることなく結合することができます。

ただし、NaNの割合が増え、扱いづらいデータになってしまう可能性もあります。

4. まとめ

今回は"how"の使い方にフォーカスを当てて、解説をしましたが、結合だけでもいろいろな方法と考えるべきことがあります。

これらを把握したうえで、pandasを使いこなし、Python上級者を目指しましょう!

今回は以上です。 今後、自分が困ったことや解決できたことなど、色々まとめていきたいと思っていますので、よろしくお願いします。