HashingVectorizer 后输入形状错误 Sklearn 错误

Posted

技术标签:

【中文标题】HashingVectorizer 后输入形状错误 Sklearn 错误【英文标题】:Bad Input Shape Sklearn Error After HashingVectorizer 【发布时间】:2017-12-21 06:59:42 【问题描述】:

我有 204567 个单词,其中 21010 个是唯一的。每个单词都与一个唯一的标签相关联。总共有 46 个唯一标签。

我已经使用特征散列来映射使用HashingVectorizer() 的 204567 个单词。我对标签进行了 one-hot 编码,并使用Perceptron() 模型来解决这个多类分类问题。

from keras.utils import np_utils
from sklearn.feature_extraction.text import HashingVectorizer 
from sklearn.linear_model import Perceptron
from sklearn.preprocessing import LabelEncoder

vect = HashingVectorizer(decode_error='ignore', n_features=2**15,
                          preprocessor=None)
X = vect.transform(X_train)

encoder = LabelEncoder()
y = encoder.transform(y_train)
target = np_utils.to_categorical(y)

ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)
ppn.fit(X, target)

但是,我收到以下错误:ValueError: bad input shape (204567, 46)

有没有更好的方法来编码标签?

附:请解释错误和可能的解决方案

【问题讨论】:

在这里发布X.shapetarget.shape 的输出。 X.shape = (204567, 32768) 和 y.shape = (204567, 46) *y.shape 这里指的是target.shape 是否有特殊需要将 one-hot 编码标签转换回分类标签。您不能像在Perceptron.fit() 中一样使用它们吗? @VivekKumar 不,没有必要将它们改回来。我遇到的问题恰好在 perceptron.fit() 部分 【参考方案1】:

函数np_utils.to_categorical() 需要一个class vector 作为参数,你给了一个形状

查看文档:

to_categorical

to_categorical(y, num_classes=None)

将类向量(整数)转换为二进制类矩阵。

例如与 categorical_crossentropy 一起使用。

参数

y:要转换为矩阵的类向量(从 0 到 num_classes 的整数)。 num_classes:类的总数。 返回

输入的二进制矩阵表示。

所以

target = np_utils.to_categorical(y)

给你一个错误类型

【讨论】:

感谢您的帮助,但实际上并没有解决问题。如果有任何帮助,X 和目标的形状是 X.shape = (204567, 32768) 和 y.shape = (204567, 46) 哈希 XI 后得到 X 的形式为: (0, 29023) -1.0 (1, 26650) -1.0 (2, 11239) -1.0 (3, 75607) -1.0 (4, 104082) ) -1.0 (5, 174171) 1.0 (6, 219743) 1.0 (7, 39639) -1.0 (8, 220654) 1.0 (10, 110044) -1.0 (11, 59251) -1.0 (12, 162682) 1.0 (13) ,98868)-0.57735026919(13,161582)0.57735026919(13,225715)0.57735026919(13,225715)0.57735026919(14,24734)-1.0(15,17830)-1.0(16,148980)1.0(17,196525)1.0(18,50743)-1.0等等。你能帮我理解标签的含义吗 我将我的代码更改如下,现在可以正常工作: 请看看变化,欢迎您的见解【参考方案2】:

我将代码更改如下,现在它可以工作了:

from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.neural_network import MLPClassifier
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils
from numpy import array   

vec = HashingVectorizer(decode_error = 'ignore', n_features = 2**15)
X = vec.fit_transform(X_train) 

values = array(y_train)

label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(values)

encoded = np_utils.to_categorical(integer_encoded)
print(X.shape)
print(encoded.shape)

clf = MLPClassifier(activation = 'logistic', solver = 'adam', 
                    batch_size = 100, learning_rate = 'adaptive', 
                    max_iter = 20, random_state = 1, verbose = True )
clf.fit(X, encoded)
print('Accuracy: %.3f' %clf.score(X, encoded))

我将模型从感知器更改为多层感知器分类器,尽管我不完全确定它是如何工作的。欢迎解释。 现在我必须使用 n-gram 模型来解决同样的问题并比较结果。

【讨论】:

你好 Batspock。看,我认为这是一个新问题而不是答案。如果你在同一个问题中提出多个问题,很难看出主要问题。所以,请接受这个建议。你的第一个问题已经解决了,现在,一旦你有了第一个答案,就问一个新问题来告诉新问题(你也可以添加这个问题的链接)。因为这一切都很复杂。 好的,我会记住的。我是这个平台的新手,所以谢谢 没问题,很抱歉没有为您的新问题提供更多帮助

以上是关于HashingVectorizer 后输入形状错误 Sklearn 错误的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:预期的字符串或类似字节的对象 HashingVectorizer

不了解 sklearn 的 HashingVectorizer

scikit-learn - HashingVectorizer 上的 Tfidf

带有 HashingVectorizer 和 TfidfTransformer 的 SGDClassifier

Hashingvectorizer 和多项式朴素贝叶斯不能一起工作

Keras 功能 api 输入形状错误,lstm 层收到 2d 而不是 3d 形状