【问题标题】:How to use datasets.fetch_mldata() in sklearn?如何在 sklearn 中使用 datasets.fetch_mldata()?
【发布时间】:2013-11-01 01:29:21
【问题描述】:

我正在尝试为简短的机器学习算法运行以下代码:

import re
import argparse
import csv
from collections import Counter
from sklearn import datasets
import sklearn
from sklearn.datasets import fetch_mldata

dataDict = datasets.fetch_mldata('MNIST Original')

在这段代码中,我试图通过 sklearn 读取 mldata.org 上的数据集“MNIST Original”。这会导致以下错误(有更多代码行,但我在此特定行出现错误):

Traceback (most recent call last):
  File "C:\Program Files (x86)\JetBrains\PyCharm 2.7.3\helpers\pydev\pydevd.py", line 1481, in <module>
    debugger.run(setup['file'], None, None)
  File "C:\Program Files (x86)\JetBrains\PyCharm 2.7.3\helpers\pydev\pydevd.py", line 1124, in run
    pydev_imports.execfile(file, globals, locals) #execute the script
  File "C:/Users/sony/PycharmProjects/Machine_Learning_Homework1/zeroR.py", line 131, in <module>
    dataDict = datasets.fetch_mldata('MNIST Original')
  File "C:\Anaconda\lib\site-packages\sklearn\datasets\mldata.py", line 157, in fetch_mldata
    matlab_dict = io.loadmat(matlab_file, struct_as_record=True)
  File "C:\Anaconda\lib\site-packages\scipy\io\matlab\mio.py", line 176, in loadmat
    matfile_dict = MR.get_variables(variable_names)
  File "C:\Anaconda\lib\site-packages\scipy\io\matlab\mio5.py", line 294, in get_variables
    res = self.read_var_array(hdr, process)
  File "C:\Anaconda\lib\site-packages\scipy\io\matlab\mio5.py", line 257, in read_var_array
    return self._matrix_reader.array_from_header(header, process)
  File "mio5_utils.pyx", line 624, in scipy.io.matlab.mio5_utils.VarReader5.array_from_header (scipy\io\matlab\mio5_utils.c:5717)
  File "mio5_utils.pyx", line 653, in scipy.io.matlab.mio5_utils.VarReader5.array_from_header (scipy\io\matlab\mio5_utils.c:5147)
  File "mio5_utils.pyx", line 721, in scipy.io.matlab.mio5_utils.VarReader5.read_real_complex (scipy\io\matlab\mio5_utils.c:6134)
  File "mio5_utils.pyx", line 424, in scipy.io.matlab.mio5_utils.VarReader5.read_numeric (scipy\io\matlab\mio5_utils.c:3704)
  File "mio5_utils.pyx", line 360, in scipy.io.matlab.mio5_utils.VarReader5.read_element (scipy\io\matlab\mio5_utils.c:3429)
  File "streams.pyx", line 181, in scipy.io.matlab.streams.FileStream.read_string (scipy\io\matlab\streams.c:2711)
IOError: could not read bytes

我曾尝试在互联网上进行研究,但几乎没有任何帮助。任何与解决此错误相关的专家帮助将不胜感激。

TIA。

【问题讨论】:

    标签: python numpy machine-learning


    【解决方案1】:

    那是“MNIST 原创”。在“o”上带有小写。

    【讨论】:

    • 您好,感谢您的回复。也尝试了小“o”,仍然是同样的错误。
    • 使用小写“o”或大写并没有区别。在内部,sklearn makes everything lowercase: dataname.lower().replace(' ', '-').
    【解决方案2】:

    试试这样:

    dataDict = fetch_mldata('MNIST original')
    

    这对我有用。由于您使用了from ... import ... 语法,因此您在使用时不应该在前面加上datasets

    【讨论】:

      【解决方案3】:

      看起来缓存的数据已损坏。尝试删除它们并重新下载(需要一点时间)。如果没有另外指定,“MINST original”的数据应该在

      ~/scikit_learn_data/mldata/mnist-original.mat
      

      【讨论】:

        【解决方案4】:

        以下是一些示例代码,如何让 MNIST 数据准备好用于 sklearn:

        def get_data():
            """
            Get MNIST data ready to learn with.
        
            Returns
            -------
            dict
                With keys 'train' and 'test'. Both do have the keys 'X' (features)
                and'y' (labels)
            """
            from sklearn.datasets import fetch_mldata
            mnist = fetch_mldata('MNIST original')
        
            x = mnist.data
            y = mnist.target
        
            # Scale data to [-1, 1] - This is of mayor importance!!!
            x = x/255.0*2 - 1
        
            from sklearn.cross_validation import train_test_split
            x_train, x_test, y_train, y_test = train_test_split(x, y,
                                                                test_size=0.33,
                                                                random_state=42)
            data = {'train': {'X': x_train,
                              'y': y_train},
                    'test': {'X': x_test,
                             'y': y_test}}
            return data
        

        【讨论】:

          【解决方案5】:

          我还收到了 fetch_mldata()“IOError: could not read bytes”错误。这是解决方案;相关的代码行是

          from sklearn.datasets.mldata import fetch_mldata
          mnist = fetch_mldata('mnist-original', data_home='/media/Vancouver/apps/mnist_dataset/')
          

          ...请务必将“data_home”更改为您的首选位置(目录)。

          这是一个脚本:

          #!/usr/bin/python
          # coding: utf-8
          
          # Source:
          # https://stackoverflow.com/questions/19530383/how-to-use-datasets-fetch-mldata-in-sklearn
          # ... modified, below, by Victoria
          
          """
          pers. comm. (Jan 27, 2016) from MLdata.org MNIST dataset contactee "Cheng Ong:"
          
              The MNIST data is called 'mnist-original'. The string you pass to sklearn
              has to match the name of the URL:
          
              from sklearn.datasets.mldata import fetch_mldata
              data = fetch_mldata('mnist-original')
          """
          
          def get_data():
          
              """
              Get MNIST data; returns a dict with keys 'train' and 'test'.
              Both have the keys 'X' (features) and 'y' (labels)
              """
          
              from sklearn.datasets.mldata import fetch_mldata
          
              mnist = fetch_mldata('mnist-original', data_home='/media/Vancouver/apps/mnist_dataset/')
          
              x = mnist.data
              y = mnist.target
          
              # Scale data to [-1, 1]
              x = x/255.0*2 - 1
          
              from sklearn.cross_validation import train_test_split
          
              x_train, x_test, y_train, y_test = train_test_split(x, y,
                  test_size=0.33, random_state=42)
          
              data = {'train': {'X': x_train, 'y': y_train},
                      'test': {'X': x_test, 'y': y_test}}
          
              return data
          
          data = get_data()
          print '\n', data, '\n'
          

          【讨论】:

            【解决方案6】:

            如果你没有给data_home,程序看看${yourprojectpath}/mldata/minist-original.mat你可以下载程序并将文件放在正确的路径

            【讨论】:

              【解决方案7】:

              当我使用较差的 WiFi 时,我遇到了同样的问题,并在不同的时间发现了不同的 mnist-original.mat 文件大小。我切换到局域网,它工作正常。可能是网络问题。

              【讨论】:

                【解决方案8】:

                我过去也遇到过这个问题。这是由于数据集非常大(约 55.4 mb),我运行“fetch_mldata”但由于互联网连接,需要一段时间才能将它们全部下载。我不知道并打断了这个过程。

                数据集已损坏以及发生错误的原因。

                【讨论】:

                  【解决方案9】:

                  除了@szymon 提到的之外,您还可以使用以下方式加载数据集:

                  from six.moves import urllib
                  from sklearn.datasets import fetch_mldata
                  
                  from scipy.io import loadmat
                  mnist_alternative_url = "https://github.com/amplab/datascience-sp14/raw/master/lab7/mldata/mnist-original.mat"
                  mnist_path = "./mnist-original.mat"
                  response = urllib.request.urlopen(mnist_alternative_url)
                  with open(mnist_path, "wb") as f:
                      content = response.read()
                      f.write(content)
                  mnist_raw = loadmat(mnist_path)
                  mnist = {
                      "data": mnist_raw["data"].T,
                      "target": mnist_raw["label"][0],
                      "COL_NAMES": ["label", "data"],
                      "DESCR": "mldata.org dataset: mnist-original",
                  }
                  

                  【讨论】:

                    【解决方案10】:

                    我从这个链接下载了数据集

                    https://github.com/amplab/datascience-sp14/blob/master/lab7/mldata/mnist-original.mat

                    然后我输入了这些行

                    from sklearn.datasets import fetch_mldata
                    mnist = fetch_mldata('MNIST original', transpose_data=True, data_home='files')
                    

                    *** 路径是(你的工作目录)/files/mldata/mnist-original.mat

                    我希望你能得到它,它对我来说很好用

                    【讨论】:

                    • 第一次运行时,会创建一个mldata文件夹。将下载的文件粘贴到 mldata 文件夹中。然后再次运行该应用程序,它将使用本地目录中下载的副本运行良好,而不是尝试从 Internet 下载。它也会更快。
                    【解决方案11】:

                    从 0.20 版开始,sklearn deprecates fetch_mldata 函数并添加了fetch_openml

                    使用以下代码下载MNIST dataset

                    from sklearn.datasets import fetch_openml
                    mnist = fetch_openml('mnist_784')
                    

                    虽然格式有一些变化。例如,mnist['target'] 是一个字符串类别标签数组(不像以前那样浮动)。

                    【讨论】:

                      猜你喜欢
                      • 2014-11-23
                      • 2017-07-14
                      • 2017-04-05
                      • 2019-09-03
                      • 2016-11-25
                      • 2019-10-11
                      • 2021-02-09
                      • 2021-06-17
                      • 1970-01-01
                      相关资源
                      最近更新 更多