2017-01-12 15 views
-1

ディープラーニングモデルの精度とデータセットの出力形式を理解する上で助けが必要です。 https://machinelearningmastery.com/deep-learning-with-python2/ディープラーニングモデルの精度を理解する

私はピマ・インディアン・糖尿病データセット、およびアイリスの花のデータセットの例をした:

は、私がこのサイトをもとに、深い学習のためのいくつかの訓練をしました。 http://machinelearningmastery.com/tutorial-first-neural-network-python-keras/

私は以下のスクリプトを使用して、虹彩の花のデータセットをコンピュータに訓練します。

# import package 
import numpy 
from pandas import read_csv 
from keras.models import Sequential 
from keras.layers import Dense 
from keras.wrappers.scikit_learn import KerasClassifier 
from keras.utils import np_utils 
from sklearn.model_selection import cross_val_score, KFold 
from sklearn.preprocessing import LabelEncoder 
from sklearn.pipeline import Pipeline 
from keras.callbacks import ModelCheckpoint 

# fix random seed for reproductibility 
seed = 7 
numpy.random.seed(seed) 

# load dataset 
dataframe = read_csv("iris_2.csv", header=None) 
dataset = dataframe.values 
X = dataset[:,0:4].astype(float) 
Y = dataset[:,4] 

# encode class value as integers 
encoder = LabelEncoder() 
encoder.fit(Y) 
encoded_Y = encoder.transform(Y) 
### one-hot encoder ### 
dummy_y = np_utils.to_categorical(encoded_Y) 

# define base model 
def baseline_model(): 
    # create model 
    model = Sequential() 
    model.add(Dense(4, input_dim=4, init='normal', activation='relu')) 
    model.add(Dense(3, init='normal', activation='sigmoid')) 

    # Compile model 
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
    model_json = model.to_json() 
    with open("iris.json", "w") as json_file: 
     json_file.write(model_json) 

    model.save_weights('iris.h5') 

    return model 

estimator = KerasClassifier(build_fn=baseline_model, nb_epoch=1000, batch_size=6, verbose=0) 
kfold = KFold(n_splits=10, shuffle=True, random_state=seed) 
results = cross_val_score(estimator, X, dummy_y, cv=kfold) 
print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100)) 

私は、このリンクから他のデータセットにしようとすることを決めたまではすべてが正常に動作します:https://archive.ics.uci.edu/ml/datasets/Glass+Identification

最初に私がpime-インドの糖尿病データセットのスクリプトの例を使用して、この新しいデータセットを訓練し、Xの値を変更しますこの

dataset = numpy.loadtxt("glass.csv", delimiter=",") 
X = dataset[:,0:10] 
Y = dataset[:,10] 

この

model = Sequential() 
model.add(Dense(10, input_dim=10, init='uniform', activation='relu')) 
model.add(Dense(10, init='uniform', activation='relu')) 
model.add(Dense(1, init='uniform', activation='sigmoid')) 
のニューロン層の値とY変数と210

結果農産物精度= Iは、文字列(〜のG)の整数(1〜7)に元々あるこのデータセットの出力列を変更しそして

32.71パーセントとアイリス花のための例のスクリプトを使用しそれに

import numpy 
from pandas import read_csv 
from keras.models import Sequential 
from keras.layers import Dense 
from keras.wrappers.scikit_learn import KerasClassifier 
from sklearn.model_selection import cross_val_score 
from sklearn.preprocessing import LabelEncoder 
from sklearn.model_selection import StratifiedKFold 
from sklearn.preprocessing import StandardScaler 
from sklearn.pipeline import Pipeline 

seed = 7 
numpy.random.seed(seed) 

dataframe = read_csv("glass.csv", header=None) 
dataset = dataframe.values 

X = dataset[:,0:10].astype(float) 
Y = dataset[:,10] 

encoder = LabelEncoder() 
encoder.fit(Y) 
encoded_Y = encoder.transform(Y) 

def create_baseline(): 
    model = Sequential() 
    model.add(Dense(10, input_dim=10, init='normal', activation='relu')) 
    model.add(Dense(1, init='normal', activation='sigmoid')) 

    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 

    model_json = model.to_json() 
    with open("glass.json", "w") as json_file: 
     json_file.write(model_json) 

    model.save_weights('glass.h5') 

    return model 

estimator = KerasClassifier(build_fn=create_baseline, nb_epoch=1000, batch_size=10, verbose=0) 
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed) 
results = cross_val_score(estimator, X, encoded_Y, cv=kfold) 
print("Baseline: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100)) 

をいくつかの修正を行うことによって、データセットこのチュートリアルを参照して、私は「dummy_y」変数を使用していない:私は、データセットが出力としてアルファベットを使用して、多分私は再利用できると考えていることを確認しhttp://machinelearningmastery.com/binary-classification-tutorial-with-the-keras-deep-learning-library/

私が修正した新しいガラスのデータセットを訓練するスクリプト。

今回の結果は、この

ベースラインのようになる:68.42パーセント(3.03パーセント)記事から

、68%および3%が平均モデルの精度の標準偏差を意味します。

私の第1の質問は、整数またはアルファベットを出力列として使用するときです。整数から文字列/アルファベットへの出力を変更するようなデータセットで調整したときのこの種の正確な結果は共通ですか?

私の2番目の質問は、どのレイヤーにどの層のニューロンを置く必要があるかを知る方法です。それは、私がモデルをコンパイルするときに使用するバックエンド(TensorflowまたはTheano)に関連していますか?

ありがとうございます。

+0

整数から文字への出力の変更を実行する唯一の違いはありますか?あなたのコードから、層の数を変更したようです。 – ginge

+0

私は再確認し、ニューロンの数を除いて層の数を変更していないことを確認しました。私は2つの異なるスクリプトを使用するので、層の数の違いを見るかもしれません。 1スクリプトはpima-indian-diabetesチュートリアルの例で、出力は整数(1と0)で、スクリプトは3層のように使用します。他のスクリプトは、出力が文字列であるiris-flowerチュートリアルの例です。スクリプトは2つのレイヤーを使用します。 – Ling

+0

ご質問のとおり、3番目のコードスニペットでは、32.71%の精度を持つ3つのレイヤーを持つSequentialモデルを作成します。あなたの4番目のスニペットでは、2つのレイヤーを持つSequentialモデルを使用すると、68.42%の精度が得られます。これは本当ですか、スニペット間に何かがありませんか? – ginge

答えて

0

最初の質問

あなたがここに見ることができるようにそれは、問題ではありません。

Y = range(10) 
encoder = LabelEncoder() 
encoder.fit(Y) 
encoded_Y = encoder.transform(Y) 
print encoded_Y 

Y = ['a', 'b', 'c', 'd', 'e', 'f','g','h','i','j'] 
encoder = LabelEncoder() 
encoder.fit(Y) 
encoded_Y = encoder.transform(Y) 
print encoded_Y 

結果:あなたの分類器が正確に同じラベルを見ていることを意味し

[0 1 2 3 4 5 6 7 8 9] 
[0 1 2 3 4 5 6 7 8 9] 

を。

2番目の質問

あり、この質問には絶対的に正しい答えはありませんが、確かにそれはあなたのバックエンドに依存しません。

問題に最適なアーキテクチャが何であるかを理解するために、異なる数のニューロン、レイヤーの数、レイヤーのタイプ、その他のネットワークパラメータを試してみる必要があります。 経験を使って、どのタイプの問題に対してより良いパラメータが得られるか、実験のための良い方法の両方について、良い直感を発揮します。

私は聞いたことがあるように、「過大評価するまでネットワークを大きくし、過大評価しなくなるまで正則化を繰り返す」と聞いたことがあります。 。