Incremental/online 使用 SGDClassifier partial_fit 方法学习
Incremental/online learning using SGDClassifier partial_fit method
我已经建立了一个增量学习模型,但不确定它是对还是错我有 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']))
在此之后我腌制了分类器并再次取消腌制以在下一个partial_fit中用于增量学习
2) 分类器的pickling和unpickling
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 大小,它应该得到更新,因为我正在用以前训练过的数据训练新数据
这是实现 incremental/online 学习的正确方法吗??
请帮助我是机器学习的新手所以如果你使用代码解释会很好
并抛出此错误
ValueError: Number of features 125897 does not match previous data 124454.
****编辑(使用 Hashingvectorizer)
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()
现在我正在为下一个 partial_fit
使用 clfp 训练模型
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
等)分配了一些存储 space,无论它们的值如何,都会占用那么多 space。
将在 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()
,这些值就会根据数据更新,以尽量减少损失预测。
当您传递新数据时,这些值会再次更新,但它们仍占用与其类型指定的相同存储空间 space(float32, float64
等)。
这就是保存的模型没有更改尺寸的原因。
我已经建立了一个增量学习模型,但不确定它是对还是错我有 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']))
在此之后我腌制了分类器并再次取消腌制以在下一个partial_fit中用于增量学习
2) 分类器的pickling和unpickling
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 大小,它应该得到更新,因为我正在用以前训练过的数据训练新数据 这是实现 incremental/online 学习的正确方法吗?? 请帮助我是机器学习的新手所以如果你使用代码解释会很好
并抛出此错误
ValueError: Number of features 125897 does not match previous data 124454.
****编辑(使用 Hashingvectorizer)
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()
现在我正在为下一个 partial_fit
使用 clfp 训练模型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
等)分配了一些存储 space,无论它们的值如何,都会占用那么多 space。
将在 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()
,这些值就会根据数据更新,以尽量减少损失预测。
当您传递新数据时,这些值会再次更新,但它们仍占用与其类型指定的相同存储空间 space(float32, float64
等)。
这就是保存的模型没有更改尺寸的原因。