Mit*_*ril 14 python classification scikit-learn text-classification
我有一个csv,struct is
CAT1,CAT2,TITLE,URL,CONTENT,CAT1,CAT2,TITLE,CONTENT都是中文的.
我想要火车LinearSVC或MultinomialNBX(TITLE)和功能(CAT1,CAT2),都会得到这个错误.下面是我的代码:
PS:我通过这个例子scikit-learn text_analytics在下面写代码
import numpy as np
import csv
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline
label_list = []
def label_map_target(label):
''' map chinese feature name to integer '''
try:
idx = label_list.index(label)
except ValueError:
idx = len(label_list)
label_list.append(label)
return idx
c1_list = []
c2_list = []
title_list = []
with open(csv_file, 'r') as f:
# row_from_csv is for shorting this example
for row in row_from_csv(f):
c1_list.append(label_map_target(row[0])
c2_list.append(label_map_target(row[1])
title_list.append(row[2])
data = np.array(title_list)
target = np.array([c1_list, c2_list])
print target.shape
# (2, 4405)
target = target.reshape(4405,2)
print target.shape
# (4405, 2)
docs_train, docs_test, y_train, y_test = train_test_split(
data, target, test_size=0.25, random_state=None)
# vect = TfidfVectorizer(tokenizer=jieba_tokenizer, min_df=3, max_df=0.95)
# use custom chinese tokenizer get same error
vect = TfidfVectorizer(min_df=3, max_df=0.95)
docs_train= vect.fit_transform(docs_train)
clf = LinearSVC()
clf.fit(docs_train, y_train)
Run Code Online (Sandbox Code Playgroud)
错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-24-904eb9af02cd> in <module>()
1 clf = LinearSVC()
----> 2 clf.fit(docs_train, y_train)
C:\Python27\lib\site-packages\sklearn\svm\classes.pyc in fit(self, X, y)
198
199 X, y = check_X_y(X, y, accept_sparse='csr',
--> 200 dtype=np.float64, order="C")
201 self.classes_ = np.unique(y)
202
C:\Python27\lib\site-packages\sklearn\utils\validation.pyc in check_X_y(X, y, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric)
447 dtype=None)
448 else:
--> 449 y = column_or_1d(y, warn=True)
450 _assert_all_finite(y)
451 if y_numeric and y.dtype.kind == 'O':
C:\Python27\lib\site-packages\sklearn\utils\validation.pyc in column_or_1d(y, warn)
483 return np.ravel(y)
484
--> 485 raise ValueError("bad input shape {0}".format(shape))
486
487
ValueError: bad input shape (3303, 2)
Run Code Online (Sandbox Code Playgroud)
Mit*_*ril 10
感谢@meelo,我解决了这个问题.正如他所说,在我的代码中,data是特征向量,target是目标值.我混淆了两件事.
我向[数据,特征]学习了TfidfVectorizer过程数据,每个数据应该只映射到一个目标.
如果我想预测两种类型的目标.我需要两个不同的目标:
TfidfVectorizer 具有所有C1值target_C1 具有所有C2值.然后使用两个目标和原始数据为每个目标训练两个分类器.
小智 6
我遇到过同样的问题。
因此,如果您遇到相同的问题,则应检查clf.fit(X,y)参数的形状:
X:训练向量{类似数组,稀疏矩阵},形状(n_samples,n_features)。
y:相对于类似X数组形状的目标矢量(n_samples,)。
如您所见,y宽度应为1,以确保目标矢量的形状正确。try命令
y.shape
Run Code Online (Sandbox Code Playgroud)
应该是(n_samples,)
在我的情况下,对于我的训练向量,我将来自3个不同矢量化器的3个单独的向量串联起来,将全部用作我的最终训练向量。问题在于每个向量都['Label']在其中包含列,因此最终的训练向量包含3 ['Label']列。然后,当我将其final_trainingVect['Label']用作目标向量时,其形状为n_samples,3)。