python機械学習プログラミング(2章31ページ)

31ページのプログラムを入力して「あれ?うごかない」となった方は30ページのプログラムに問題があるか、入力していなかったりするかも。。。

自分なりの理解

plot_decision_regions(X, y, classifier=ppn)
plt.xlabel('sepal length [cm]')
plt.ylabel('petal length [cm]')
plt.legend(loc='upper left')
plt.show()
  1. 1行目は30ページで入力したプログラムを読み出します。30ページで入力したプログラムをターミナルで読み込んでなかったりすると動きません。28ページのデータXの作成もしてなかったり24ページのプログラムも読み込んでなかったらもちろん動かないので。。
  2. あとはx軸にmatplotlibのxlabelを使ってsepal length [cm]として。
  3. y軸にmatplotlibのylabelを使ってpetal length [cm]として
  4. matplotlibのlegendを使って凡例を左上に配置
  5. あとはそれを表示

という感じです。

python機械学習プログラミング(2章30ページのプログラム)

さて、なんかグラフが出てきました。
とりあえず分類できたんだ。
でも、分類も何も初めから分かれてるのに分類???
何してるんだろ??
そこで、再びプログラムが出てきて、、、
今度は何するの?と思ってしまったり。。。とりあえず、勉強のためだとひたすら読み続けていました。
自分なりの理解

from matplotlib.colors import ListedColormap
def plot_decision_regions(X, y, classifier, resolution=0.02):
    markers = ('s', 'x', 'o', '^','v')
    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])
    x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() +1
    x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() +1
    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),np.arange(x2_min, x2_max, resolution))
    Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    Z = Z.reshape(xx1.shape)
    plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
    plt.xlim(xx1.min(), xx1.max())
    plt.ylim(xx2.min(), xx2.max())
    for idx, cl in enumerate(np.unique(y)):
        plt.scatter(x=X[y == cl, 0], y=X[y == cl,1],alpha=0.8, c=cmap(idx), marker=markers[idx], label=cl)

さて、読み始めて間もないころ、理解もできず目で字を追う事しかできなかったとき、各所にあるプログラムがすごく大変なことをしているという先入観から余計に目で追っていました。
30ページにあるプログラムが機械学習のためのプログラムなんだと思いながらひたすら入力して。。。

なので、このプログラムがなぜここにあって、これが意味するものは何なのか?といったことがわかるだけで、見通しが良くなると思います。なので、ここで自分なりの理解で伝えさせてもらおうと思います。

このプログラムは先ほど実行したPerceptronのプログラムが何を行ったかを理解するのに役立ちます。
29ページで実行したプログラムの結果は30ページの上の方のグラフとして表示されます。このグラフは1回目の学習で2個誤って分類、2回目も2個誤って分類、3回目は3個誤って分類、6回目には誤って分類することなく学習を完了したという事を表しています。
つまり、24ページで作成したPerceptronを使用して分類した結果、今回のケースでは6回学習すればきれいに分類できるという事になったことがわかりました。

これから作るプログラムも29ページのグラフと同様に、24ページで作成したPerceptronが何を基準に分類したかをグラフに表示して境界線を目で見てみて理解を深めようというプログラムになります。

このプログラムではグラフを色分けをして図示するので、少し長くなっているのですが、このプログラムを活用して、31ページのプログラムと連動することで、Perceptronが分類した境界線を表示します。

さて、自分なりにどう理解したかをお伝えしていきます。

  1. matplotlib.colorsにアクセスして、ListedColormapという関数をお借りしますね!!というpythonとのお約束です。
  2. 境界線を引くためのプログラムの名前をplot_decision_regionsという名前にします。
  3. プロットする点の形に何を使うか決めて、markersという変数に入れておきます。左から順に四角、バツ、丸、上三角、下三角です。
  4. 色もあらかじめ何色を使うか準備しておきます。colorsという変数に、赤、青、ライトグリーン、グレー、シアンという順番で入れておきます。
  5. 上でお借りしているListedColormapをここで使用します。先ほど作成した色のリストcolorsから色をとってきます。yの種類、つまり、1と-1の2種類をとることになります。それを変数cmapに入れておきます。
  6. 描く座標の上限と下限を決めます。ここではx軸について決めていきます。下限としてデータXの1列目の最小値を取り出します。最小値をそのまま使うと描く座標ギリギリになるので余裕をもって-1して、変数x1_minに入れておきます。上限としてデータXの1列目の最大値を取り出します。最大値をそのまま使うと描く座標ギリギリになってしまうので+1して、変数x1_maxに入れておきます。
  7. 同様にy軸について決めていきます。下限としてデータXの2列目の最小値を取り出します。最小値をそのまま使うと描く座標ギリギリになるので、余裕をもって-1して、変数x2_minに入れておきます。上限としてデータXの2列目の最大値を取り出します。最大値をそのまま使うと描く座標ギリギリになってしまうので、+1して変数x2_maxに入れておきます。
  8. ここはかなりややこしいので飛ばしてもらって、次の項目に行ってもらってもいいです。一応説明しておくと作ろうとしているグラフは分類の境界線を表示するプログラムです。31ページのグラフを見てもらうのが一番イメージがわきやすいと思います。どのように境界線を描いているかというと座標の上の適当な点を選びます。それが、1に分類されるか、-1に分類されるかを調べます。また、座標の上の適当な点を選んでどちらに分類されるかを調べます。これを何度も繰り返してグラフを色分けしているイメージです。ちなみに僕の理解が正しければこのプログラムでは70,000箇所の点を分類して色分けしています。
  9. 式の説明をするとx1_minとx1_maxの間をresolution=0.02毎に数値を取り出し、同様にx2_minとx2_maxの間をresolution=0.02毎に数値を取り出し、それぞれを組み合わせてmeshgridにかけます。それをそれぞれ、xx1とxx2に入れます。
  10. meshgridにかけたことで、xx1とxx2はいま70000か所以上の座標の位置を表す行列になっています。この70000か所以上もある点をひとつづつ色分けをしていくことで31ページのグラフを作るわけです。では、それを分類するために行数は何でもよい2列の行列の形にして24ページ~25ページで作ったperceptronの中のpredict関数を使って分類していきます。それを変数Zに入れていきます。
  11. さて、分類した70000か所以上もの点をもつZをxx1やxx2と同じ座標のような形式にするので、xx1と同じ行列の形にreshapeをかけます。
  12. xx1,xx2の座標に内容がZの行列が作成できたので、contourfを透過度0.4、cmapをcmapとしてグラフを塗り分けます。
  13. xx1の最小値、最大値をx軸の範囲として、xx2の最小値、最大値をy軸の範囲として設定。
  14. for文を使用して、enumerate関数を使ってyのユニークな値をclとして、idをidxとしてまわします。
  15. matplotlibのscatter関数を使用して散布図を描きます。x座標にはデータXのyの値がclの時の1列目、y座標にはデータXのyの値がclの時の2列目を、透過度0.8として色はcmap、markerにはうえで決めたマーカーを、ラベルにはclを使用してプロット。

以上で30ページのプログラムが完了です。こちらも31ページのプログラムと連動して動くので、このプログラム単独では動かないので「あれ?」とならないようにしてください。

最初は「あれ?」となって、なんだろなぁ。エラーか?とかで悩んでいました。

python機械学習プログラミング(2章24ページ~25ページ)

さて、初めてのpythonというプログラム、訳も分からずとりあえず触ってみて、入力してみてそもそも動かない。ターミナルが何なの?
プログラムを入力するけどその後どうするの?
実行はどうやって?
訳が全く分からない。
なんていう事が普通に起きています。
もう、パニックです。
でも、それをこのブログに書けるほど理解をしていません。
いつの間にかできるようになっていてなんとなく、プログラムを書いて、ターミナルの上で動かしたら動いた。っていう感じです。
アナコンダ?なんなんだ?
さて、そこまでは皆さんも試行錯誤お願いします。
ではプログラムの自分なりの理解をお話ししていきます。
自分なりの理解

import numpy as np
class Perceptron(object):
    def __init__(self, eta=0.01, n_iter=10):
        self.eta = eta
        self.n_iter = n_iter
    def fit(self, X, y):
        self.w_ = np.zeros(1 + X.shape[1])
        self.errors_ = []
        for _ in range(self.n_iter):
            errors = 0
            for xi, target in zip(X, y):
                update = self.eta * (target - self.predict(xi))
                self.w_[1:] += update * xi
                self.w_[0] += update
                errors += int(update != 0.0)
            self.errors_.append(errors)
        return self
    def net_input(self, X):
        return np.dot(X, self.w_[1:]) + self.w_[0]
    def predict(self, X):
        return np.where(self.net_input(X) >= 0.0, 1, -1)

ちなみに機械学習をするので、何度か繰り返し学習してもらわないといけません。なので、何回学習したらいいの?とか思っちゃいます。それを28ページで実際試すので、とりあえず28ページで今から作るプログラムが活躍するので、そのプログラムを作成します。

まず、このプログラムでは何をしているのか?という事ですが、22ページの数式をプログラムにしたらこうなったという感じです。もちろん数式だけでは役に立ちません。なので、最低限必要な部分を作っていきます。その最低限必要な部分をまずはざっくり書いていきます。
まず、

  • 今から作る機械学習(このプログラム)の名前を決める。
  • 学習率\etaをどのぐらいにするか?(学習率は22ページ)
  • 何回学習を繰り返すか?

を決めないといけません。
そして、次に

  • どのデータを学習させるかデータを取り込めるようにします。
  • そのデータを数式に当てはめて分類します。
  • 分類した結果、正解か不正解かを分けて不正解をカウントします。

という感じです。

さて、ざっくりこんな感じとお話ししたところで、細かくプログラムを見ていきます。プログラムを見ながら読んでもらうとこんな感じで理解してるんだとわかるかと思います。

  1. numpyというところにアクセスします。今度アクセスするときはnpと書いたらアクセスしたことにしてね!!というpythonとのお約束。
  2. 次に機械学習の本体の名前をPerceptronと決めました!!
  3. """と"""に囲まれた部分はプログラムとして認識しないので、メモとして残します。なので、24ページはこれで終了
  4. 数式の\etaetaで基本0.01としておきます。何回学習させるかはn_iterとして基本10回として決めます。
  5. このPerceptronというプログラムの一部にデータを学習させるのための別プログラムを用意します。その名前をfitとしておきます。ここでデータの取り込みが行われます。

    z=w_0x_0+w_1x_1+...+w_mx_m=\mathbf{w^Tx}というこの数式、wは重みでxは特徴なので、仮にx_1が花びらの長さだとすると、x_2はがく片の長さ、x_3は○○・・・・・という感じでxの数と特徴の数が一緒という事です。

  6. 特徴と同じ数だけ重みがあるので、特徴と同じ数の重みを0として準備します。\left (000…000\right)(この後self.w_[0]という形でプログラムを作るのでその時の準備です)
  7. 分類を間違えたときはself.errors_という名前で個数を数えるので、配列として保存できるようにしておきます。(分類を間違えた時は1として記録され、うまく分類できた時は0として記録されます。後で合計を出せば間違えた個数がカウントできるようにしておきます。)
  8. n_iterの回数だけfor文を使用して繰り返します。
  9. errorsという名前の変数を作って中身に0を入れておきます。
  10. 再びfor文を作ります。(こっちのfor文はデータのサンプルXを1つずつ分類していくので、100個のデータがあったら100回分類をしていくためのfor文。)
  11. ここで数式登場。

    \Delta w_j = \eta(y^{(i)} - \hat{y}^{(i)})x^{(i)}_j
    update = self.eta * (target - self.predict(xi))

    この2つの式を見比べて見ると似ています。

    数式 \Delta w_j → プログラム update に対応
    数式 \eta → プログラム self.eta に対応
    数式 y^{(i)} → プログラム target に対応
    数式 \hat{y}^{(i)}_j → プログラム self.predict(xi) に対応

    となると、数式の最後のx^{(i)}_jは???となりますが、プログラムのその次の行を見てみると、、、
  12. self.w_[1:] += update*xiとなっています。つまり、このプログラムに使用されているupdateは先ほど示したself.eta * (target - self.predict(xi))です。これにxiをかけているので

    \Delta w_j = \eta(y^{(i)} - \hat{y}^{(i)})x^{(i)}_j
    update = self.eta * (target - self.predict(xi))*xi

    となるという事です。ここで出てきたself.predict(xi)はまた後で関数として作成するので、いったん保留しておきます。
  13. 次に21ページの式(2.1.6)を見てもらうと、\Delta w_0 = \eta (y^{(i)} - output^{(i)})となって、さらに、式(2.1.4)を見てもらうと、w_j := w_j + \Delta w_jとなっていて、この両式からself.w_[0] += update (これはself.w_[0] = self.w_[0] + updateと同じとなっています。
  14. 上で準備した変数errorsに誤って分類した数を足していきます。(updateが0の時に上手く分類できたと判断できる。)
  15. 別プログラムfitを終了するにあたり、ここで作ったデータを返します。
  16. もう一つ別プログラムを作成しておきます。19ページのw^T xは行列の内積になるので、ここで準備しておきます。
  17. 作成した値を返すので、returnの後にxx内積の式を入れます。ここで作る数式は19ページの、w_0x_0+w_1x_1+w_2x_2+...+w_mx_mを作成します。wはself.w_、xはXに対応するので、np(numpy)のdot関数を使用して内積を計算します。
  18. ここで、先ほど上の方でいったん保留にしておきますと言っていた、predict(xi)の部分を作成します。ここでも計算した値を返すので、returnの後にプログラムを書いていきます。
  19. ここで作成するプログラムは19ページの式(2.1.3)です。
    \phi(z) =\left\{\begin{matrix}1(z \geq 0)\\-1(z<0)\end{matrix}\right.

これで24ページから25ページにまとめられたプログラムが完成しました。
ちなみに、このプログラムを実行したところで今は何も動きません。
この後の流れとしては分類したいデータを作って、そのデータを今作った機械学習プログラムに学習させて、そのデータをきれいに分類が出来るかを見る。というのがこの後の流れになります。

python機械学習プログラミング(2章29ページ)

読み始めた当初機械学習って何が出来るのかな?と思いながらひたすら読んでいました。。。読んでいたというよりも字を目で追っていた。というほうが正解ですね。

プログラムが書いてあっても何を意味するのか分からず。。。


自分なりの理解

ppn = Perceptron(eta=0.1, n_iter=10)
ppn.fit(X,y)
plt.plot(range(1, len(ppn.errors_) + 1), ppn.errors_, marker='o')
plt.xlabel('Epochs')
plt.ylabel('Number of misclassifications')
plt.show()

このプログラムでいよいよ機械学習の最初のデモです。24ページから25ページで書いたプログラムをここで実行します。

ここで理解を深めるために。。。機械学習は沢山あるデータを分類することを人間に変わってやってもらおうという事です。

これをうまくやれば画像から猫を見つけたり。

花の大きさから種類を分けてみたり。

動画から人間を見つけたり。

人間の形が分かれば自動運転で人をよけることが出来たり。

という事をやっていくという事だと僕は理解しました。

この第2章では花を種類ごとに分けるという作業をしていきます。

ざっくり24ページからの流れを書いてみます。

  1. 24ページから25ページのプログラムで機械学習の本体を作成しました。
  2. 28ページの上のプログラムでpandasというところから花のデータをとってきました。その花のデータを機械に分類してもらいます。
  3. 28ページの下のプログラムでは花のデータの内容がどんなものであるかを散布図にして表示して確認するプログラムを作りました。
  4. そしていよいよ24ページで作った機械学習パーセプトロン)のプログラムを実行します。

さて、もう一度プログラムに戻って何をしているかを見ていきます。

ppn = Perceptron(eta=0.1, n_iter=10)
ppn.fit(X,y)
plt.plot(range(1, len(ppn.errors_) + 1), ppn.errors_, marker='o')
plt.xlabel('Epochs')
plt.ylabel('Number of misclassifications')
plt.show()

このプログラムは24ページ~25ページで作成した機械学習パーセプトロン)を使用していきます。
何をしているかというと10回繰り返し学習させてどのぐらい賢くなったかをチェックしています。
チェックした後は1回目から10回目の間にどのぐらいうまく分類できているのかをグラフに表示するという事をしています。

では、プログラムを見ていきます。
24ページで作ったPerceptronを呼び出すところから始まります。

  1. Perceptronを呼び出して、次に呼び出すときはppnという書き方で呼び出しますよ!!というpythonとのお約束。ちなみにetaを0.1として、n_iterを10として。(etaは21ページの\etaで、n_iterの10は学習を10回繰り返すという事です。
  2. ppn(Perceptron)を呼び出して、その中に作った、fitという関数を読みだしています。まさに今学習をさせた瞬間です。ここまでで機械学習の実行は完了です。
  3. ここからは10回繰り返してどのぐらいうまく分類できたかをグラフに表示するプログラムです。
  4. plt(matplotlib.pyplot)を呼び出して、1から学習回数をx軸に、y軸に上手く分類できなかった個数をプロットします。点の形は〇でとります。
  5. x軸のラベルはEpochsとします。
  6. y軸のラベルはNumber of misclassificationsとします。
  7. 図を表示します。

という感じです。自分なりにこのように理解しました。

こんな分かり切った分類にこんなにやらないといけないのか?とか思ったりしますが、画像を見て猫だと判断することは人にとって比較的容易なことですが、それを機械にしてもらうにはどうしたらいいでしょう?

子供に「これは猫だよ」と教えてもすぐには覚えられないですよね。

ただ、見せるだけで子供は覚えてくれます。機械も最近出来るようになってきたみたいですが、この本の24ページから28ページに書かれていることを理解することでその一端に触れることが出来るという事なのでしょう。

と理解しました。

python機械学習プログラミング(2章28ページ下段のプログラム)

2章の下段のプログラムはいったい何を意味しているの?

プログラムも、数学もよくわからない僕は何もついていけずにただ、字を目で追うだけになっていました。

自分なりの理解

import matplotlib.pyplot as plt
import numpy as np
y=df.iloc[0:100, 4].values
y = np.where(y == 'Iris-setosa', -1, 1)
X = df.iloc[0:100, [0, 2]].values
plt.scatter(X[:50,0], X[:50,1], color='red', marker='o', label='setosa')
plt.scatter(X[50:100, 0], X[50:100,1], color='blue', marker='x', label='versicolor')
plt.xlabel('sepal length [cm]')
plt.ylabel('petal length [cm]')
plt.legend(loc='upper left')
plt.show()

このプログラムはグラフ(散布図)を書くプログラムです。

機械学習の事について話をする前の準備みたいなものです。

もう少し具体的に話をすると「28ページの上のプログラムでとってきたデータを実際どんなデータなのかを絵にしてみてみよう。」というのがこのプログラムです。

このプログラムの流れはこんな感じ。

  1. matplotlib.pyplotというところにアクセスします。今度アクセスするときpltと書くのでよろしく!
  2. numpyというところにもアクセスしますよ!!これはnpと書くのでよろしく!!
  3. dfの中にあるデータから4列目の100行目までを取り出します。それをyとします。(dfは28ページの上のプログラムで処理しています。)
  4. y(dfの4列目の100行目までのデータ)の中からIris-setosaを探し出して-1に置き換える。それ以外は1に置き換える。(npが出てきました。npはnumpyの事です。)
  5. dfから100行目までの1列目と3列目を取り出します。それをXとします。
  6. pltを使って散布図を書いていきます。Xの50行目までの1列目をグラフの縦軸に、Xの50行目までの2列目をグラフの横軸にしてプロットします。色は赤で、点の形は〇で、ラベルはsetosaとします。
  7. 同様にpltを使って散布図を書いていきます。Xの51から100行目の1列目をグラフの縦軸に、Xの51から100行目までの2列目を横軸にしてプロットします。色は青で、点の形は×で、ラベルはversicolorとします。
  8. pltを使ってx軸のラベルを書きます。名前はsepal length [cm]とします。
  9. pltを使ってy軸のラベルを書きます。名前はpetal length [cm]とします。
  10. pltを使って凡例を入れます。場所はupper left(上部左側)にします。
  11. 散布図を表示します。

という感じのプログラミングです。

作図のためのプログラムです。このデータの集まりを機械学習で分類していきます。

python機械学習プログラミング(2章28ページ)

2章を振り返って自分なりの理解をまとめていきたいと思います。

読み始めた当初は最初のプログラムから不安でした。

import pandas as pd
df = pd.read_csv('https://archive.ics.uci.edu/ml/''machine-learning-databases/iris/iris.data', header=None)
df.tail()

importって何?
df.tail?
みたいな状態でした。
自分なりの理解

import pandas as pd
df = pd.read_csv('https://archive.ics.uci.edu/ml/''machine-learning-databases/iris/iris.data', header=None)
df.tail()

まず、このプログラムで行っていることはデータをとってくるという事。

それを踏まえたうえでこのプログラムの流れは

1.pandasというところにアクセスする。「次にアクセスするときはpdという名前を使うよ」とpythonと約束する。
2.pdを呼び出してhttps://archive.ics.uci.edu/ml/''machine-learning-databases/iris/iris.dataにデータを取りに行ってもらう。それをdfに入れる。
3.dfにデータが入ってるからそのデータの下の方を表示する。
データを表示するのは確認のため

最初はそこに書いてあるプログラムが何を意味するのか分からないのでここではデータをとってくるプログラムなんだと理解すればよし!

python機械学習プログラミング(197ページ)

197ページの中段のプログラムが混乱しました。

import numpy as np
np.argmax(np.bincount([0, 0, 1], weights=[0.2, 0.2, 0.6]))

np.argmaxの意味が分からず混乱しました。
np.bincount([0, 0, 1], weights=[0.2, 0.2, 0.6])
の結果が[0.4, 0.6]となるところまでは理解したつもりでしたが。。
自分なりの理解

>>> import numpy as np
>>> np.argmax(np.bincount([0, 0, 1], weights=[0.2, 0.2, 0.6]))
1

実行すると1になります。
bincountがややこしいので今度はこうやってみました。

>>> np.argmax([0.4,0.6])
1
<||
これを見て、0.40.6だ!なんて勘違いしていました。
今度は0.40.6を入れ替えてみます。
>|python|
>>> np.argmax([0.6,0.4])
0

今度はもう少しかえてみます。

>>> np.argmax([0.4,0.6,0.7])
2

となりました。
つまり、一番大きいのは何番目かを答えてくれているみたいです。