深層学習とその他

機械学習したいマン

jupyter notebookのextensionのgist-itについて

アドベントカレンダー7日目の内容です。

今回は、jupyter notebookのextesionにあるgist-itについて書いていきます。

Jupyter notebook extensionsについて

jupyter notebookの拡張機能です。
ソースコードを畳めたり、autopepが使えたりします。
インストールはこちらから。
github.com

gist-it

あっという間にgistにソースコードを上げられます。
githubよりも気軽に、ブログにソースコードを埋め込むときにも使いやすいです。
前回の記事でのソースコード埋め込みにも使用しています。

jupyter notebookのextesionsで有効化すると、ここにボタンが出ます。
f:id:looseleaf0727:20171208004001p:plain

gistへの上げ方

さっきのボタンをクリックすると、こんな感じの画面が出ます。
f:id:looseleaf0727:20171208004238p:plain

よくわからなければ、何も入力せずに右下のGist itを押しましょう。
するとこんな緑の表示が出るので、リンクをクリックしましょう。
f:id:looseleaf0727:20171208004415p:plain

リンクに飛ぶとこんな感じで公開されています。
f:id:looseleaf0727:20171208004552p:plain

ブログへの貼り方

ブログに貼りたい際には、先程の画像の右上のEmbedのところをコピーしてブログにそのまま貼ります。
こんな感じに表示されます。

楽にコードを共有できて、jupyterを使っててブログを書くときには便利なのでおすすめです。

matplotlibで円グラフを描画する

アドベントカレンダー6日目です。
adventar.org

matplotlibで円グラフを描画する

pythonで円グラフを描画したくて、matplotlibを使いました。
その際にいろいろいじって試したりしたのでそれについて書きます。
ソースコードは以下にあります。


描画の準備

使うライブラリのimport

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from collections import Counter

データの準備

1000までの乱数を生成し、それを10倍し、int型に変換することで0~10の整数を1000個作成します。

ary = np.random.rand(1000)
ary *= 10
ary = ary.astype(int)

数値の出現回数を数え、それを出現回数順に並び替えます。

count = Counter(ary)
ranked_data = count.most_common()

ラベルとデータを切り分けます。

labels = [x[0] for x in ranked_data]
values = [x[1] for x in ranked_data]

ここまでがデータの準備でした。

使用した機能

  • plt.axis('equal')

図が楕円になるのを真円に直す

  • plt.figure(figsize=(5,5), dpi=100)

図のサイズを指定、dpiを変える

  • plt.title('pie')

図のタイトルを指定

  • plt.savefig("pie.png",bbox_inches='tight')

図の保存、きれいにできるようにする

  • plt.subplots_adjust(left=0, right=1.2)

凡例を作るためのスペース作成

  • plt.pie(values, startangle=90, counterclock=False, autopct='%.1f%%', pctdistance=1.15)

円グラフのスタート位置を指定、データを大きい順に、割合表示、割合の表示位置指定

まとめ

円グラフも描画するだけなら一瞬ですが、きれいに描画するのは色々大変です

gitlabのissue templatesについて

アドベントカレンダー五日目です。
adventar.org

今日はgitlabのissue templatesについて書いていきます。

issue templatesについて

issue templateがあると、templateを選択してissueを書くことが出来ます。
今回はBugというテンプレートを追加しました。
f:id:looseleaf0727:20171205235859p:plain

選択するとテンプレートがDescriptionに表示されます。
f:id:looseleaf0727:20171206000001p:plain

issue templatesの追加方法

まず、トップディレクトリに .gitlab/issue_templates を作成します。
f:id:looseleaf0727:20171206000116p:plain

あとは、テンプレートの名前を決めてmdファイルを作成し、
中身をマークダウンで記述、コミットするだけでそれ以降テンプレートが選択できるようになります。
f:id:looseleaf0727:20171206000347p:plain

まとめ

とても簡易にissueのテンプレートを作成できて、
issueが見やすくなるのでお薦めです。

scikit-learnのconfusion matrixとclassification reportについて

アドベントカレンダー四日目です。
昨日に引き続き、scikit-learnの話をしていきましょう。

confusion matrix

必要なライブラリのimport

前回同様numpyと、
訓練データとテストデータを分ける train_test_split、
学習に使うデータの load_digits、
SVM
新たにconfusion matrixとclassification reportを読み込みます。

import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn.datasets import load_digits
from sklearn import svm
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report


データの取得と分割

同じ流れですが、学習に使うデータを読み込み、次にデータを分割します。
digits.dataでデータが、digits.targetでラベルがとれます。

digits = load_digits()
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target)


学習と評価

とりあえず学習します。

clf = svm.SVC(kernel='linear')
clf.fit(X_train, y_train)

そして、未知データを分類します。

predict_label = clf.predict(X_test)


confusion matrixの表示

confusion matrixを表示します。
これを見ることで、正しいラベルにどれくらい分類されたかが確認できます。
こちらのサイトが参考になるので見てみてください。
混同行列(Confusion Matrix)

print(confusion_matrix(predict_label, y_test))

[[40  0  0  0  0  0  1  0  0  0]
 [ 0 39  0  0  0  0  0  0  2  0]
 [ 0  0 47  0  0  0  0  0  0  0]
 [ 0  0  0 45  0  0  0  0  0  0]
 [ 0  0  0  0 44  0  0  2  0  0]
 [ 0  0  0  1  0 42  0  0  0  0]
 [ 0  0  0  0  0  0 43  0  0  0]
 [ 0  0  0  0  0  0  0 42  0  0]
 [ 0  3  0  1  0  0  0  0 53  2]
 [ 0  0  0  1  0  1  0  1  1 39]]


classification report

今度はclassification reportをみてみましょう。
予測結果の評価に使います。
F値 - 機械学習の「朱鷺の杜Wiki」

print(classification_report(predict_label, y_test))

             precision    recall  f1-score   support

          0       1.00      0.98      0.99        41
          1       0.93      0.95      0.94        41
          2       1.00      1.00      1.00        47
          3       0.94      1.00      0.97        45
          4       1.00      0.96      0.98        46
          5       0.98      0.98      0.98        43
          6       0.98      1.00      0.99        43
          7       0.93      1.00      0.97        42
          8       0.95      0.90      0.92        59
          9       0.95      0.91      0.93        43

avg / total       0.96      0.96      0.96       450


まとめ

いい感じの関数がscikit-learnだと一瞬で使えてすごいですね。
今度はこれを図で描画したいですね。

scikit-learnのSVMを使ってみた

アドベントカレンダー三日目です。
出かけてて投稿できなかったので同日投稿です。
最近scikit-learnのSVMを使ってみたので、それについて書いていきます

必要なライブラリのimport

今回は、
いつも通りnumpyと、
訓練データとテストデータを分ける train_test_split、
学習に使うデータの load_digits、
あとはSVMを使います。

import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn.datasets import load_digits
from sklearn import svm


データの取得と分割

学習に使うデータを読み込み、次にデータを分割します。
digits.dataでデータが、digits.targetでラベルがとれます。

digits = load_digits()
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target)


学習と評価

最初は何も考えずにデフォルトのまま学習を行います。
わかりやすくするために、明示的にrbfを指定しています。
clf.fit(x,y)で学習が行われます。

clf = svm.SVC(kernel='rbf')
clf.fit(X_train, y_train)

次に、clf.predict(X_test) のようにすることで、未知のデータに対して分類を行います。
今回は、精度の平均を出すために、labelと比較してmeanを使っています。

np.mean(clf.predict(X_test) == y_test)
>>> 0.51555555555555554


別のカーネルを使う

svm.SVCカーネルを違うものにして、同じように精度を見てみましょう。

clf = svm.SVC(kernel='linear')
clf.fit(X_train, y_train)

np.mean(clf.predict(X_test) == y_test)
>>> 0.96444444444444444

このように精度が大きく変化しました。

まとめ

SVCにも膨大な引数があるので、使う際にはドキュメントを一度見てみましょう。
sklearn.svm.SVC — scikit-learn 0.21.dev0 documentation

あと、scikit-learnはお手軽ですごい。

numpyのよく使う関数について

アドベントカレンダー二日目です!
みなさんnumpyつかってますか?使ってなければめちゃめちゃ使っていきましょう!


今日は自分がよく使うnumpyのメソッドについて書いていきます!
まずはimportからします。

import numpy as np
  • array

numpy配列を作成する。

>>> np.array([2,3])
array([2, 3])
  • arange

numpyの等差数列を作成する。
引数は開始位置、終了位置、差。

>>> import numpy as np
>>> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> np.arange(2,10)
array([2, 3, 4, 5, 6, 7, 8, 9])

>>> np.arange(2,10,2)
array([2, 4, 6, 8])
  • ndim

numpy配列の次元数を表示する。

>>> ary = np.arange(9)
>>> ary.ndim
1
>>> ary = ary.reshape(3,3)
>>> ary
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> ary.ndim
2
  • shape

numpy配列の大きさを返す。

>>> ary = np.array([[10,1],[2,3]])
>>> ary.shape
(2, 2)
  • reshape

numpy配列の形状を変換する。

>>> ary = np.arange(9)
>>> ary.shape
(9,)
>>> ary.reshape(3,3)
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> ary.reshape(3,3).shape
(3, 3)
  • concatenate

numpy配列の結合を行う。

>>> ary1 = np.arange(1,4)
>>> ary2 = np.arange(4,7)
>>> np.concatenate((ary1,ary2))
array([1, 2, 3, 4, 5, 6])
  • exp

入力された配列を指数関数を計算し返す。

>>> np.exp(1)
2.7182818284590451
>>> np.exp(np.arange(10))
array([  1.00000000e+00,   2.71828183e+00,   7.38905610e+00,
         2.00855369e+01,   5.45981500e+01,   1.48413159e+02,
         4.03428793e+02,   1.09663316e+03,   2.98095799e+03,
         8.10308393e+03])
  • log

logを計算して値を返す。

>>> np.log(2)
0.69314718055994529
>>> np.log(np.arange(3,7))
array([ 1.09861229,  1.38629436,  1.60943791,  1.79175947])
  • dot

numpy配列の内積を返す。ゼロディープでも使われてるやつ。

>>> x = np.arange(0,1,0.1)
>>> w = np.arange(0,0.5,0.05)
>>> np.dot(x,w)
1.4250000000000003
  • ceil

値を切り上げて返す。

>>> ary = np.arange(0,3,0.0001)
>>> ary
array([  0.00000000e+00,   1.00000000e-04,   2.00000000e-04, ...,
         2.99970000e+00,   2.99980000e+00,   2.99990000e+00])
>>> np.ceil(ary)
array([ 0.,  1.,  1., ...,  3.,  3.,  3.])
  • max

与えられた配列から最大の値を返す。

>>> ary = np.arange(9)
>>> ary.max()
8
  • min

与えられた配列から最小の値を返す。

>>> ary = np.arange(9)
>>> ary.min()
0
  • mean

与えられた配列の平均値を返す。

>>> ary = np.arange(9)
>>> ary.mean()
4.0
  • tolist

numpy配列をlistに変換する。

>>> ary = np.arange(9)
>>> type(ary)
<class 'numpy.ndarray'>
>>> type(ary.tolist())
<class 'list'>
  • savetxt

配列をファイルで保存する。

>>> ary = np.arange(9)
>>> np.savetxt('test.out',ary)
>>>
  • loadtxt

ファイルから配列を読み込む。

>>> ary = np.loadtxt('test.out')
>>> ary
array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.])
  • random.rand

指定されたshapeの乱数を生成する。

>>> np.random.rand(10)
array([ 0.44287235,  0.21692152,  0.84455927,  0.54022887,  0.52577192,
        0.9950084 ,  0.67096636,  0.98974568,  0.13367928,  0.06666172])
>>> np.random.rand(2,4)
array([[ 0.00915183,  0.46581703,  0.94042928,  0.68478671],
       [ 0.86354656,  0.18085582,  0.35303269,  0.75925584]])
  • argmax

配列の最大値のindexを返す。

>>> ary = np.random.rand(10)
>>> ary
array([ 0.55867085,  0.8495954 ,  0.11821661,  0.54879808,  0.66047148,
        0.94979863,  0.68124201,  0.3366241 ,  0.78051136,  0.46966003])
>>> np.argmax(ary)
5
  • argmin

配列の最小値のindexを返す。

>>> ary = np.random.rand(10)
>>> ary
array([ 0.24730975,  0.21440767,  0.45433659,  0.70008046,  0.1456813 ,
        0.71550809,  0.07497271,  0.20736947,  0.98423264,  0.66670651])
>>> np.argmin(ary)
6

これくらいです!
皆さんも積極的に使っていきましょう。

jupyter notebookについて

アドベントカレンダー初日です。
adventar.org

今まであまりアウトプットをしてきてなかったことと、
ブログを書くことで日本語力が向上するといいなあ、ということでアドベントカレンダーを書いてくことにします。

今回はjupyter notebookについてです。
jupyter.org

深層学習を行う際には、ほぼ必ずGPUが必要となり、
そのため、GPUが積まれているサーバーにsshしてプログラムを動かすことが主になります。
その際に、vimとかでpythonファイルを書いて、実行してみて・・・ってのを繰り返すのはなかなか面倒なわけです。
基本的に、自分はssh先ではjupyter notebookを使用しています。

jupyter notebookは実行した出力が残せたり、
f:id:looseleaf0727:20171201005103p:plain


ソースコードの説明をノートのようにmarkdownで残せたり、
f:id:looseleaf0727:20171201004724p:plain


画像や表を描画する際にも便利です。
f:id:looseleaf0727:20171201005217p:plain

実行して値や結果を確認しながらさくさく書いて試していけるところが個人的に好きなところです。
markdownでたくさんノートを残したり、実行結果を残すことで、他の人が読むときもわかりやすいところも良いです。


あとは、tabキーで補完が使えたり、
f:id:looseleaf0727:20171201010021p:plain


shift+tabでdocstringが見れて便利です。
f:id:looseleaf0727:20171201010232p:plain


ただし、jupyter notebookで学習を回すと、
学習が終了しても、グラボのメモリを確保したままになってしまうのでそこは要注意です。

さらさらっとjupyter notebookでソースコードを書き上げたあと、

jupyter nbconvert --to python ~.ipynb

みたいにすると、pyファイルが出力されるので、そっちを使って動かすのも良いですね。
皆さん使ってみてください。