无法使用sklearn加载“mnist-original”数据集

5
这个问题与以下两个类似:这里这里。不幸的是,在我的情况下,建议的解决方法没有解决问题。
我需要使用MNIST数据集,但即使我指定了scikit_learn_data/mldata/文件夹的地址(见下文),我也无法获取它。如何解决这个问题?
如果有帮助的话,我正在使用Anaconda。
代码:
from sklearn.datasets.mldata import fetch_mldata

dataset = fetch_mldata('mnist-original', data_home='/Users/michelangelo/scikit_learn_data/mldata/')
mnist = fetch_mldata('MNIST original')

错误:

---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
<ipython-input-5-dc4d45bc928e> in <module>()
----> 1 mnist = fetch_mldata('MNIST original')

/Users/michelangelo/anaconda2/lib/python2.7/site-packages/sklearn/datasets/mldata.pyc in fetch_mldata(dataname, target_name, data_name, transpose_data, data_home)
    168     # load dataset matlab file
    169     with open(filename, 'rb') as matlab_file:
--> 170         matlab_dict = io.loadmat(matlab_file, struct_as_record=True)
    171 
    172     # -- extract data from matlab_dict

/Users/michelangelo/anaconda2/lib/python2.7/site-packages/scipy/io/matlab/mio.pyc in loadmat(file_name, mdict, appendmat, **kwargs)
    134     variable_names = kwargs.pop('variable_names', None)
    135     MR = mat_reader_factory(file_name, appendmat, **kwargs)
--> 136     matfile_dict = MR.get_variables(variable_names)
    137     if mdict is not None:
    138         mdict.update(matfile_dict)

/Users/michelangelo/anaconda2/lib/python2.7/site-packages/scipy/io/matlab/mio5.pyc in get_variables(self, variable_names)
    290                 continue
    291             try:
--> 292                 res = self.read_var_array(hdr, process)
    293             except MatReadError as err:
    294                 warnings.warn(

/Users/michelangelo/anaconda2/lib/python2.7/site-packages/scipy/io/matlab/mio5.pyc in read_var_array(self, header, process)
    250            `process`.
    251         '''
--> 252         return self._matrix_reader.array_from_header(header, process)
    253 
    254     def get_variables(self, variable_names=None):

mio5_utils.pyx in scipy.io.matlab.mio5_utils.VarReader5.array_from_header()

mio5_utils.pyx in scipy.io.matlab.mio5_utils.VarReader5.array_from_header()

mio5_utils.pyx in scipy.io.matlab.mio5_utils.VarReader5.read_real_complex()

mio5_utils.pyx in scipy.io.matlab.mio5_utils.VarReader5.read_numeric()

mio5_utils.pyx in scipy.io.matlab.mio5_utils.VarReader5.read_element()

streams.pyx in scipy.io.matlab.streams.FileStream.read_string()

IOError: could not read bytes

1
如果你输入以下内容:from sklearn.datasets import fetch_mldata, mnist = fetch_mldata('MNIST original'),它能够工作吗? - seralouk
不行,我得到了“SyntaxError:invalid syntax”错误。 - albus_c
  1. from sklearn.datasets import fetch_mldata
  2. mnist = fetch_mldata('MNIST original')
1)从sklearn.datasets导入fetch_mldata 2)mnist = fetch_mldata('MNIST原始数据')
- seralouk
不幸的是,那不是问题所在。 - albus_c
你的sklearn版本是多少?使用:import sklearn和sklearn.__version__来打印版本。 - seralouk
显示剩余2条评论
9个回答

21

不幸的是,fetch_mldata() 在最新版本的 sklearn 中已被取代为 fetch_openml()。

因此,现在需要使用如下代码:

from sklearn.datasets import fetch_mldata
mnist = fetch_mldata('MNIST original')

你必须使用:

from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784')
x = mnist.data
y = mnist.target

x的形状将为=(70000,784)
y的形状将为=(70000,)


7

这里是一个快速更新:

mldata.org似乎仍然不可用。那么scikit-learn将删除fetch_mldata。

目前的解决方法: 由于使用上述行会在data_home处创建一个空文件夹,因此请在此处找到数据的副本: https://github.com/amplab/datascience-sp14/blob/master/lab7/mldata/mnist-original.mat并下载它。然后将其放置在~/sklearn_data/mldata/中,该文件夹为空。

对我而言有效。


5

我刚遇到了同样的问题,花了一些时间才找到问题所在。一个原因是,在第一次下载期间,数据可能会被损坏。删除缓存数据。按照以下步骤查找scikit数据主目录:

from sklearn.datasets.base import get_data_home 
print (get_data_home())

清理目录并重新下载数据集。这个解决方案对我有效。 参考链接: https://github.com/ageron/handson-ml/issues/143 这也与以下问题有关: 如何在sklearn中使用datasets.fetch_mldata()?

3

谢谢您的回复,Vivek!我仍然遇到了“IOError:无法读取字节”的问题。 - albus_c
1
@albus_c 可能是下载文件损坏了。请检查在 scikit_learn_data/mldata 中下载的文件大小,应该至少为 52 MB。如果不是,请删除并重试。 - Vivek Kumar
1
@albus_c 精确地是52.9 MB。如果仍然不成功,请在浏览器中从此链接下载文件并替换该文件夹中的文件。 - Vivek Kumar
很可能那就是问题所在。我现在会尝试使用直接链接。 - albus_c
fetch_mldata现已弃用 :( - Eric

3

对于遇到同样问题的人:这是一个连接问题。如果您遇到类似的错误,请检查您是否有完整的mnist-original.mat文件,正如@vivek-kumar所建议的那样。当前文件大小:55.4 MB。


1
是的,在系统中,它显示为55.4 MB,但在下载过程中显示为52.9 MB。如果有帮助,请考虑点赞和接受答案。 - Vivek Kumar

2

只需使用以下两行代码:

from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784', version=1, cache=True)

这现在抛出 urlopen错误 [Errno -3] 名称解析暂时失败 - csaladenes

2
在最新的sklearn版本(0.21)中,请使用以下代码:
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_digits

digits = load_digits()

X = digits.data
y = digits.target

0

试试这个:

print(sklearn.__version__)

try:
    from sklearn.datasets import fetch_openml
    mnist = fetch_openml('mnist_784', version=1, cache=True)
except ImportError:
    from sklearn.datasets import fetch_mldata
    mnist = fetch_mldata('MNIST original')

-1

试试这个,这个会起作用的。

from sklearn.datasets import fetch_mldata
mnist = fetch_mldata('MNIST original')

2
嗨,Puneet!你能解释一下为什么这是正确的答案吗? - Nathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接