【问题标题】:Bad input shape () in multi-class classification多类分类中的错误输入形状()
【发布时间】:2015-06-26 22:52:04
【问题描述】:

我正在使用 sci-kit learn 执行多类分类任务。在我创建的设置中,我想比较不同的分类算法。

我使用管道,其中文本作为 X 插入,Y 是类(多类,N = 5)。使用 TfidfVectorizer() 在管道中提取文本特征。

KNN 完成了这项工作,但其他分类器给出了这个:ValueError: bad input shape (670, 5)

完整的追溯:

"/Users/Robbert/pipeline.py", line 62, in <module>
train_pipeline.fit(X_train, Y_train)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/pipeline.py", line 130, in fit
self.steps[-1][-1].fit(Xt, y, **fit_params)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/svm/base.py", line 138, in fit
y = self._validate_targets(y)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/svm/base.py", line 441, in _validate_targets
y_ = column_or_1d(y, warn=True)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/utils/validation.py", line 319, in column_or_1d
raise ValueError("bad input shape {0}".format(shape))
ValueError: bad input shape (670, 5)

我使用的代码:

def read_data(f):
data = []
for row in csv.reader(open(f), delimiter=';'):
    if row:
        plottext = row[8]
        target = { 'Age': row[4] }
        data.append((plottext, target))
(X, Ycat) = zip(*data) 
Y = DictVectorizer().fit_transform(Ycat)
Y = preprocessing.LabelBinarizer().fit_transform(Y)
return (X, Y)

X, Y = read_data('development2.csv')

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.33, random_state=42)

###KNN Pipeline
#train_pipeline = Pipeline([
#    ('vect', TfidfVectorizer(ngram_range=(1, 3), min_df=1)),
#    ('clf', KNeighborsClassifier(n_neighbors=350, weights='uniform'))])

###Logistic regression Pipeline
#train_pipeline = Pipeline([
#    ('vect', TfidfVectorizer(ngram_range=(1, 3), min_df=1)),
#    ('clf', LogisticRegression())])

##SVC
train_pipeline = Pipeline([
('vect', TfidfVectorizer(ngram_range=(1, 3), min_df=1)),
('clf', SVC(C=1, kernel='rbf', gamma=0.001, probability=True))])

##Decision tree
#train_pipeline = Pipeline([
#    ('vect', TfidfVectorizer(ngram_range=(1, 3), min_df=1)),   
#    ('clf', DecisionTreeClassifier(random_state=0))])

train_pipeline.fit(X_train, Y_train)

predicted = train_pipeline.predict(X_test)

print accuracy_score(Y_test, predicted)

KNN 怎么可能接受数组的形状而其他分类器不接受?以及如何改变这个形状?

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    如果您比较 KNeighborsClassifierSVC 中 fit(X, y) 函数的文档,您会发现只有前者接受 [n_samples, n_outputs] 形式的 y。

    可能的解决方案:您为什么需要 LabelBinarizer?只是不要使用它。

    【讨论】:

    • 我尝试在没有二值化的情况下输入标签,并且:ValueError:您似乎正在使用旧的多标签数据表示。不再支持序列序列;改用二进制数组或稀疏矩阵 - MultiLabelBinarizer 转换器可以转换为这种格式。
    【解决方案2】:

    如果您的 Y 向量的大小为 (n_samples, n_classes) 并且至少包含一个具有多个非零元素的单行,那么您正在解决多标签分类问题。如果是这种情况,scikit-learn 文档中的multiclass and multilabel 算法页面将 KNN 列为支持多标签分类的分类器之一。您可能想尝试该列表中的其他分类器

    * sklearn.tree.DecisionTreeClassifier
    * sklearn.tree.ExtraTreeClassifier
    * sklearn.ensemble.ExtraTreesClassifier
    * sklearn.neural_network.MLPClassifier
    * sklearn.neighbors.RadiusNeighborsClassifier
    * sklearn.ensemble.RandomForestClassifier
    * sklearn.linear_model.RidgeClassifierCV
    

    【讨论】:

      猜你喜欢
      • 2020-06-12
      • 2013-12-18
      • 2018-02-12
      • 2020-05-25
      • 2019-05-27
      • 2015-07-02
      • 2020-10-10
      • 1970-01-01
      • 2021-11-25
      相关资源
      最近更新 更多