Pybrain-datasets-types

提供:Dev Guides
移動先:案内検索

PyBrain-データセットの種類

データセットは、ネットワークでテスト、検証、トレーニングするために提供されるデータです。 使用するデータセットのタイプは、機械学習で実行するタスクによって異なります。 この章では、さまざまなデータセットタイプについて説明します。

私たちは、次のパッケージを追加することにより、データセットを扱うことができます-

pybrain.dataset

SupervisedDataSet

SupervisedDataSetは、 _ input_ および target のフィールドで構成されています。 これはデータセットの最も単純な形式であり、主に教師付き学習タスクに使用されます。

以下は、コードでそれを使用する方法です-

from pybrain.datasets import SupervisedDataSet

SupervisedDataSetで利用可能なメソッドは次のとおりです-

addSample(inp、target)

このメソッドは、入力とターゲットの新しいサンプルを追加します。

splitWithProportion(proportion = 0.10)

これにより、データセットが2つの部分に分割されます。 最初の部分には、入力として指定されたデータセットの%があります。つまり、入力が.10の場合、データセットの10%とデータの90%です。 あなたの選択に従って割合を決めることができます。 分割されたデータセットは、ネットワークのテストとトレーニングに使用できます。

  • copy()*-データセットのディープコピーを返します。
  • clear()*-データセットをクリアします。

saveToFile(ファイル名、フォーマット=なし、** kwargs)

ファイル名で指定されたファイルにオブジェクトを保存します。

以下は、SupervisedDatasetを使用した実際の例です-

*testnetwork.py*
from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure import TanhLayer
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer

# Create a network with two inputs, three hidden, and one output
nn = buildNetwork(2, 3, 1, bias=True, hiddenclass=TanhLayer)

# Create a dataset that matches network input and output sizes:
norgate = SupervisedDataSet(2, 1)

# Create a dataset to be used for testing.
nortrain = SupervisedDataSet(2, 1)

# Add input and target values to dataset
# Values for NOR truth table
norgate.addSample((0, 0), (1,))
norgate.addSample((0, 1), (0,))
norgate.addSample((1, 0), (0,))
norgate.addSample((1, 1), (0,))

# Add input and target values to dataset
# Values for NOR truth table
nortrain.addSample((0, 0), (1,))
nortrain.addSample((0, 1), (0,))
nortrain.addSample((1, 0), (0,))
nortrain.addSample((1, 1), (0,))

#Training the network with dataset norgate.
trainer = BackpropTrainer(nn, norgate)

# will run the loop 1000 times to train it.
for epoch in range(1000):
   trainer.train()
trainer.testOnData(dataset=nortrain, verbose = True)

出力

上記のプログラムの出力は次のとおりです-

*python testnetwork.py*
C:\pybrain\pybrain\src>python testnetwork.py
Testing on data:
('out: ', '[0.887 ]')
('correct:', '[1 ]')
error: 0.00637334
('out: ', '[0.149 ]')
('correct:', '[0 ]')
error: 0.01110338
('out: ', '[0.102 ]')
('correct:', '[0 ]')
error: 0.00522736
('out: ', '[-0.163]')
('correct:', '[0 ]')
error: 0.01328650
('All errors:', [0.006373344564625953, 0.01110338071737218, 0.005227359234093431
, 0.01328649974219942])
('Average error:', 0.008997646064572746)
('Max error:', 0.01328649974219942, 'Median error:', 0.01110338071737218)

ClassificationDataSet

このデータセットは、主に分類の問題に対処するために使用されます。 入力、ターゲットフィールド、および指定されたターゲットの自動バックアップである「クラス」と呼ばれる追加フィールドを取ります。 たとえば、出力は1または0であるか、指定された入力に基づいて出力とともにグループ化されます。つまり、特定の1つのクラスに分類されます。

コードでそれを使用する方法は次のとおりです-

from pybrain.datasets import ClassificationDataSet
Syntax
//ClassificationDataSet(inp, target=1, nb_classes=0, class_labels=None)

ClassificationDataSetで利用可能なメソッドは次のとおりです-

*_addSample(inp、target)_* -このメソッドは、入力とターゲットの新しいサンプルを追加します。
*_splitByClass()_* -このメソッドは2つの新しいデータセットを提供します。最初のデータセットにはクラスが選択され(0..nClasses-1)、2番目のデータセットには残りのサンプルがあります。
*__ convertToOneOfMany()_* -このメソッドは、ターゲットクラスを1-of-k表現に変換し、古いターゲットをフィールドクラスとして保持します
*ClassificationDataSet* の実際の例を次に示します。

from sklearn import datasets
import matplotlib.pyplot as plt
from pybrain.datasets import ClassificationDataSet
from pybrain.utilities import percentError
from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.structure.modules import SoftmaxLayer
from numpy import ravel
digits = datasets.load_digits()
X, y = digits.data, digits.target
ds = ClassificationDataSet(64, 1, nb_classes=10)

for i in range(len(X)):
ds.addSample(ravel(X[i]), y[i])
test_data_temp, training_data_temp = ds.splitWithProportion(0.25)
test_data = ClassificationDataSet(64, 1, nb_classes=10)

for n in range(0, test_data_temp.getLength()):
test_data.addSample( test_data_temp.getSample(n)[0], test_data_temp.getSample(n)[1] )
training_data = ClassificationDataSet(64, 1, nb_classes=10)

for n in range(0, training_data_temp.getLength()):
training_data.addSample( training_data_temp.getSample(n)[0], training_data_temp.getSample(n)[1] )
test_data._convertToOneOfMany()
training_data._convertToOneOfMany()
net = buildNetwork(training_data.indim, 64, training_data.outdim, outclass=SoftmaxLayer)
trainer = BackpropTrainer(
   net, dataset=training_data, momentum=0.1,learningrate=0.01,verbose=True,weightdecay=0.01
)
trnerr,valerr = trainer.trainUntilConvergence(dataset=training_data,maxEpochs=10)
plt.plot(trnerr,'b',valerr,'r')
plt.show()
trainer.trainEpochs(10)
print('Percent Error on testData:',percentError(trainer.testOnClassData(dataset=test_data), test_data['class']))

上記の例で使用されるデータセットは数字のデータセットであり、クラスは0〜9であるため、10のクラスがあります。 入力は64、ターゲットは1、クラスは10です。

このコードは、データセットを使用してネットワークをトレーニングし、トレーニングエラーと検証エラーのグラフを出力します。 また、次のようなテストデータのパーセント誤差を示します-

出力

Classification DataSet。

Total error: 0.0432857814358
Total error: 0.0222276374185
Total error: 0.0149012052174
Total error: 0.011876985318
Total error: 0.00939854792853
Total error: 0.00782202445183
Total error: 0.00714707652044
Total error: 0.00606068893793
Total error: 0.00544257958975
Total error: 0.00463929281336
Total error: 0.00441275665294
('train-errors:', '[0.043286 , 0.022228 , 0.014901 , 0.011877 , 0.009399 , 0.007
   822 , 0.007147 , 0.006061 , 0.005443 , 0.004639 , 0.004413 ]')
('valid-errors:', '[0.074296 , 0.027332 , 0.016461 , 0.014298 , 0.012129 , 0.009
   248 , 0.008922 , 0.007917 , 0.006547 , 0.005883 , 0.006572 , 0.005811 ]')
Percent Error on testData: 3.34075723830735