【问题标题】:unorderable types: str() < int() [closed]不可排序的类型:str() < int() [关闭]
【发布时间】:2017-05-08 14:52:23
【问题描述】:

我正在使用 pandas、numpy 和 sklearn 设计一个基本的垃圾邮件分类器程序 (python 3),但我收到此错误并且无法确定在哪里。我试图查看不同变量的数据类型,但没有找到位置。 (火腿 = 不是垃圾邮件)。输入文件与此错误无关,因为它与 python 2.7 一起使用 它的包/模块兼容性或数据类型转换错误。

import os
import io
import numpy
from pandas import DataFrame
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB

def readFiles(path):
    for root, dirnames, filenames in os.walk(path):
        for filename in filenames:
            path = os.path.join(root, filename)

            inBody = False
            lines = []
            f = io.open(path, 'r', encoding='latin1')
            for line in f:
                if inBody:
                    lines.append(line)
                elif line == '\n':
                    inBody = True
            f.close()
            message = '\n'.join(lines)
            yield path, message


def dataFrameFromDirectory(path, classification):
    rows = []
    index = []
    for filename, message in readFiles(path):
        rows.append({'message': message, 'class': classification})
        index.append(filename)

    return DataFrame(rows, index=index)

data = DataFrame({'message': [], 'class': []})

data = data.append(dataFrameFromDirectory('D:/emails/spam', 'spam'))
data = data.append(dataFrameFromDirectory('D:/emails/ham', 'ham'))

来自 ipython NoteBook 的堆栈跟踪:

TypeError                                 Traceback (most recent call last)
<ipython-input-5-555887356cc2> in <module>()
      3 import numpy
      4 from pandas import DataFrame
----> 5 from sklearn.feature_extraction.text import CountVectorizer
      6 from sklearn.naive_bayes import MultinomialNB
      7 

c:\users\administrator\appdata\local\programs\python\python35-32\lib\site-packages\sklearn\__init__.py in <module>()
     55 else:
     56     from . import __check_build
---> 57     from .base import clone
     58     __check_build  # avoid flakes unused variable error
     59 

c:\users\administrator\appdata\local\programs\python\python35-32\lib\site-packages\sklearn\base.py in <module>()
     10 from scipy import sparse
     11 from .externals import six
---> 12 from .utils.fixes import signature
     13 from .utils.deprecation import deprecated
     14 from .exceptions import ChangedBehaviorWarning as _ChangedBehaviorWarning

c:\users\administrator\appdata\local\programs\python\python35-32\lib\site-packages\sklearn\utils\__init__.py in <module>()
      9 
     10 from .murmurhash import murmurhash3_32
---> 11 from .validation import (as_float_array,
     12                          assert_all_finite,
     13                          check_random_state, column_or_1d, check_array,

c:\users\administrator\appdata\local\programs\python\python35-32\lib\site-packages\sklearn\utils\validation.py in <module>()
     16 
     17 from ..externals import six
---> 18 from ..utils.fixes import signature
     19 from .deprecation import deprecated
     20 from ..exceptions import DataConversionWarning as _DataConversionWarning

c:\users\administrator\appdata\local\programs\python\python35-32\lib\site-packages\sklearn\utils\fixes.py in <module>()
    404 
    405 
--> 406 if np_version < (1, 12, 0):
    407     class MaskedArray(np.ma.MaskedArray):
    408         # Before numpy 1.12, np.ma.MaskedArray object is not picklable

TypeError: unorderable types: str() < int()

【问题讨论】:

  • 你应该发布你得到的完整错误。
  • 发布堆栈跟踪。
  • 尝试设计一个minimal reproducible example。我们也没有您的数据文件,因此我们无法运行您的代码来重现您的错误。
  • 如果您是 python 新手,您应该在使用高级框架(如 sklearn)之前学习该语言的基础知识。这可能有助于调试错误。
  • 我怀疑包版本不匹配。某些东西,可能是 numpyscipysklearn 和/或 pandas 预期的要旧。错误在 sklearn 导入中,而不是在您自己的代码中。

标签: python-3.x pandas numpy


【解决方案1】:

我收集的版本 - 相对较新,但不是最先进的:

In [509]: import sklearn
In [510]: sklearn.__version__
Out[510]: '0.17'
In [511]: np.__version__
Out[511]: '1.11.2'
In [512]: sklearn.utils.fixes._parse_version(np.__version__)
Out[512]: (1, 11, 2)
In [513]: sklearn.utils.fixes._parse_version(np.__version__)<(1,12,0)
Out[513]: True

最后一步是将一个从np.__version__ 字符串派生的元组与另一个进行比较。

我建议尽可能导入和打印:

np.__version__
scipy.__version__
sys.version
scklearn.__version__

在 Andras 链接之后,问题在于 numpy 版本号。如果 numpy 是一个新的 beta 版本,版本号的0b1 部分会给出这个测试问题。

In [517]: sklearn.utils.fixes._parse_version('1.12.0b1')<(1,12,0)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-517-a2d159f6d08a> in <module>()
----> 1 sklearn.utils.fixes._parse_version('1.12.0b1')<(1,12,0)

TypeError: unorderable types: str() < int()

如果可能的话,最简单的解决方案是回到常规的 numpy 版本(类似于“1.11.2”),而不是 beta。

如果这确实是一个 numpy/sklearn 版本问题,那么对 OP 的反对票是不公平的。

【讨论】:

  • 经过 hpaulj 的一些研究和帮助后,发现我安装了 numpy1.12.0rc1。所以我卸载了它并下载了 1.11.3+mkl 预编译并安装了它。工作!谢谢@hpaulj
  • 我普遍同意“反对票对糟糕的 OP 不公平”的观点,但the question for its first 2 hours 没有包含回溯,而且非常不清楚错误来自何处。代码不仅仅是一个 MCVE,通读它我找不到问题出在哪里。 (奇怪的是,我实际上并没有否决这个问题。)
  • 整整两个小时!我从 3 点开始回答,所以没有看到最初的版本有多可怕。由于人们来自世界各地,并且在不同的日程安排上发帖,我尽量保持耐心。
猜你喜欢
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 2016-12-18
相关资源
最近更新 更多