3

我正在尝试在大量数据上训练我的二元分类器。以前,我可以通过使用 sklearn 的 fit 方法完成训练。但是现在,我有更多的数据,我无法处理它们。我正在尝试部分安装它们,但无法摆脱错误。如何增量训练我的海量数据?通过应用我以前的方法,我收到有关管道对象的错误。我已经浏览了增量学习中的示例,但仍然运行这些代码示例会出错。我将不胜感激。

X,y = transform_to_dataset(training_data)

clf = Pipeline([
    ('vectorizer', DictVectorizer()),
    ('classifier', LogisticRegression())])

length=len(X)/2

clf.partial_fit(X[:length],y[:length],classes=np.array([0,1]))

clf.partial_fit(X[length:],y[length:],classes=np.array([0,1]))

错误

AttributeError: 'Pipeline' object has no attribute 'partial_fit'

尝试给定的代码示例:

clf=SGDClassifier(alpha=.0001, loss='log', penalty='l2', n_jobs=-1,
                      #shuffle=True, n_iter=10, 
                      verbose=1)
length=len(X)/2

clf.partial_fit(X[:length],y[:length],classes=np.array([0,1]))

clf.partial_fit(X[length:],y[length:],classes=np.array([0,1]))

错误

File "/home/kntgu/anaconda2/lib/python2.7/site-packages/sklearn/utils/validation.py", line 573, in check_X_y
ensure_min_features, warn_on_dtype, estimator)
File "/home/kntgu/anaconda2/lib/python2.7/site-packages/sklearn/utils/validation.py", line 433, in check_array
array = np.array(array, dtype=dtype, order=order, copy=copy)
TypeError: float() argument must be a string or a number

我的数据集由一些带有词性标签和依赖关系的句子组成。

Thanks  NN  0   root
to  IN  3   case
all DT  1   nmod
who WP  5   nsubj
volunteered VBD 3   acl:relcl
.   .   1   punct

You PRP 3   nsubj
will    MD  3   aux
remain  VB  0   root
as  IN  5   case
alternates  NNS 3   obl
.   .   3   punct
4

3 回答 3

4

来自 scikit-learn的Pipeline对象没有partial_fit,如docs中所示。

这样做的原因是您可以将任何您想要的估算器添加到该Pipeline对象,但并非所有估算器都实现了partial_fit. 这是支持的估算器列表

如您所见,使用SGDClassifier(without Pipeline),您不会收到此“无属性”错误,因为支持此特定估算器。您收到的错误消息可能是由于文本数据。您可以使用LabelEncoder处理非数字列。

于 2018-05-10T08:55:59.900 回答
1

我遇到了与SGDClassifier管道内部不支持增量学习(即partial_fit 参数)相同的问题。有一种方法可以使用 sklearn 进行增量学习,但不是 with partial_fit,而是 with warm_startLogisticRegressionsklearn中有两种算法RandomForest支持warm_start。

热启动是增量学习的另一种方式。在这里阅读

于 2018-09-25T08:44:51.930 回答
0

管道没有属性 partial_fit,因为有许多没有 partial_fit 的模型可以分配给管道。我对此的解决方案是制作字典而不是管道并将其保存为 joblib。

from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()

from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer()

from sklearn.linear_model import SGDClassifier
model=SGDClassifier(loss='hinge', penalty='l2',alpha=1e-3, random_state=42)

tosave={
    "model":model,
    "count":count_vect,
    "tfid":tfidf_transformer,
}

import joblib
filename = 'package.sav'
joblib.dump(tosave, filename)

然后使用

import joblib
filename = 'package.sav'
pack=joblib.load(filename)

pack['model'].partial_fit(X,Y)

于 2020-02-04T11:49:27.057 回答