使用SGD分类器部分拟合方法的增量/在线学习

2024-09-29 23:26:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经建立了一个增量学习模型,但不确定它是对还是错我有2个训练数据第一个由20000行组成,第二个由10000行组成,它们都有两列描述和id……如果离线学习,我的模型运行良好,它正在为给定的描述分类正确的id。。 数据文件培训是第一个培训数据 datafile_train1是第二个训练数据 我正在使用SGD分类器和部分拟合方法进行增量

1)计数矢量器、tfidf和部分拟合

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']))

在这之后,我酸洗分类器,并再次取消拾取,以使用在下一部分适合增量学习

2)分级机酸洗、脱粘

^{pr2}$

3)Countvectorizer、tfidf和partial_同样适用于新数据

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大小),当我为第二次部分拟合pickle训练文件时,它也只显示了5 MB的大小,它应该得到更新,因为我am在以前训练过的数据上训练新数据 这是实现增量/在线学习的正确方法吗?? 请帮助我是新的机器学习,所以它将是好的,如果你解释使用代码

这个错误被抛出

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()

现在我正在使用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.2mb,但是第二个pickle的大小应该大于第一个pickle的大小,因为我在新数据上使用第一个经过训练的模型


Tags: 数据模型idtransformtrainpartiallocpickle
1条回答
网友
1楼 · 发布于 2024-09-29 23:26:26

我不认为节省的模型大小应该增加太多或根本没有。在

模型不存储发送到partial_fit()的全部新数据,只根据该数据更新其属性。这些属性一旦根据它们的类型(float32, float64等)分配了一些存储空间,那么不管它们的值是多少,它们都将占用大量空间。在

在SGD分类器中会改变的显著属性是:-在

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等)。在

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

相关问题 更多 >

    热门问题