このシリーズの以前の資料では、DBMSを使用したデータの前処理方法を検討しました。 これは、大量の情報を処理する場合に役立ちます。 この記事では、PythonとTheanoの使用に焦点を当てて、大量のデータをインテリジェントに処理するためのツールについて引き続き説明します。
解決するタスクと、これに使用するツールを検討してください。 前の部分[ 1、2、3 ]を読むことは望ましいですが、必須ではありません。 一連の記事の前の部分の結果として取得されたソースデータは、ここ[ ソースデータ ]から取得できます。
タスク
データ間に隠れた関係、特徴間の相関、構造的な関係がある場合、この場合、入力データの次元を減らすという問題が発生します。 この問題は、大量のスパースデータが処理される状況で特に顕著に現れます。
データの次元を減らす方法を比較するために、ニューラルネットワーク圧縮の方法(Autoencoder)と主成分の方法(PCA)を検討します。
この問題を解決する古典的な方法は、主成分分析(PCA)メソッドです。 ウィキペディアはそれをうまく説明しています[ 4 ]、Excelの例、および詳細でかなり理解可能な説明を含むサイトへのリンク[ 5 ]もあります。 Habré[ 6、7 ]の記事へのリンクはこちらです。
原則として、入力データの次元を削減した結果は、主にこの方法を適用した結果と正確に比較されます。
記事[ 8 ]では、自動エンコーダーとは何か、どのように機能するかについて説明しています。主要な資料は、このアプローチの実装とアプリケーションに特化したものだからです。
BangioとYoshuaは、[ 9 ]のセクション4.6の48〜50ページで、結果を既存の結果と比較するために突然この参考文献を参照する必要がある場合に、ニューラルネットワーク圧縮の使用に関する優れた明確な概要を書きました。
ツールキットとして、PythonとTheano [ 10 ]を使用することにしました。 機械学習のためのニューラルネットワークのコースを聞いて、J。ヒントン教授によって提供されたリンクを調べた後に、このパッケージを発見しました。 このパッケージでは、「ディープラーニング」のニューラルネットワーク(ディープラーニングニューラルネットワーク)が実装されています。 このようなネットワークは、講義や記事[ 11、12 ]で説明されているように、AndroidでGoogleが使用する音声認識システムの基礎を形成しました。
一部の科学者によると、ニューラルネットワークの構築に対するこのアプローチは非常に有望であり、すでに良い結果を示しています。 そのため、Kaggleの問題を解決するためにそれを適用することは興味深いものになりました。
また、 deeplearning.net Webサイトには、この特定のパッケージを使用して機械学習システムを構築する多くの例があります。
ツール
開発者のドキュメントでは、この定義が与えられています:
Theanoは、多次元配列を使用して数式を効率的に定義、最適化、評価できるPythonライブラリおよび最適化コンパイラです。
ライブラリ機能:
- NumPyとの緊密な統合。
- GPUの透過的な使用。
- 変数の効果的な差別化;
- 高速かつ安定した最適化。
- 動的なCコード生成。
- 高度な単体テストおよび自己テスト機能。
Theanoは、2007年以来、高輝度コンピューティングの研究で使用されています。
実際、Theanoの表現は、Theanoの式を作成するPythonプログラムで記述されているため、Theanoのプログラミングは完全な意味でのプログラミングではありません。
一方、これはプログラミングです。変数を宣言し、これらの変数をどうするかを指定する式を作成し、これらの式を計算で使用される関数にコンパイルするからです。
要するに、NumPyとは異なり、Theanoでできることのリストです。
- 実行速度の最適化:Theanoはg ++またはnvccを使用して、式の一部をGPUまたはCPU命令にコンパイルできます。GPUまたはCPU命令は、純粋なPythonよりもはるかに高速に実行されます。
- 変数の微分:Theanoは勾配を計算するための式を自動的に構築できます。
- 最適化の安定性:Theanoは数値的に不正確な式を認識し、より堅牢なアルゴリズムを使用してそれらを計算できます
Theanoに最も近いパッケージはsympyです。 sympyパッケージはMathematicaと比較できますが、NumPyはMATLABパッケージに似ています。 Theanoはハイブリッドであり、その開発者はこれらのパッケージの両方を最大限に活用しようとしました。
おそらく、サイクルの過程で、theanoの構成方法、CUDA GPUの使用をトレーニングニューラルネットワークに接続し、インストール中に発生する問題を解決する方法に関する別の記事が作成されます。
それまでの間、私のLinux Slackware 13.37オペレーティングシステムには、python-2.6、setuptools-0.6c9-py2.6、g ++、python-dev、NumPy、SciPy、BLASがインストールされています。 一般的なOSの詳細なインストールマニュアル(英語):[ 12 ]。
データの次元数を減らす前に、Theanoを使用してグループを2つの部分に分割する問題を解決できる関数を記述する簡単な例を実装しようとします。
データを2つのクラスに分割する方法として、ロジスティック回帰[ 13 ]を使用します。
サンプルコードは[ 14 ]に基づいており、いくつかの変更があります。
import numpy import theano import theano.tensor as T import csv as csv # csv csv_file_object = csv.reader(open('./titanik_train_final.csv', 'rb'), delimiter='\t') data=[] # - for row in csv_file_object: # data.append(row) # data data = numpy.array(data) # numpy.array data = data.astype('float') # float Y = data[:,1] # Y X = data[:,2:] # X # , Y csv_file_object = csv.reader(open('./titanik_test_final.csv', 'rb'), delimiter='\t') data_test=[] for row in csv_file_object: data_test.append(row) Tx = numpy.array(data_test) Tx = Tx.astype('float') Tx = Tx[:,1:] # rng = numpy.random # N = 891 # feats = 56 # training_steps = 10000 # Theano x = T.matrix("x") y = T.vector("y") w = theano.shared(rng.randn(feats), name="w") b = theano.shared(0., name="b") # «» Theano p_1 = 1 / (1 + T.exp(-T.dot(x, w) - b)) # , 1 prediction = p_1 > 0.5 # xent = -y * T.log(p_1) - (1-y) * T.log(1-p_1) # cost = xent.mean() + 0.01 * (w ** 2).sum() # gw,gb = T.grad(cost, [w, b]) # # «» Theano train = theano.function( inputs=[x,y], outputs=[prediction, xent], updates=((w, w - 0.1 * gw), (b, b - 0.1 * gb))) predict = theano.function(inputs=[x], outputs=prediction) # for i in range(training_steps): pred, err = train(X, Y) # P = predict(Tx) # numpy.savetxt('./autoencoder.csv',P,'%i')
このコードで最も興味深いのは次の行です。
# «» Theano p_1 = 1 / (1 + T.exp(-T.dot(x, w) - b)) # , 1 prediction = p_1 > 0.5 # xent = -y * T.log(p_1) - (1-y) * T.log(1-p_1) # cost = xent.mean() + 0.01 * (w ** 2).sum() # gw,gb = T.grad(cost, [w, b]) # # «» Theano train = theano.function( inputs=[x,y], outputs=[prediction, xent], updates=((w, w - 0.1 * gw), (b, b - 0.1 * gb))) predict = theano.function(inputs=[x], outputs=prediction)
ここで、次のことが起こります( 最後から分析します! ):2つの「式」を訓練して予測します。 これらは、呼び出して実行できるビューでtheano.functionを使用して「コンパイル」されます(これはコンパイルだけでなく、調査の開始時に単純化する方がよいでしょう)。
予測の入力パラメーターはxで、出力はp_1> 0.5の予測式です。つまり、yes / no値、つまり0または1の値を返すしきい値です。次に、式p_1には、変数xを使用して正確に何を行う必要があるか、つまり次の情報が含まれています。
p_1 = 1 / (1 + T.exp(-T.dot(x, w) - b))
ここで、 x、w、bは変数であり、 train式を使用してwとbを定義します。
列車の場合、入力はx、yであり、出力は予測とxentです。 この場合、 wとbを更新(最適な値を探す)し、式に従って更新します
w-0.1*gw, b-0.1*gb
ここで、 gwとgbは、 コスト式によるxentエラーに関連付けられた勾配です。
そして、式によって計算されたエラーは、次の式から取得されます。
xent = -y * T.log(p_1) - (1-y) * T.log(1-p_1)
そして、予測式とトレーニング式を「コンパイル」すると、Theanoはすべての必要な式を取得し、CPU / GPU用のCコードを作成し、それに応じて実行します。 これにより、パフォーマンスが大幅に向上しますが、Python環境を使用する便利さを損なうことはありません。
指定されたコードの実行結果は、TitanikコンテストのKaggle評価ルールに関する0.765555に等しい予測品質になります。
サイクルの次の記事では、さまざまなアルゴリズムを使用して問題の次元を減らし、結果を比較します。