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.shape
和target.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