2011-12-16 12 views
3

は、だから私はscikit学習パッケージwebpate読み:sklearn(scikit-learn)ロジスティック回帰パッケージ - 分類のための訓練された係数を設定します。

http://scikit-learn.sourceforge.net/dev/modules/generated/sklearn.linear_model.LogisticRegression.html

私はデータに合わせてロジスティック回帰を使用することができますが、私はロジスティック回帰のインスタンスを取得した後、私は新しいデータポイントを分類するためにそれを使用することができます。ここまでは順調ですね。

LogisticRegression()インスタンスの係数を設定する方法はありますか?訓練された係数を取得した後、同じAPIを使用して新しいデータポイントを分類する必要があるためです。

他の人が、より優れたAPIを持つ別のPythonマシン学習パッケージをお勧めしますか?

おかげ

答えて

5

実際、estimator.coef_estimator.intercept_属性は読み取り専用です代わりに、通常のPython属性のPythonのプロパティを。それらの値は、estimator.predictまたはestimator.predict_probaを呼び出すときにパラメータのメモリコピーを避けるために、メモリレイアウトが、基底のliblinear C++実装のロジスティック回帰の予想されるメモリレイアウトを直接マップするestimator.raw_coef_アレイから来ています。

私は、読み取り専用のプロパティを持つことには限界があり、これらのプロパティを取り除く方法を見つけなければならないことに同意しますが、この実装をリファクタリングする場合は、不要なメモリコピーを導入しないでくださいソースコードをすばやく見てから行ってください。

私はこの制限を忘れないようにトラッカーにan issueを開いています。

平均時間では、estimator.coef_estimator.raw_coef_がどのように関連しているかを理解し、直接estimator.raw_coef_で値を変更する@property注釈付きestimator.coef_方法を読むことができます。

7

係数が推定オブジェクトの属性である - あなたはロジスティック回帰クラスをインスタンス化したときに作成していること - あなたは、通常のPythonの方法でそれらにアクセスすることができますので、

>>> import numpy as NP 
>>> from sklearn import datasets 
>>> from sklearn import datasets as DS 
>>> digits = DS.load_digits() 
>>> D = digits.data 
>>> T = digits.target 

>>> # instantiate an estimator instance (classifier) of the Logistic Reg class 
>>> clf = LR() 
>>> # train the classifier 
>>> clf.fit(D[:-1], T[:-1]) 
    LogisticRegression(C=1.0, dual=False, fit_intercept=True, 
     intercept_scaling=1, penalty='l2', tol=0.0001) 

>>> # attributes are accessed in the normal python way 
>>> dx = clf.__dict__ 
>>> dx.keys() 
    ['loss', 'C', 'dual', 'fit_intercept', 'class_weight_label', 'label_', 
    'penalty', 'multi_class', 'raw_coef_', 'tol', 'class_weight', 
    'intercept_scaling'] 

それは係数を取得する方法ですが、あなただけの予測のためのそれらを使用しようとしている場合は、より直接的な方法は、推定量の予測方法を使用することです。

>>> # instantiate the L/R classifier, passing in norm used for penalty term 
>>> # and regularization strength 
>>> clf = LR(C=.2, penalty='l1') 
>>> clf 
    LogisticRegression(C=0.2, dual=False, fit_intercept=True, 
     intercept_scaling=1, penalty='l1', tol=0.0001) 

>>> # select some "training" instances from the original data 
>>> # [of course the model should not have been trained on these instances] 
>>> test = NP.random.randint(0, 151, 5) 
>>> d = D[test,:]  # random selected data points w/o class labels 
>>> t = T[test,:]  # the class labels that correspond to the points in d 

>>> # generate model predictions for these 5 data points 
>>> v = clf.predict(d) 
>>> v 
    array([0, 0, 2, 0, 2], dtype=int32) 
>>> # how well did the model do? 
>>> percent_correct = 100*NP.sum(t==v)/t.shape[0] 
>>> percent_correct 
    100 
+0

こんにちは。私はデータをフィットさせて係数を取得する方法を理解していますが、データをフィットさせた後で、データを再度適合させることなく、新しいデータを何度も分類するためにpredict()APIを使用して係数を設定します。あなたの例でclfインスタンスの係数を設定する方法はありますか? clf.set_coefficients()、clf.set_interception()などのように?ありがとう。 – CodeNoob

+2

こんにちは - 私は私に従っているか分からない。クラシファイアを再トレーニングせずに予測するには、トレーニング後にクラシファイアを保持する必要があります。つまり、上記のスニペットを使用して行うことができます。 clfオブジェクトの 'predict'メソッドは、再訓練を何度も繰り返して呼び出すことができます。それはあなたが望んでいるものなのですか?これについて心配している場合は、clf .__ dict__の値をチェックするだけで、変更されていないことがわかります。今度は係数を再設定したい場合は、clf .__ dict__は単にPython辞書であり、任意のキーに関連付けられた値を設定することができます。 – doug

+0

ダグ、ご返信ありがとうございます。はい、私の質問は、分類子を永続化する方法です。しかし、オグリエルは私の質問に答えました。あなたのお時間をありがとうございました! – CodeNoob

関連する問題