機械学習入門: サンプルプログラムの解読と改造
1. numpy.ndarrayの一部切り出し(1)
まず, ml-04-01-irisbasic.pyを走らそう:
In [1]: run ml-04-01-irisbasic.py
すると, Xというオブジェクトができ, それアヤメの特徴量を並べたnumpy.ndarrayクラスのインスタンスである。これを例にとって, 特徴量の操作について理解を深めよう。
Xのような大量のデータを含むオブジェクトから, 特定のデータのみを切り出すことが, 機械学習では頻繁に必要になる。その手法を確認しよう。
まず, 以下のように打ってみよう。何をやっているのかを考えながら打つこと。
In [2]: X In [3]: type(X) In [4]: help(X) In [5]: X.shape In [6]: X.shape[0] In [7]: X.shape[1] In [8]: X.dtype In [9]: X.size In [10]: X[0,:] In [11]: X[0,] In [12]: X[:,0] In [13]: X[,0]
課題1-1: 以下の問に答えよ。
- type()とは何か? 何をするものか?
- help()とは何か? 何をするものか?
- X.shapeの".shape"は, numpy.ndarrayのプロパティと呼ばれるものである。それが何かを, help(np.ndarray.shape)というコマンドで調べよ。
- 同様に, X.dtypeの".dtype"もnumpy.ndarrayのプロパティである。それが何かを調べよ。
- Xは何というクラスのインスタンスか?
課題1-2: Xに入っているデータは, いくつのアヤメ個体に関するものか?
課題1-3: Xに入っているデータに表されている, アヤメの特徴量はいくつか? (つまり特徴空間は何次元か?)
課題1-4: Xに入っている最初の個体を第1個体と呼ぼう。第2個体の特徴ベクトルを表示せよ。
課題1-5: 特徴ベクトルの最初の成分を第1特徴量と呼ぼう。すると, アヤメの第2個体の第4特徴量はX[2, 4]ではなく, X[1, 3]である。なぜか?
課題1-6: 第3個体の第2特徴量の値は何か?
続いて, 以下のように打ってみよう。何をやっているのかを考えながら打つこと。
In [14]: X[0:3, :] In [15]: X[0:3, 0] In [16]: X[0:3, 1] In [17]: X[0,:2] In [18]: X[0, 2:4] In [19]: X[0, [0,2]] In [20]: X[0, [0,3]] In [21]: X[0, ::2]
課題1-7: コマンド19, 20, 21は何をやったのか, 説明せよ。
課題1-8: 前回の課題2-3で, X = X[:,:2]という行を, X = X[:,2:4]に変更して保存し, 実行してみた。それは, どの特徴量を使った分類を行ったことになるか?
課題1-9: 前回の課題2-4で, 「Xの第1特徴量と第3特徴量だけを使って分類するにはどうすればよいか?」という課題に取り組んだ。君の答は合っていたか? 間違っていたとしたら, なぜどのように考えて間違えたのか?
課題1-10: 4つの特徴量のそれぞれは具体的にアヤメの何を計測したものか, 調べて述べよ(テキストに書いてある!)
2. numpy.ndarrayの一部切り出し(2)
ひきつづき, ml-04-01-irisbasic.pyを走らせた結果について考察を進める:
In [1]: run ml-04-01-irisbasic.py
Xを構成する各アヤメ個体には, それぞれの種類がラベルとして与えられている。その情報はyというオブジェクトに入っている。
続いて, 以下のように打ってみよう。何をやっているのかを考えながら打つこと。
In [2]: y In [3]: type(y) In [4]: help(y) In [5]: y.shape In [6]: y.shape[0] In [7]: y.dtype
課題2-1: これらのコマンドの結果を総合して, yというオブジェクトがどういうものか述べよ。
課題2-2: "課題1-1 In [5]:"で行ったX.shape[0]と, ここで行ったy.shape[0]が同じになっているのはなぜか?
yの各成分は, 0, 1, 2という3種類の整数で表されている。このそれぞれがアヤメの特定の種類に対応する「ラベル」であり, 背番号のようなものである。
課題2-3: 0, 1, 2のそれぞれに対応するアヤメの種名を述べよ。テキストに書いてある!!
アヤメの最初の分類プログラム"ml-04-02-2feat2class01.py"では, そのうち2種類のアヤメだけを対象にしている。そのために, Xの中から, 2種類のアヤメのデータだけを抜き出している。それが
X = X[y!=2]
という部分である。これについてこれから理解を深めていく。
そのためにまず, 準備として以下のように打ってみよう。何をやっているのかを考えながら打つこと。
In [8]: 2==3 In [9]: 2<3 In [10]: 2>3 In [11]: 2=3 In [12]: type(2==3) In [13]: help(2==3)
課題2-4: 2==3はどのようなオブジェクトか, 説明せよ。似たような2=3がコマンド11でエラーになったのはなぜだろうか?
続いて, 以下のように打ってみよう。何をやっているのかを考えながら打つこと。xは小文字だよ!!
In [14]: x=np.arange(10) In [15]: x In [16]: type(x) In [17]: x.dtype In [18]: x<5 In [19]: type(x<5) In [20]: (x<5).dtype In [21]: x[x<5] In [22]: type(x[x<5]) In [23]: x[x<5].dtype In [24]: x%2 In [25]: x%2==1 In [26]: x[x%2==1]
課題2-5: x, x<5, x[x<5]という3つのオブジェクトのそれぞれがどういうものかを説明せよ。
では, いよいよ
X = X[y!=2]
の理解にとりかかる。以下のように打ってみよう。何をやっているのかを考えながら打つこと。
In [27]: y!=0 In [28]: y!=2 In [29]: type(y!=2) In [30]: (y!=2).dtype In [31]: y<2 In [32]: 2>y In [33]: 2>=y In [34]: 0<y In [35]: y==2 In [36]: (y==0)+(y==2) In [37]: y!=1
課題2-6: 以下の3つのオブジェクトのそれぞれがどういうものかを説明せよ。
y==2 y!=2 (y==0)+(y==2)
続いて以下のように打ってみよう。何をやっているのかを考えながら打つこと。
In [38]: X[y==2] In [39]: X[y==2, :] In [40]: X[y!=2]
課題2-7: コマンド38-40が何をやっているのか説明せよ。
課題2-8: アヤメの種類が「"0"または"2"」であるようなXを表示せよ。
課題2-9: ml-04-02-2feat2class01.pyを改造し, アヤメの種類を「"0"」と「"2"」に限定して(つまり"1"を除いて)分類せよ。ヒント: 63行68行のあたりも変更する必要あるよ!!
3. コメントアウトとアンコメントによる機能のスイッチング
前回課題2-7では, テキストP121で, ml-04-04-2feat3class.pyの中の分類の条件を変更して走らせてみた。その際, 19行目に#を入れたのが「コメントアウト」による無効化である。
そして, そのかわりに, もともとコメントアウトされていた21行めを, #を削除することで有効化した。そのような操作を「アンコメント」という(「コメントイン」でも良さそうだが, 「コメント記号を外す」という意味でアンコメント)。
プログラミングではこのように, 内容にいくつかの選択肢を持たせて, 場合に応じて変更できるようにしておきたいということがよくあり, そのためにコメントアウトとアンコメントはよく使うテクニックである。
課題3-1 ml-04-04-2feat3class.pyの19行目と21行めをコメントアウトし, かわりに23行目をアンコメントして実行してみよ。P123の中ほどの記載を読み, 処理として何をしたのかを述べよ。
4. 演習
ipython3の上で, ml-04-05-4feat3class.pyを走らせ, 以下のコマンドを打ってみよ(考えながら!!)
In [1]: ml-04-05-4feat3class.py In [2]: result In [3]: y In [4]: result==y In [5]: result!=y In [6]: type(result==y) In [7]: sum(result) In [8]: sum(y) In [9]: sum(result==y) In [10]: sum(result!=y)
ここで"result==y"がひとつのオブジェクトである, ということを理解することが重要である。しかし課題2-5や課題2-6をクリアした諸君にはそれは難しいことではないだろう。
課題4-1: result==yというオブジェクトが何なのか(どういう構造で何を表すのか)、説明せよ。
課題4-2: ml-04-05-4feat3class.pyの27行目
success = sum(result==y)
が何をやっているのか, テキストのP128に説明されているが, それがいまいちよくわからない, という人がいる。その人のために, さらに詳しく丁寧に説明せよ。
課題4-3: ml-05-01-2feat3class-nn.pyを, 3回実行せよ。出てくるグラフは毎回同じか? 異なるか?
課題4-4: ml-05-01-2feat3class-nn.pyで, 21行めをコメントアウトし23行目をアンコメントして3回実行せよ。出てくるグラフは毎回同じか? 異なるか? 課題4-3と比較して, 違いとその理由を述べよ。
課題4-5: ml-06-03-plot3d.pyにおいて, 主成分分析を第4主成分まで行い, 結果を, 第2, 第3, 第4主成分の3Dプロットに表示せよ。
Keyword(s):
References:[機械学習入門] [機械学習入門: レポート課題3]