RNN、LSTMで時系列データを生成

文脈を持つ時系列データをRNN、LSTMに学習させて、新たなデータを生成することを目的とします。

 

以下の本を参考にしました。

shop.ohmsha.co.jp

 

今回は3種類のデータを用意します。

1つめは、テキストデータです。英文です。

2つめは、アルファベット順に並んだアルファベット列です。スタートの単語、単語数は自由とします。

3つめは、数字が前の2数の足し算になっている数列です。スタートの2数はランダムに決めます。また、数字は1桁のみとします。3、9ときたら次は12ではなく2です。

 

この3種類のデータを学習させて、生成させることが目的です。

 

1:データを用意する

2:環境を整えて、学習準備

3:学習する

4:生成する

5:結果確認

 

この5ステップで説明します。

 

作成したプログラムは全てgithubに上げてあります。

github.com

 

         1:データを用意する

 

作成したプログラムは data_pre.py、data_pre2.pyです。

まず、テキストデータについてです。GPUがないため、大容量のデータは学習できないので、自分で適当に打ったやつを使います。とりあえずRNNを試せればいいので10行程度のかなり軽いものです。今度、暇があったら、しっかりとしたデータで取り組みたいと思います。これをtrain.txtとして保存しました。

次に、アルファベット列データです。自分で作ります。data_pre.pyです。このデータをtrain_alpha_raw.pklに保存します。

最後に、数列データです。これも自分で作ります。data_pre2.pyです。このデータをtrain_number_raw.pklに保存します。

 

         2:環境を整えて、学習準備

 作成したプログラムはconvert.pyです。

学習できるようにそれぞれのデータを数値データにする必要があります。それぞれの単語などに対応するidを用意して、idでデータを置き換えます。そのデータを保存します。convert.pyでこれをやっています。

 

アルファベット列のidデータセットは、train_alpha_con.pkl、id辞書はtrain_alpha_voc.pklです。

数列は、train_number_con.pkl、train_number_voc.pklです。

テキストデータは、train_txt_con.pkl、train_txt_voc.pklです。

 

 

         3:学習する

作成したプログラムはrnn.py、train.pyです。

まずRNNのネットワークをクラスで定義します。rnn.pyです。これを使って2で用意したファイルからデータを読み込んで学習します。最後に学習したパラメータをファイルに保存します。これはtrain.pyです。テキストデータは、train_txt_embed.pkl、train_txt_H.pkl、train_txt_W.pklに保存します。アルファベット列と数列では、txtの部分がそれぞれalpha、numberに代わります。LSTMは、L.LinearをL.LSTMに変えるだけで使えます。今回は、RNNを学習します。

  

          4:生成する

学習は完了しました。結果をもとにデータを生成します。3同様、RNNのネットワークを使うのでrnnをimportしています。LSTMではなくRNNを使っています。

 predict.py です。

 

         5:結果確認

テキストデータ、アルファベット列、数列、各条件で5回ずつ生成します。LSTMではなく、RNNの結果です。

 

1:テキストデータ

テキストデータはそもそも単語数が20種類くらいしかないので、結果は知れていますが、やってみます。

 

10epoch:

many am many am many am many am many am many am many am many am many am many am
night hello you am family do do do person person person from from from from person person am everyone from
likes have do my you am family do do do person person person from from from from person person am
am Tokyo hello you my you am family Tokyo do am you from likes am everyone my are am many
night have am everyone from from from from person person am everyone from from from from person person am everyone

 

100epoch:

name is <eos>
your name <eos>
have <eos>
is your name <eos>
is your name <eos>

 

1000epoch:

are you from <eos>
are you from <eos>
name is person <eos>
<eos>
beautiful day <eos>

 

2:アルファベット列

データ数も変化させて比べてみようと思います。100epoch、100dataで学習に1分かかりました。きついです。アルファベット順になればokです。

 

10epoch:データ数100

<eos>
<eos>
<eos>
h i j <eos>
<eos>

 

100epoch:データ数100:

k l m n o p q r <eos>
c d e f g h i j <eos>
i j k l m n <eos>
<eos>
i j k l m n <eos>

 

10epoch:データ数1000:

<eos>
m n o p <eos>
h i j k l m n o <eos>
f g h i j k l <eos>
k l m n o p q <eos>

 

3:数列

前の2数足した値になればokです。2桁になる場合は1桁目だけです。あんまりうまくいってないです。epoch数とデータ数を増やせば、いい感じになると思います。

 

10epoch:データ数100:

8 8 <eos>
2 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 2 8 <eos>
<eos>
<eos>

 

100epoch:データ数100:

4 2 6 8 4 2 6 8 4 2 6 8 4 2 6 8 4 2 6 8
<eos>
4 7 6 <eos>
<eos>
<eos>

 

10epoch:データ数1000:

8 7 9 4 9 5 4 9 7 8 7 7 4 3 7 8 3 1 8 9
6 5 4 4 7 0 6 3 1 9 1 2 <eos>
2 <eos>
6 5 4 4 7 0 6 3 1 9 1 2 <eos>
8 8 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0

 

以上です。今度、GPUを用意して本格的にやってみたいです。

アドバイス、改善点、質問があればお願いします。

pythonの復習:基本的な操作

pythonの基本的な操作についてまとめます。出力、繰り返し、リスト、辞書、関数、便利な記述法、クラスについてです。

 

以下の本を参考にしました。

book.mynavi.jp

 

1:pythonの復習:出力、繰り返し

2:pythonの復習:リスト、辞書など

3:pythonの復習:関数、便利な記述法

4:pythonの復習:classについて

 

この順番で説明します。

 

 

   1:pythonの復習:出力、繰り返し

print、input、if、elif、else、pass、for、range、break、continue、変数関数についてです。

#pythonの復習1、出力、繰り返し

grade=2
old=19
print("学部",grade,"年です.",end="")
print("よろしくお願いします") #学部2年です.よろしくお願いします
grade_str=str(grade) print("学部"+grade_str+"年です.") #学部2年です. print("年齢:{0},学年:{1}".format(old,grade)) #年齢:19,学年:2 print("{first}+{second}={result}".format(first=3,second=2,result=5)) #3+2=5
name=input("hello") #helloと表示される。入力できる。nameに代入される。 number=2 #if,elif,else if number%10==0:print("10で割れる") elif number%5==0:print("5で割れる") else:print("わからん")
n=5 #pass、何もしない if n==4:pass else:print(n) for a in range(5):print(a,end="") #01234 for a in range(1,6):print(a,end="") #12345 for a in range(1,6,2):print(a,end="") #135 for a in range(10): print(a,end="") #0123 if a==3:break for a in range(5): print(a,end="") if a%2==0:continue print("odd",end="") #01odd23odd4 a=30 #関数みたいにいろいろできる a=a.__add__(5) #a=35 print(dir(a)) #使える関数一覧が出てくる

 

   2:pythonの復習:リスト、辞書など

 list、enumerate、del、タプル、辞書、keys、values、itemsなどです。

#pythonの復習2、リスト、辞書など

list1=[1,3,5,7]
for a in list1:
    print(a,end="") #1357
    
list2=["a","b","c"]
for a,b in enumerate(list2): #indexと値が入る
    print(a,b)

a=[1,2,3]
a+=[4,5,6] #a=[1,2,3,4,5,6]
print(a[1:3]) #[2,3]
print(a[::2]) #[1,3,5]
print(a[1:5:2]) #[2,4]

a=[1,2,3,4,5,6]
del a[2] #a=[1,2,4,5,6]

a={1,2,3,4}
print(1 in a) #True
b={1,2}
print(a-b) #{3,4}
c={3,4,5}
print(a|c) #{1,2,3,4,5}
print(a&c) #{3,4}

dic={1:11,2:22,3:33}
print(dic[1]) #11
print(list(dic.keys())) #[1,2,3]
print(list(dic.values())) #[11,22,33]
print(list(dic.items())) #[(1,11),(2,22),(3,33)]
for a,b in dic.items():print(a,b) #keyとvalueが入る

a,b,c=[1,2,3]
print(a,b,c) #1 2 3

 

   3:pythonの復習:関数、便利な記述法

 args、lambda、import、map、filter、内包表記などです。

#pythonの復習3、関数、便利な記述法

def sumargs(*args): #引数任意の関数
    result=0
    for a in args:result+=a
    return result
print(sumargs(1,2,3,4,5))#15

def argsargs(**args):return args #引数が辞書に入る
print(argsargs(a=1,b=2,c=3)) #{'a': 1, 'b': 2, 'c': 3}
print(argsargs(a=12,b=13,c=14)) #{'a': 12, 'b': 13, 'c': 14}

x=lambda x:x*2 #気軽に関数定義
print(x(2)) #4
print(x(3)) #6

list3=[1,2,3,4,5] #関数をlistの中身全部に実行するmap
x2=lambda x:x**2
print(list(map(x2,list3))) #[1,4,9,16,25]

x3=lambda x:x%2==0 #フィルターをlistの中身全部に実行filter
print(list(filter(x3,list3))) #[2,4]

from chainer import Link #chainerから選んでimport
from matplotlib import * #matplotから中身全部import

data=[i*2 for i in range(5)] #data=[0,2,4,6,8]
data2=list(map(lambda x:x*2,range(5))) #data2=[0,2,4,6,8]
data3=[i for i in range(5) if i%2==0] #data3=[0,2,4]

base=[1,2,3]
data4=[(x,y) for x in base for y in base]
#data4=[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
data5=[(x,y) for x in base for y in base if x!=y]
#data5=[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]

 

    4:pythonの復習:classについて

class、__init__、継承、__call__などについてです。

#pythonの復習4、classについて

class Student:
    def __init__(self,id,score=0): #__init__で初期化
        self.id=id
        self.score=score
    def setscore(self,score):self.score=score
    def getscore(self):return self.score

class Calc: #classを使うclass
    def __init__(self):self.students=[]
    def add(self,student):self.students.append(student)
    def ave(self):
        result=0
        for i in self.students:result+=i.getscore()
        result=result/len(self.students)
        return result

s1=Student(1,50) #calcに生徒のデータを追加して、成績の平均を求めることができる
s2=Student(2,60)
s3=Student(3,80)
calc=Calc()
calc.add(s1)
calc.add(s2)
calc.add(s3)

class A:
    def printa(self):print("a")
class B:
    def printb(self):print("b")
class C:
    def printc(self):print("c")
class D(A,B,C): #classの継承
    def printd(self):print("d")
    def printall(self):
        self.printa()
        self.printb()
        self.printc()
        self.printd()
d=D()
d.printa()
d.printd()
d.printall()

class Game:
    def __init__(self):
        self.score=100
        self.count=3
    def start(self):print("start")

class Cardgame(Game): #classの継承
    def __init__(self):
        super().__init__()
        self.max=53

    def next(self):print("next turn")
first=Cardgame()
print(first.score)
print(first.max)
first.next()

class List_practice: #__call__でクラス自身を関数みたいに使える
    def __init__(self,length):self.list1=[i for i in range(length)]
    def __call__(self,number):print([i*number for i in self.list1])
    def add(self,number):self.list1.append(number)
    
mylist=List_practice(5)
mylist(2) #[0,2,4,6,8]
print(mylist.list1) #[0,1,2,3,4]

 

pythonの復習をしました。

アドバイス、改善点、質問などがあればお願いします。

オートエンコーダー(AE)とクラスタリングの実装

4、8、16次元の任意の特徴を持つベクトルのデータセットを作ります。それらをオートエンコーダーで2次元ベクトルに変換して、クラスタリングすることを目的とします。ラベリングはわかっているので、最後にこれらを並べて描画して、精度を確認します。

 

オートエンコーダー(AE)とは自分自身を教師データとしてニューラルネットワークを学習することで、特徴を抽出する手法のことです。今回はこれで次元圧縮を行います。

 

AEとChainerについては以下の本を参考にしました。

shop.ohmsha.co.jp

 

 

1:学習するデータを作る

2:オートエンコーダーで学習して2次元ベクトルにする

3:クラスタリングする

4:ラベリングと比較して、精度を確認する

 

この流れで説明します。

 

作成したプログラムは全てgithubに上げてあります。

github.com

 

 

          1:学習するデータを作る

 

1から10の数字がランダムに入った8、16次元ベクトルを作ります。8次元ベクトルは2つずつ、16次元ベクトルは4つずつ、マイナスにします。こうすることで、それぞれ4クラスずつ、データを作ります。

 data_create.pyです。

 

          2:オートエンコーダーで学習して2次元ベクトルにする

 

train3.pyでは8次元ベクトルをオートエンコーダーで2次元ベクトルに変換して、ラベリングはわかっているので、クラスごとに色付けて、グラフに描画しました。

train4.pyでは16次元ベクトルを2次元です。後は同様です。

train5.pyでは16次元ベクトルを6次元にして、その6次元ベクトルを、2次元にします。後は同様です。

train3.py、train4.py、train5.pyです。 

描画結果は4で示します。

 

          3:クラスタリングする

 

ラベリングはわかっていないものとしてtrain5.pyで変換された2次元ベクトルにクラスタリングを行います。 

 

クラスタリングするために、sklearnをインポートします。

使うアルゴリズムはkmeansです。この手法はあらかじめクラスタ数がわかっている必要があります。最初にクラスタ数分の中心点をランダムに設定します。その中心点から各点の距離を考えて、それぞれの点をクラスタに分類します。その後、それぞれのクラスタの重心を求め、その位置で中心点を更新します。これを繰り返します。これがkmeansです。

 

機械学習の手法については別記事でまとめてあります。

person.hatenablog.jp

 

scikitlearnでkmeansを使う方法について、以下の記事を参考にしました。

 

1: scikit-learn でクラスタ分析 (K-means 法) – Python でデータサイエンス

2: paiza.hatenablog.com

 

作成したプログラムはcluster.py です。

最後はクラスタごとに色を付けて、グラフに描画しています。

 

 

          4:ラベリングと比較して精度を確認する

 

 

f:id:wada0421514:20180406211505p:plain

 

8次元ベクトルをAEで2次元に変換したやつです。左がラベリングで、右がクラスタリングの結果です。クラスタリングがほとんどうまくいっていることがわかります。(train3.py)

 

 

f:id:wada0421514:20180406211914p:plain

 

16次元ベクトルをAEで2次元に変換したやつです。左がラベリングで、右がクラスタリングの結果です。クラスタリングがかなりうまくいっていることがわかります。(train4.py)

 

f:id:wada0421514:20180406212437p:plain

 

16次元ベクトルをAEで6次元に変換して、それを2次元に変換したやつです。左がラベリングで、右がクラスタリングの結果です。色とマーカーが対応してないです。すいません。AEによるデータ圧縮があんまりうまくいっていない感じです。直感的に、間に6次元を挟んであげることで、特徴をとらえやすくなるかと考えましたが、ダメでした。(train5.py)

 

 以上、AEとクラスタリングでした。AEは思った以上に圧縮がうまくいっていたので良かったです。クラスタリングをするのにsklearnを使いましたが、思った以上に使いやすく、驚きました。

 

アドバイス、改善点、質問があればお願いします。

ChainerでCNN使って画像分類2-学習、精度確認-

犬が画像に写っているかどうか判定することを目的とします。ChainerでCNNを使います。やっていることは、以前書いたTensorflowの記事と同じです。

 

person.hatenablog.jp

 

 

ChainerでCNN使って画像分類1-データ用意-から続きます。

 

person.hatenablog.jp

 

1では、用意した画像を配列に変換して、訓練データ、テストデータをファイルに保存しました。

2では学習を行い、精度を確認します。

 

作成したプログラムは全てgithubに上げてあります。

github.com

 

 

2:学習、精度確認

 

ファイルに保存された訓練データとテストデータを読み込んで、学習します。Chainerお決まりの書き方があるのでそれに従いました。 クラスMyModelの部分です。

 

精度は6、7割くらいです。かなり悪いです。層が浅い、工夫なし、学習短めですので仕方ないと思います。前回同様、実際に体験することを目的としているので良いです。暇があったら精度向上に取り組もうと思います。

 

Chainerはシンプルで使いやすいです。Tensorflowに比べて、エラーも見やすいです。エラーは次元に関わるものが多かったです。加えて、注意点についてです。

 

注意点

・(28,28,3)ではなく、(3,28,28)にする必要があること

・インプットはバッチ形式

・ソフトマックスクロスエントロピー誤差はクラス番号ラベル

 

こんな感じです。アドバイス、改善点があればお願いします。

 

 

ChainerでCNN使って画像分類1-データ用意-

以前、TensorflowでCNN使って、犬の画像分類をやりました。それと同じことをChainerで実装しました。

 

person.hatenablog.jp

 

作成したプログラムは全てgithubに上げてあります。

github.com

 

家で飼っている犬の写真が1000枚程たまったので、ネットから集めた画像1000枚と合わせて2000枚を学習データとします。

犬が画像に移っているかどうかを判定することを目標とします。

 

ChainerはTensorflowより、使いやすかったです。

 

以下の本を参考にしました。

shop.ohmsha.co.jp

 

この本は、numpy、基礎的なChainer利用、Trainer、NN、CNN、word2vec、RNN、LSTMなどを取り上げています。Python2ですが、コードも数式も扱っているので、オススメです。

 

以下の2ステップで行います。

 

1:データ用意

2:学習、精度確認

 

 

1:データ用意

 

person.hatenablog.jp

 

上の記事とやっていることはだいたい同じです。画像を集めたり、整えたりするところは割愛するので、上の記事を見てください。

 

(28,28)の犬のjpg画像901枚をファイルlattteに、(28,28)の適当なjpg画像1101枚をファイルotherに用意できたところから始めます。

 

gazo2vec.pyの関数jpg_2_tensorはファイルのjpg画像を読み込んで、クラスごとに配列として保存します。

vec2train.pyの関数tensor_2_allはクラスごとに保存された配列データを訓練データ、テストデータに分けて保存します。

 

これらの関数をtrain_data_hozon.pyから使って、訓練データ、テストデータをファイルに保存しました。tensorflowでは(28,28,3)でしたが、chainerでは(3,28,28)にする必要があるので、それもここでやりました。

 

損失関数にソフトマックスクロスエントロピー誤差関数を使うので、label_cov.pyで、one-hotラベルを、クラス番号ラベルに変換して、ファイルに保存します。

 

これで、(3,28,28)の訓練データ、テストデータとクラス番号ラベルの訓練教師データ、テスト教師データをファイルに保存できました。学習の準備は完了です。

 

ChainerでCNN使って画像分類2-学習、精度確認-に続きます。

person.hatenablog.jp

 

機械学習の手法、チートシートの解説

 

f:id:wada0421514:20180317101035p:plain

 

いわゆる古典的な機械学習についてあまり勉強したことがなかったので、足掛かりとして、アルゴリズムチートシートの理解から勉強を始めることにしました。このあと、kaggleに取り組みたいと考えています。

 

上記の機械学習アルゴリズムチートシートについて解説します。数式、コードは出てきません。直感的な理解を意識したので、間違っている可能性も結構あります。

 

主に以下の記事を参考にしました。

qiita.com

 

 

以下のリンクはscikit-learn公式による詳しい説明です。

http://scikit-learn: machine learning in Python — scikit-learn 0.19.1 documentation

 

 

説明の順番

 

1:クラス分類

2:クラスタリング

3:回帰

4:次元圧縮

5:その他の有名な手法

 

 

          1:[クラス分類(classification)]、教師あり学習 

f:id:wada0421514:20180317102110p:plain

 

/SGD(Stochastic Gradient Descent)classifier

確率的勾配降下法と言います。データを識別平面で分けることを考えます。識別平面の係数を学習します。データを一つずつ学習するので確率的と言います。識別結果と教師データから損失関数を算出して、それを減少させるようにパラメータを更新します。損失関数のパラメータの勾配を求めて、それをパラメータから引いて、パラメータを更新するということを行います。だから、勾配降下法です。

 

/LinearSVC

SVMによる線形な(linear)Classificationという意味です。SVM(Support Vector Machine)を使って線形な識別平面を求めてクラス分類します。SVMとは識別平面と、各クラスの最も近いデータの距離を最大化することでパラメータを得る方法です。

 

/(kernel)SVC
順番が飛びますが先にSVCについて説明します。SVCとだけ言うと、基本的に、kernelSVCのことを指します。これは、高次元空間にデータを写像して、SVMする手法です。カーネルによって、高次元空間に明示的に訪れることなく、必要な計算が可能になります。

home.hiroshima-u.ac.jp

 

enakai00.hatenablog.com

 

qiita.com

 

/カーネル近似(kernel approximation)

kernelSVCはデータ数が多いと計算コストが高すぎて使えません。それを乱数による近似で解決する手法です。細かい部分はよくわかりませんでした。

 

/K近傍法(K Neighbors Classifier)

識別したいデータから、近くにあるK点を選んで、その中で一番数が多いクラスに分類する手法です。

 

/Ensemble Classification、ランダムフォレスト

 ここでは、一番よくあるアンサンブル学習としてランダムフォレストを説明します。
ランダムフォレストは決定木を使います。決定木はYESかNOで質問に答えて枝分かれすることを繰り返して分類します。ジニ不純度やエントロピーで誤差を測ってパラメータを調整します。各決定木は全データnからそれぞれ異なるデータmを用いて学習します。そうしてできた複数の決定木の多数決でクラス分類する手法です。

mathwords.net

 


/ナイーブベイズ(Naive Bayes)

ニュース記事などのクラス分類に用いられる方法です。ナイーブとは各単語を独立であると仮定することを意味します。内閣というワードが含まれる記事は政治クラス、野球だったらスポーツクラスに分類される確率が高いです。クラス1の学習データよりクラス2の学習データにゲームという単語の出現回数が多かったら、テストデータでゲームという単語を含む記事はクラス1よりクラス2に分類される可能性が高いだろうということです。これを全部の単語に対して行います。こういった考え方を使ってベイズ推定する方法です。

ベイズ推定とは、最尤法に加えてベイズの定理をもとに事前確率も考慮して確率分布のパラメータを求める方法です。

www.anlyznews.com

 

 
        2:[クラスタリング]、教師なし学習 

f:id:wada0421514:20180317104225p:plain

 

/KMeans
予めクラスタ数がわかっている必要があります。アルゴリズムに基づいて、適当にクラスタ数分の中心点を生成します。各データを、最も近い中心点のクラスに分類します。分類した各クラスの重心を求めて、中心点とします。中心点が動かなくなるまで、クラス分類、中心点求める、を繰り返します。


/スペクトルクラスタリング
予めクラスタ数がわかっている必要があります。データのつながりを考えて、グラフで表現します。このグラフを行列で表現します。こうしてできたグラフ行列をスペクトル分解と呼ばれる固有値分解のようなことをして、グラフ行列の固有値ベクトルを求めます。この固有値ベクトルを結合してできた固有値ベクトル行列をKMeansでクラスタリングします。


/GMM
予めクラスタ数がわかっている必要があります。KMeansと同じことをガウス分布で行います。これらの手法をEMアルゴリズムと言います。クラスタ数分の分布を適当に決めます。最も所属する確率の高い分布に各データを分類します。各分類されたデータを生成する確率の最も高い分布を求めます。分類、分布生成を変化がなくなるまで繰り返します。分布の推定には最尤法を使います。

最尤法とは、観測されたデータの確率の積(尤度)を最大化して、データを説明する確率分布のパラメータを求める方法です。

uncorrelated.hatenablog.com

 

 

/MeanShift
予めクラスタ数がわからなくてもよいです。クラスタ数を指定せずにKMeansを行う方法です。既定の距離より近くなったクラスタは合体して1つにします。


/VBGMM
変分ベイズとGMMを合わせたような方法です。クラスタ数はベイズ推定で求めます。分布の推定にはベイズ推定を使います。

 

 

        3:[回帰](regression) 

f:id:wada0421514:20180317105350p:plain

 

/SGD Regressor

分類のsgdとやっていることは同じです。誤差の指標となる損失関数の減少を目指します。損失関数のパラメータの勾配によって、パラメータを更新します。


/Lasso

損失関数にL1ノルムを加えて、パラメータを学習する方法です。パラメータはスパースになりやすいです。

ノルムについて説明します。特定の点からある点までの距離を表すのがノルムです。L2ノルムは各データのノルムを2乗した値の和です。L1ノルムは各データのノルムの絶対値の和です。

blue-intelligence.cocolog-nifty.com

 

/Ridge

損失関数にL2ノルムを加えて、パラメータを学習する方法です。

 

/ElasticNet

損失関数にL1ノルムとL2ノルムを加えて、パラメータを学習する方法です。それぞれに係数をかけて影響を調節します。

 

/linearSVR

SVMで線形に回帰します。回帰直線とデータの誤差の最小化でパラメータを学習します。特徴は一定距離まで誤差を考慮しないことです。

 

/SVR

カーネルを利用して高次元空間にデータを写像してSVMで回帰します。

 

/Ensemble Regressors
分類と同様にランダムフォレストがよく使われます。ランダムフォレストで、分類と同じことを回帰でします。

 

 

        4:[次元圧縮]

f:id:wada0421514:20180317111935p:plain

 

/PCA
主成分分析と言います。分散が大きい方向を見つけて、その方向に新しい
軸を設定する方法です。この時、固有値分解を使います。

bdm.change-jp.com

 

/kernelPCA
カーネルを使って非線形変換してから、PCAを使う方法です。

 

/Spectral Embedding
スペクトラルクラスタリングとしていることは同じです。データのつながりを意識して、グラフ行列を作り、これを固有値分解して、固有値ベクトルを得ることで、次元を圧縮します。


/Isomap
3次元空間上のデータを考えるとき、そのデータがとある平面上(多様体)に分布していたとすると、そのデータは2次元で表すことができます。これと同じ事をn次元で行います。

www.slideshare.net

 

/LLE
多様体の考え方を使うのは、Isomapと同じです。それに加えて、拘束条件が加わるみたいです。

 

 

        5:[その他の有名な手法]

 

1:K-fold cross validatio
データをk個のグループに分けます。k-1個のグループのデータでパラメータを推定して、残りの1つで検証します。これをk回繰り返す方法です。

 

2:XGBoost

まず、GB(Gradient Descent)について説明します。GBとは複数の弱学習器を使ってアンサンブル学習するときにパラメータの更新に勾配降下法を使う手法です。ブースティングは弱学習器を1つずつ順番に構築することを意味します。

smrmkt.hatenablog.jp

 
上記のGBとランダムフォレストを組み合わせた手法です。弱学習器として
決定木を用いるということです。

qiita.com

またXGBoostではGBではなくて後述のNewtonBoostingを使うこともあるそうです。

NewtonBoostingとは勾配降下法ではなく、ニュートン法を用いて学習する手法です。
        ニュートン法は、接線による近似を繰り返す方法です。

qiita.com

 

3:グリッドサーチ
ハイパーパラメータを最適化する方法です。
組み合わせを全部試してみて、一番良いハイパーパラメータを決定します。

 

以上です。機械学習の手法について何となくわかりました。

アドバイス、改善点があればお願いします。

 

 

 

深層学習のブレークスルーと流行

 

深層学習の流行の始まりがわからなかったので、いろいろ調べました。

その結果わかったことをまとめます。かなり雑かもしれないです。間違っている可能性もあります。ぼくの勝手な解釈も入ります。

 

 

昔から、ニューラルネットワークの開発は色々行われていた。層を深くすれば精度が上がりそうであることがわかった。しかし、勾配消失問題のせいで深くできない。だめだ。ニューラルネットワーク下火になる。

 

2006年にトロント大学のヒントン先生がDeep Belief Networkを発表した。これを使った事前学習で、勾配消失問題が回避できるらしい。ニューラルネットワーク、深層学習に注目が集まった。

 

2012年にヒントン先生の教え子、Alexさんが中心となって作ったAlexNetがILSVRC2012でその他の古典的手法に大きく差をつけて優勝した。AlexNetはLeCunさんの研究論文をもとに作られたCNNである。LeCunさんのその研究は福島さんのネオコグニトロンをルーツに持つらしい。この歴史的優勝によって、深層学習研究に火が付いた。

 

こんな感じです。

 

実際、2013年以降のILSVRCは2012年の結果を受けて、上位チームのほとんどがCNNだったらしい。この例からも、ニューラルネットワークの流行り具合が明らかです。

 

 

わかりにくいですが、2012年のAlexNetにヒントン先生のDBNによる事前学習は行われていません。もともと、CNNは事前学習を必要としないからです。この辺がわかりにくかったです。2006年と2012年は直接は繋がってないです。

 

 

リバストのブログ Deep Learningの概要

 

こちらの記事を主に参考にしました。後、深層学習の青本も参考にしました。以上です。

 

改善点、アドバイスがあればお願いします。