【发布时间】:2018-01-18 22:00:06
【问题描述】:
我有从 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) 更改数组类型。奇怪的是,完全相同的数据,具有完全相同的形状、dtype 和类型.. 给出了 0.0005 的精度。这对我来说根本没有意义,它应该提供几乎相同的准确性。在 ArrayCaster 转换器之后,输入的形状和类型与之前完全相同。整个事情真的很令人沮丧。
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))
【问题讨论】:
标签: python-3.x scikit-learn pipeline text-classification sklearn-pandas