0

sklearn pythonで既存の機械学習モデルを再学習するにはどうすればよいですか?新しいデータでsklearnのロジスティック回帰モデルを再学習する方法

私はモデルを訓練し、.pklファイルとしてpickleを使用してダンプした数千のレコードを使用しています。 ロジスティック回帰オブジェクトを作成するときに初めてモデルをトレーニングするときに、warmStart = Trueパラメータを使用しました。

サンプルコード:

log_regression_model = linear_model.LogisticRegression(warm_start = True) 
log_regression_model.fit(X, Y) 
# Saved this model as .pkl file on filesystem like pickle.dump(model,open('model.pkl', wb)) 

私は毎日取得する新しいデータを日付にこれを維持したいです。私は、ファイルシステムからそれをロードすることによって、モデルを再教育するとき、

#open the model from filesystem 
log_regression_model = pickle.load(open('model.pkl','rb')) 
log_regression_model.fit(X, Y) # New X, Y here is data of last 24 hours only. Few hundreds records only. 

しかし:私は既存のモデルファイルを開くと、過去24時間の新しいデータを取得し、

サンプルコードagain./それを訓練していますそのために レコードで作成された既存のモデルを消去して、新しいレコードを作成すると思われます。数百過去24時間のレコード(ファイルシステムでは3000レコードのモデルは3MBのサイズです。わずか67KB)

私はwarmStartオプションを使用しようとしました。 LogisticRegressionモデルを再トレーニングするにはどうすればよいですか?

+0

質問:あなたが元に新しいデータを追加し、データセット全体に再教育することはできませんか?補足として、私は次のリンクをチェックします:http://scikit-learn.org/stable/modules/scaling_strategies.html。次に、ニューラルネットワークで頻繁に使用されるミニバッチ戦略(自分で勾配降下を実装する必要があります)を考慮しますが、ロジスティック回帰は非常に簡単です(https://udata.science/2017/08/31/を参照)。 python-by-logistic-regression-from-scratch /)を使用します。しかし、この戦略では、データセット全体でいくつかのパスを実行する必要があります... – Umberto

+0

データが巨大で、現在のリソースがあるため、新しい古いデータでモデルを再トレーニングするのは効率的ではありません。モデル、 –

答えて

0

LogicsticRegressionオブジェクトのサイズは、それを訓練するためにいくつのサンプルが使用されているかには関係ありません。

1230 
1233 

from sklearn.linear_model import LogisticRegression 
import pickle 
import sys 

np.random.seed(0) 
X, y = np.random.randn(100000, 1), np.random.randint(2, size=(100000,)) 
log_regression_model = LogisticRegression(warm_start=True) 
log_regression_model.fit(X, y) 
print(sys.getsizeof(pickle.dumps(log_regression_model))) 

np.random.seed(0) 
X, y = np.random.randn(100, 1), np.random.randint(2, size=(100,)) 
log_regression_model = LogisticRegression(warm_start=True) 
log_regression_model.fit(X, y) 
print(sys.getsizeof(pickle.dumps(log_regression_model))) 

結果が間違ったモデルオブジェクトを保存することがあります。 log_regression_modelを保存していることを確認してください。 「モデルで

pickle.dump(log_regression_model, open('model.pkl', 'wb')) 

ので、異なるサイズ、およびLogisticRegressionオブジェクトは学習サンプルの異なる数とそのサイズを変更しないという事実は、それが保存されたモデルを生成するために使用されている別のコードのように見え、この新しいです再訓練された "モデル。

warm_startはここに何もしていないように、それはまた見え、言ったことすべて:

np.random.seed(0) 
X, y = np.random.randn(200, 1), np.random.randint(2, size=(200,)) 

log_regression_model = LogisticRegression(warm_start=True) 
log_regression_model.fit(X[:100], y[:100]) 
print(log_regression_model.intercept_, log_regression_model.coef_) 

log_regression_model.fit(X[100:], y[100:]) 
print(log_regression_model.intercept_, log_regression_model.coef_) 

log_regression_model = LogisticRegression(warm_start=False) 
log_regression_model.fit(X[100:], y[100:]) 
print(log_regression_model.intercept_, log_regression_model.coef_) 

log_regression_model = LogisticRegression(warm_start=False) 
log_regression_model.fit(X, y) 
print(log_regression_model.intercept_, log_regression_model.coef_) 

が与える:

this other questionに基づいて
(array([ 0.01846266]), array([[-0.32172516]])) 
(array([ 0.17253402]), array([[ 0.33734497]])) 
(array([ 0.17253402]), array([[ 0.33734497]])) 
(array([ 0.09707612]), array([[ 0.01501025]])) 

あなたが別のソルバーを使用する場合、warm_startは、いくつかの効果があります(例:LogisticRegression(warm_start=True, solver='sag'))、新しいデータが追加されたデータセット全体の再トレーニングと同じではありません。例えば、上記の4つの出力は次のようになります。

(array([ 0.01915884]), array([[-0.32176053]])) 
(array([ 0.17973458]), array([[ 0.33708208]])) 
(array([ 0.17968324]), array([[ 0.33707362]])) 
(array([ 0.09903978]), array([[ 0.01488605]])) 

あなたは中央の2本のラインが異なっている見るが、非常に異なることができません。新しいモデルで新しいモデルを再学習するための出発点として、最後のモデルのパラメータを使用するだけです。あなたがやりたいことは、データを保存し、データを追加するたびに古いデータと新しいデータを組み合わせて再編成することです。

0

あなたは基本的に以前のすべての情報を破棄訓練されたモデルにfitを使用しています。

Scikit-learnには、インクリメンタルトレーニングに使用できるpartial_fitメソッドを持つモデルがあります(in documentation)。

それはsklearnにロジスティック回帰を再教育することができます場合、私は覚えていないが、sklearnはloss=logで確率的勾配降下最適化ロジスティック回帰を実行し、それがpartial_fitメソッドを持っているSGDClassifierを持っています。

関連する問題