10

Scikit-Learn(sklearn)を使用して、1対すべてのロジスティック回帰分類器で遊んでいます。一度にすべてを実行するには遅すぎる大きなデータセットがあります。また、トレーニングが進むにつれて学習曲線を研究したいと思います。

バッチ勾配降下法を使用して、たとえば500サンプルのバッチで分類器をトレーニングしたいと思います。これを行うためにsklearnを使用する方法はありますか、それともsklearnを放棄して「自分でロール」する必要がありますか?

これは私がこれまでに持っているものです:

from sklearn.linear_model import LogisticRegression
from sklearn.multiclass import OneVsRestClassifier

# xs are subsets of my training data, ys are ground truth for same; I have more 
# data available for further training and cross-validation:
xs.shape, ys.shape
# => ((500, 784), (500))
lr = OneVsRestClassifier(LogisticRegression())
lr.fit(xs, ys)
lr.predict(xs[0,:])
# => [ 1.]
ys[0]
# => 1.0

つまり、トレーニングサンプルを正しく識別します(はい、新しいデータで評価する方がよいと思います。これは簡単なスモークテストです)。

バッチ勾配降下法について:学習曲線を作成するまでには至っていませんfitが、トレーニングデータの後続のサブセットで繰り返し実行することはできますか?または、バッチでトレーニングする他の機能はありますか?ドキュメントとグーグルはこの問題についてかなり沈黙している。ありがとう!

4

1 に答える 1

25

必要なのは、バッチ勾配降下法ではなく、確率的勾配降下法です。バッチ学習とは、トレーニングセット全体を一度に学習することを意味しますが、あなたが説明することは、適切にはミニバッチ学習と呼ばれます。これはで実装されsklearn.linear_model.SGDClassifierており、オプションを指定するとロジスティック回帰モデルに適合しますloss="log"

を使用SGDClassifierすると、と同様にLogisticRegression、推定量を-でラップする必要はありませOneVsRestClassifierん。どちらも、箱から出して1対すべてのトレーニングを実行します。

# you'll have to set a few other options to get good estimates,
# in particular n_iterations, but this should get you going
lr = SGDClassifier(loss="log")

次に、ミニバッチでトレーニングするには、のpartial_fit代わりにメソッドを使用しfitます。すべてのクラスが各ミニバッチに存在するわけではないため、最初はクラスのリストをフィードする必要があります。

import numpy as np
classes = np.unique(["ham", "spam", "eggs"])

for xs, ys in minibatches:
    lr.partial_fit(xs, ys, classes=classes)

(ここでは、classesミニバッチごとにパスします。これは必須ではありませんが、どちらも害はなく、コードが短くなります。)

于 2013-02-23T11:32:37.110 に答える