Python 3.x 相同数据和步骤的Scikit学习管道无法分类

Python 3.x 相同数据和步骤的Scikit学习管道无法分类,python-3.x,scikit-learn,pipeline,text-classification,sklearn-pandas,Python 3.x,Scikit Learn,Pipeline,Text Classification,Sklearn Pandas,我有从doc2vec算法创建的浮点向量,以及它们的标签。当我将它们与一个简单的分类器一起使用时,它工作正常,并给出了预期的准确度。工作代码如下: from sklearn.svm import LinearSVC import pandas as pd import numpy as np train_vecs #ndarray (20418,100) #train_vecs = [[0.3244, 0.3232, -0.5454, 1.4543, ...],...] y_train #lab

我有从doc2vec算法创建的浮点向量,以及它们的标签。当我将它们与一个简单的分类器一起使用时,它工作正常,并给出了预期的准确度。工作代码如下:

from sklearn.svm import LinearSVC
import pandas as pd
import numpy as np

train_vecs #ndarray (20418,100)
#train_vecs = [[0.3244, 0.3232, -0.5454, 1.4543, ...],...]
y_train #labels
test_vecs #ndarray (6885,100)
y_test #labels

classifier = LinearSVC()
classifier.fit(train_vecs, y_train )
print('Test Accuracy: %.2f'%classifier.score(test_vecs, y_test))
但是现在我想把它转移到一个管道中,因为将来我计划用不同的特性进行特性联合。我要做的是将向量移动到数据帧中,然后使用2个自定义转换器I)选择列,ii)更改数组类型。奇怪的是,完全相同的数据,具有完全相同的形状、数据类型和类型。。精度为0.0005。这对我来说毫无意义,它应该提供几乎相同的准确性。在ArrayCaster transformer之后,输入的形状和类型与之前完全相同。整件事真的令人沮丧

from sklearn.svm import LinearSVC
import pandas as pd
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.base import BaseEstimator, TransformerMixin

# transformer that picks a column from the dataframe
class ItemSelector(BaseEstimator, TransformerMixin):

    def __init__(self, column):
        self.column = column

    def fit(self, X, y=None, **fit_params):
        return self

    def transform(self, X):
        print('item selector type',type(X[self.column]))
        print('item selector shape',len(X[self.column]))
        print('item selector dtype',X[self.column].dtype)
        return (X[self.column])

# transformer that converts the series into an ndarray
class ArrayCaster(BaseEstimator, TransformerMixin):
    def fit(self, x, y=None):
        return self

    def transform(self, data):
        print('array caster type',type(np.array(data.tolist())))
        print('array caster shape',np.array(data.tolist()).shape)
        print('array caster dtype',np.array(data.tolist()).dtype)
        return np.array(data.tolist())


train_vecs #ndarray (20418,100)
y_train #labels
test_vecs #ndarray (6885,100)
y_test #labels

train['vecs'] = pd.Series(train_vecs.tolist())
val['vecs'] = pd.Series(test_vecs.tolist())


classifier = Pipeline([
            ('selector', ItemSelector(column='vecs')),
            ('array', ArrayCaster()),
            ('clf',LinearSVC())])

classifier.fit(train, y_train)
print('Test Accuracy: %.2f'%classifier.score(test, y_test))

好的,很抱歉。。我想出来了。这个错误很讨厌。我所要做的就是将它们转换为列表,并将它们放入数据帧中,而不是将它们转换为序列。 改变这个

train['vecs'] = pd.Series(train_vecs.tolist())
val['vecs'] = pd.Series(test_vecs.tolist())
进入:


好的,很抱歉。。我想出来了。这个错误很讨厌。我所要做的就是将它们转换为列表,并将它们放入数据帧中,而不是将它们转换为序列。 改变这个

train['vecs'] = pd.Series(train_vecs.tolist())
val['vecs'] = pd.Series(test_vecs.tolist())
进入: