【问题标题】:Multiclass classification going wrong with Python Scikit-learnPython Scikit-learn 的多类分类出错
【发布时间】:2014-03-13 21:16:21
【问题描述】:

我正在尝试对 Scikit-learn 中可用的分类器进行一些比较。 根据this page,除了 svm 之外,所有分类器都应该工作。

这个操作的实现如下:

clf['bayes'] = OneVsRestClassifier(MultinomialNB(
clf['lda'] = OneVsRestClassifier(LDA())
clf['decision tree'] = OneVsRestClassifier(DecisionTreeClassifier())
clf['rdc'] = OneVsRestClassifier(RandomForestClassifier())
y_supposes = {}
precision = {}
for classifier in clf:
    clf[classifier].fit(x_train, y_train)
    y_supposes[classifier] = clf[classifier].predict(x_test)
    precision[classifier] = calcul_precision(y_supposes[classifier], y_test)

问题是,唯一有效的分类器是bayesclassifier。

当我尝试调用classifier['rdc'].fit(x_train, y_train) 时,另一个给我这个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\sklearn\multiclass.py", line 201, in fit
    n_jobs=self.n_jobs)
  File "C:\Python27\lib\site-packages\sklearn\multiclass.py", line 92, in fit_ov
r
    for i in range(Y.shape[1]))
  File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", lin
e 517, in __call__
    self.dispatch(function, args, kwargs)
  File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", lin
e 312, in dispatch
    job = ImmediateApply(func, args, kwargs)
  File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", lin
e 136, in __init__
    self.results = func(*args, **kwargs)
  File "C:\Python27\lib\site-packages\sklearn\multiclass.py", line 61, in _fit_b
inary
    estimator.fit(X, y)
  File "C:\Python27\lib\site-packages\sklearn\ensemble\forest.py", line 257, in
fit
    check_ccontiguous=True)
  File "C:\Python27\lib\site-packages\sklearn\utils\validation.py", line 220, in
 check_arrays
    raise TypeError('A sparse matrix was passed, but dense '
TypeError: A sparse matrix was passed, but dense data is required. Use X.toarray
() to convert to a dense numpy array.

我想补充一点,clf['rdc'].fit(x_train.toarray, y_train)(如错误消息中所示)也给了我一个错误。

你能帮我找出我跳过的步骤吗?

编辑:新发展

我认为问题可能来自x_train 的类型。我计算如下:

x = [{f1 : a, ... fn : jo}, ..., {f3 : 5}]
y_train = [('label1', ), ..., ('labelZ', 'label72')]
x_train = DictVectorizer.fit_transform(x)

type(x_train) ==  <class 'scipy.sparse.csr.csr_matrix'>

我也尝试过这种方法:MultinomialNB.fit(np.array(x), np.array(y)) 这给了我一个新的错误消息:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\sklearn\naive_bayes.py", line 308, in fit
X = X.astype(np.float)
TypeError: float() argument must be a string or a number

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    正如错误消息非常清楚地表明的那样,您将稀疏矩阵传递给不支持这些矩阵的估计器。在您测试的四个分类器中,只有 MultinomialNB 支持稀疏矩阵输入。对于决策树和随机森林,稀疏矩阵支持正在进行中。

    至于np.array(x),这并没有你认为的那样。要将稀疏矩阵转换为密集数组,请使用x.toarray(),或将sparse=False 传递给DictVectorizer 构造函数。

    【讨论】:

      猜你喜欢
      • 2018-07-03
      • 2016-10-17
      • 2015-03-21
      • 2016-05-25
      • 2018-01-27
      • 2013-07-04
      • 2012-05-18
      • 1970-01-01
      相关资源
      最近更新 更多