2017-10-29 13 views
1

私は基本的な多層ニューラルネットワークのニューロンの数をグリッド探索する方法を自分で学習しようとしています。私はPythonとKerasのGridSearchCVとKerasClasifierを使用しています。以下のコードは他のデータセットでもうまく機能しますが、何らかの理由でIrisのデータセットでは機能しませんでした。その理由を見つけることができず、ここで何か不足しています。私が得る結果は次のとおりです。私は2つの値だけを検索例示の目的と計算効率のためにニューロン数のためのGridSearchCV

Best: 0.000000 using {'n_neurons': 3} 0.000000 (0.000000) with: {'n_neurons': 3} 0.000000 (0.000000) with: {'n_neurons': 5}

from pandas import read_csv 

import numpy 
from sklearn.preprocessing import LabelEncoder 
from sklearn.preprocessing import StandardScaler 

from keras.wrappers.scikit_learn import KerasClassifier 
from keras.models import Sequential 
from keras.layers import Dense 
from keras.utils import np_utils 
from sklearn.model_selection import GridSearchCV 

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

seed=7 
numpy.random.seed(seed) 

#encode class values as integers 
encoder = LabelEncoder() 
encoder.fit(Y) 
encoded_Y = encoder.transform(Y) 

#one-hot encoding 
dummy_y = np_utils.to_categorical(encoded_Y) 

#scale the data 
scaler = StandardScaler() 
X = scaler.fit_transform(X) 

def create_model(n_neurons=1): 
    #create model 
    model = Sequential() 
    model.add(Dense(n_neurons, input_dim=X.shape[1], activation='relu')) # hidden layer 
    model.add(Dense(3, activation='softmax')) # output layer 
    # Compile model 
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
    return model 

model = KerasClassifier(build_fn=create_model, epochs=100, batch_size=10, initial_epoch=0, verbose=0) 
# define the grid search parameters 
neurons=[3, 5] 

#this does 3-fold classification. One can change k. 
param_grid = dict(n_neurons=neurons) 
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1) 
grid_result = grid.fit(X, dummy_y) 
# summarize results 
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_)) 
means = grid_result.cv_results_['mean_test_score'] 
stds = grid_result.cv_results_['std_test_score'] 
params = grid_result.cv_results_['params'] 
for mean, stdev, param in zip(means, stds, params): 
    print("%f (%f) with: %r" % (mean, stdev, param)) 

。私はこのような簡単な質問をすることを心から謝ります。私はDeep LearningコミュニティがPythonを使用していることに気づいたので、Pythonには新しく、Rから切り替えました。

+1

あなたのコードを見ていませんでしたが、実際にDLのGridSearchを見ましたか?悪いアイデアIMO。より多くのニューロンを(あなたがボトルネックに達するまで)、より良いものは(理論的に)なりますが、それはあなたのアーキテクチャーも良いことを意味しません。 – Nain

+0

私は完全にあなたを理解しています。私はすでに8のニューロンの数でそのモデルを実行し、良い精度を得る。私はPythonを初めて使うので、できるだけ人工的な分析をしたいだけです。 –

+0

(1)最初のコメントはありません。トレーニングロス(およびフィッティングパラメータ)に関しては真実かもしれませんが、CVを使用すると実行可能なアプローチ(よりシンプルなスキームが良い場合)が可能になります。 (2)少なくともデータが欠落しているため、コードは再現できません。(3)その他のデータセットは何ですか?あなたは彼らが働いているとどのように推測しましたか?これと他の違いは何ですか?アイリスは実際には最も簡単なデータセットの1つであり、完璧なスコアが可能です。(4)スコアのチェックが確実に行われていることを確認してください(スコアvs.ロス;多分明示的なスコアラー関数を使用してください) – sascha

答えて

1

ハハ、これはおそらく私が今までスタックオーバーフロー:)チェックに経験したおかしなものです:

grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1, cv=5) 

、あなたは異なる動作が表示されるはずです。あなたのモデルが完璧なスコアを得る理由(cross_entropy0が最高のモデルと同じです)は、あなたのデータをシャッフルしていないことと、Irisが3つのバランスクラスで構成されているためです。ターゲット:

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 (first fold ends here) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 (second fold ends here)2 2 2 2 2 2 2 2 2 2 2 
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
2 2] 

このような問題はすべてのモデルで解決するのが本当に簡単です。そのため、完璧なマッチングが得られます。

前もってデータをシャッフルしてください。これは予期しない動作を引き起こすはずです。

+0

笑ええ、あなたは正しいです! Geeezzz haha​​私は今自分自身が嫌いです。あなたは、絶対に正しい。私はその点を忘れて、代わりにメソッド自体に完全に焦点を合わせました。私はデフォルトでシャッフルしてmodel.fitと混同していたと思う。ありがとうございました!そして、私は申し訳ありません! –

+0

あなたはそれを持って、仲間! –

関連する問題