gpt4 book ai didi

python - 使用SGDClassifier的partial_fit方法进行增量/在线学习

转载 作者:行者123 更新时间:2023-11-30 09:50:11 27 4
gpt4 key购买 nike

我已经建立了一个增量学习模型,但不确定它是对还是错,我有2个训练数据,第一个包含20000行,第二个包含10000行,它们都有两列描述和id......在离线学习的情况下我的模型工作正常,它正在对给定描述的正确 ID 进行分类。datafile_train 是第一个训练数据datafile_train1 是第二个训练数据我正在使用 SGDClassifier 和partial_fit 方法进行增量

1) Countvectorizer、tfidf 和partial_fit

vectorizer = CountVectorizer()
tfidf_transformer = TfidfTransformer()
X_train = vectorizer.fit_transform(datafile_train.loc[:,'description'])
X_train_tfidf = tfidf_transformer.fit_transform(X_train)
clf = linear_model.SGDClassifier(penalty='l2',loss='hinge')
prd=clf.partial_fit(X_train_tfidf, datafile_train.loc[:,'taxonomy_id'],classes=np.unique(datafile_train.loc[:,'taxonomy_id']))

在此之后,我对分类器进行了pickle,并再次unpickled以在下一个partial_fit中用于增量学习

2)分级机的酸洗和脱酸

def store(prd):
import pickle
filename = "incremental"
f = open(filename, 'wb')
pickle.dump(prd, f)
f.close()
store(prd)

def train_data():
import pickle
f = open('incremental', 'rb')
classifier = pickle.load(f)
f.close()
return classifier
clfp=train_data()

3) 再次对新数据进行Countvectorizer、tfidf 和partial_fit

vectorizer = CountVectorizer()
tfidf_transformer = TfidfTransformer()
X_train1 = vectorizer.fit_transform(datafile_train1.loc[:,'description'])
X_train_tfidf1 = tfidf_transformer.fit_transform(X_train1)
prd1=clfp.partial_fit(X_train_tfidf1, datafile_train1.loc[:,'taxonomy_id'])
# here clfp is previously trained data which is unpickled

我已经构建了这样的模型,但是当我检查 pickle 文件的大小(第一个训练数据)时,它是 5 MB,当我使用这个模型来训练新数据时,正如您在第二个部分拟合中看到的那样,我使用了 clfp(5 MB 大小)在训练新数据后,当我为第二个partial_fit 挑选训练文件时,它也仅显示 5 MB 大小,它应该得到更新,因为我正在基于先前训练的数据训练新数据这是实现增量/在线学习的正确方法吗?请帮助我是机器学习的新手,所以如果你用代码解释一下会很好

并且抛出这个错误

ValueError: Number of features 125897 does not match previous data 124454.

****编辑(使用哈希向量化器)

hashing = HashingVectorizer()
X_train_hashing=hashing.fit_transform(datafile_train.loc[:,'description'])
clf = linear_model.SGDClassifier(penalty='l2',loss='hinge')
prd=clf.partial_fit(X_train_hashing, datafile_train.loc[:,'taxonomy_id'],classes=np.unique(datafile_train.loc[:,'taxonomy_id']))
def store(prd):
import pickle
filename = "inc"
f = open(filename, 'wb')
pickle.dump(prd, f)
f.close()
store(prd)
def train_data():
import pickle
f = open('inc', 'rb')
classifier = pickle.load(f)
f.close()
return classifier
clfp=train_data()

现在我正在使用 clfp 训练模型进行下一个partial_fit

X_train_hashing1=hashing.transform(datafile_train1.loc[:,'description'])
prd1=clfp.partial_fit(X_train_hashing1, datafile_train1.loc[:,'taxonomy_id'])
def store(prd1):
import pickle
timestr = time.strftime("%Y%m%d-%H%M%S")
filename = "Train-" + timestr +".pickle"
f = open(filename, 'wb')
pickle.dump(prd1, f)
f.close()
store(prd1)

在此编辑中,它没有给出任何错误,但两个 pickle 文件的大小相同 25.2 MB,但第二个 pickle 大小应该大于第一个 pickle 大小,因为我正在新数据上使用第一个训练模型

最佳答案

我认为保存的模型大小不应增加太多,甚至根本不应该增加。

模型不会存储发送到 partial_fit() 的全部新数据,仅根据该数据更新其属性。这些属性一旦根据其类型(float32、float64 等)分配了一些存储空间,无论其值如何,都将占用这么多空间。

SGDClassifier 中将发生变化的显着属性是:-

coef_ : array, shape (1, n_features) if n_classes == 2 else (n_classes, n_features) Weights assigned to the features.

intercept_ : array, shape (1,) if n_classes == 2 else (n_classes,) Constants in decision function.

因此,当您初始化模型时,它们要么未分配,要么全部初始化为 0。将第一个数据传递给 partial_fit() 后,这些值将根据尝试最小化的数据进行更新预测的损失。

当您传递新数据时,这些值会再次更新,但它们仍然占用与其类型指定的相同存储空间(float32、float64 等)。

这就是保存的模型尺寸没有改变的原因。

关于python - 使用SGDClassifier的partial_fit方法进行增量/在线学习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46665694/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com