2017-09-13 6 views
0

ディメンション(5000,26421)のデータセットでカーネルpcaを実行して、より小さいディメンション表現を取得する必要があります。構成要素の数(k)パラメータを選択するために、データの縮小と元の空間への再構成を実行し、kの異なる値に対する再構成された元のデータの平均二乗誤差を得る。Scikit-Learn GridSearchカスタムスコアリング関数

私はsklearnのgridsearch機能を見つけたので、上記のパラメータ推定に使用したいと考えています。カーネルpcaにはスコア機能がないので、カスタムスコアリング機能を実装してGridsearchに渡しました。

from sklearn.decomposition.kernel_pca import KernelPCA 
from sklearn.model_selection import GridSearchCV 
import numpy as np 
import math 

def scorer(clf, X): 
    Y1 = clf.inverse_transform(X) 
    error = math.sqrt(np.mean((X - Y1)**2)) 
    return error 

param_grid = [ 
    {'degree': [1, 10], 'kernel': ['poly'], 'n_components': [100, 400, 100]}, 
    {'gamma': [0.001, 0.0001], 'kernel': ['rbf'], 'n_components': [100, 400, 100]}, 
] 

kpca = KernelPCA(fit_inverse_transform=True, n_jobs=30) 
clf = GridSearchCV(estimator=kpca, param_grid=param_grid, scoring=scorer) 
clf.fit(X) 

しかし、それは以下のエラーが発生:

/usr/lib64/python2.7/site-packages/sklearn/metrics/pairwise.py in check_pairwise_arrays(X=array([[ 2., 2., 1., ..., 0., 0., 0.], 
    ...., 0., 1., ..., 0., 0., 0.]], dtype=float32), Y=array([[-0.05904257, -0.02796719, 0.00919842, ....  0.00148251, -0.00311711]], dtype=float32), precomp 
uted=False, dtype=<type 'numpy.float32'>) 
    117        "for %d indexed." % 
    118        (X.shape[0], X.shape[1], Y.shape[0])) 
    119  elif X.shape[1] != Y.shape[1]: 
    120   raise ValueError("Incompatible dimension for X and Y matrices: " 
    121       "X.shape[1] == %d while Y.shape[1] == %d" % (
--> 122        X.shape[1], Y.shape[1])) 
     X.shape = (1667, 26421) 
     Y.shape = (112, 100) 
    123 
    124  return X, Y 
    125 
    126 

ValueError: Incompatible dimension for X and Y matrices: X.shape[1] == 26421 while Y.shape[1] == 100 

誰かがまさに私が間違っているのかを指し示すことができますか?

+0

最初に、PCAに[score()](http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA.score)関数があります。次に、カスタムスコア関数をgridSearchに渡すために['make_scorer()'](http://scikit-learn.org/stable/modules/generated/sklearn.metrics.make_scorer.html)を使います。 –

+0

私はこの場合にはPCAを使用せず、スコア機能を持たないKernel PCAを使用しています。また、make_scorer関数を使って試しましたが、このアプローチはうまくいきません。 – user1683894

答えて

0

スコアリング関数の構文が正しくありません。分類子にはpredictedtruthの値を渡す必要があります。だから、これはあなたのカスタムスコアリング関数を宣言する方法です:

def my_scorer(y_true, y_predicted): 
    error = math.sqrt(np.mean((y_true - y_predicted)**2)) 
    return error 

次に、あなたがそれに応じてgreater_is_better属性を設定してくださいGridSearch.Beにそれを渡すためにsklearnにmake_scorer機能を使用することができます。

Whether score_func is a score function (default), meaning high is good, or a loss function, meaning low is good. In the latter case, the scorer object will sign-flip the outcome of the score_func.

私はより良い、より小さな誤差いるので、あなたがエラーを計算していると仮定していますので、この属性はFalseのように設定する必要があります

from sklearn.metrics import make_scorer 
my_func = make_score(my_scorer,greater_is_better=False) 

は、その後、あなたはGridSearchに渡す:

my_clfあなたの分類器である
GridSearchCV(estimator=my_clf, param_grid=param_grid, scoring=my_func) 

もう1つ、私はGridSearchCVがあなたが探しているものとまったく同じだとは思わない。基本的に列車とテストスプリットの形式でデータを受け入れます。しかしここでは、入力データを変換するだけです。 Pipeline in Sklearnを使用する必要があります。 PCAとGridSearchCVを組み合わせた例mentioned hereを見てください。

+0

誰もdownvoteを説明することはできますか? –

+0

カーネルPcaのハイパーパラメータを調整して、再構成エラーが最小のパラメータ設定を見つけ、GridSearchが同じことを実行することがわかった。上記の場合、 から来るy_predicted = kpca.fit_transform(input_data) y_true = kpca.inverse_transform(y_predicted) したがって、エラー関数のclfパラメータ。あなたのアプローチでさえ、私はエラーを受け取ります "TypeError:__call __()少なくとも4つの引数(3与えられます)" – user1683894

関連する問題