2017-06-20 9 views
4

sample_weightパラメータをGridSearchCVに渡すと、形状が正しくないためにエラーが発生します。私の疑問は、クロスバリデーションはデータセットに応じてsample_weightsの分割を処理できないということです。sample_weight scikit-learn GridSearchCVのパラメータ形状エラー

最初の部分:

import pandas as pd 
import numpy as np 
from keras.models import Sequential 
from keras.layers import Dense, Activation 
from keras.wrappers.scikit_learn import KerasRegressor 
from sklearn.model_selection import GridSearchCV 
import matplotlib.pyplot as plt 


dataURL = 'https://raw.githubusercontent.com/mcasl/PAELLA/master/data/sinusoidal_data.csv' 

x = pd.read_csv(dataURL, usecols=["x"]).x 
y = pd.read_csv(dataURL, usecols=["y"]).y 
occurrences = pd.read_csv(dataURL, usecols=["Occurrences"]).Occurrences 
my_sample_weights = (1 - occurrences/10000)**3 

my_sample_weightsは、私はX、Yの各観測に割り当てる重要性が含まれています。モデルパラメータとしてsample_weightを使用するのがGridSearchなく、第1、簡単な例を考えてみましょう美しく

作品次の図に示すように、正弦曲線のポイントは、バックグラウンドノイズを形成するポイントよりも高い重みを得る。

plt.scatter(x, y, c=my_sample_weights>0.9, cmap="cool") 

Color coded dataset with respect to my_sample_weights

のは、最初のmy_sample_weightsに含まれる情報を用いずに、ニューラルネットワークを訓練してみましょう:以下の絵が示すように

def make_model(number_of_hidden_neurons=1): 
    model = Sequential() 
    model.add(Dense(number_of_hidden_neurons, input_shape=(1,), activation='tanh')) 
    model.add(Dense(1, activation='linear')) 
    model.compile(optimizer='sgd', loss='mse') 
    return model 

net_Not_using_sample_weight = make_model(number_of_hidden_neurons=6) 
net_Not_using_sample_weight.fit(x,y, epochs=1000) 

plt.scatter(x, y,) 
plt.scatter(x, net_Not_using_sample_weight.predict(x), c="green") 

は、ニューラルネットワークはの形に合うようにしよう正弦波であるが、バックグラウンドノイズは良好なフィット感を妨げる。 enter image description here

ここで、my_sample_weightsの情報を使用すると、予測の品質がはるかに優れています。 enter image description here

第二部分:GridSearchCVパラメータは、エラーパラメータは、次のエラーを与えるようsample_weightsを渡そうとし

my_Regressor = KerasRegressor(make_model) 

validator = GridSearchCV(my_Regressor, 
        param_grid={'number_of_hidden_neurons': range(4, 5), 
           'epochs': [500], 
           }, 
        fit_params={'sample_weight': [ my_sample_weights ]}, 
        n_jobs=1, 
        ) 
validator.fit(x, y) 

を上げるようsample_weightを使用する:

... 
ValueError: Found a sample_weight array with shape (1000,) for an input with shape (666, 1). sample_weight cannot be broadcast. 

それはsample_weightようですベクトルは入力配列と同様に分割されていません。価値がある何のため

import sklearn 
print(sklearn.__version__) 
0.18.1 

import keras 
print(keras.__version__) 
2.0.5 

答えて

1

私たちは、ワークフローのようなグラフを構築し、あなたは中間データを取得することができますScikit-学びパイプラインの拡張をPipeGraphを開発し、特に、この問題を解決する(http://mcasl.github.io/PipeGraphで、ギャラリーの例を参照してください)

1

問題は明示的には、特に断りのない限り標準として、GridSearchは、3倍の相互検証を使用することです。これは、データの2/3データポイントがトレーニングデータとして使用され、クロスバリデーションの1/3がエラーメッセージに適合することを意味します。 fit_paramsの1000の入力形状は、トレーニングに使用されたトレーニング例の数と一致しません(666)。サイズを調整すると、コードが実行されます。

my_sample_weights = np.random.uniform(size=666) 
関連する問題