7.4. Cargando otros conjuntos de datos¶
7.4.1. Imágenes de ejemplo¶
Scikit-learn también incorpora un par de imágenes JPEG de muestra publicadas bajo licencia Creative Commons por sus autores. Estas imágenes pueden ser útiles para probar los algoritmos y las líneas de producción en datos 2D.
Cargar imágenes de muestra para la manipulación de imágenes. |
|
|
Carga el arreglo numpy de una sola imagen de muestra |
Advertencia
La codificación por defecto de las imágenes se basa en el dtype uint8
para ahorrar memoria. A menudo los algoritmos de aprendizaje automático funcionan mejor si la entrada se convierte primero a una representación de punto flotante. Además, si planeas usar matplotlib.pyplpt.imshow
, no olvides escalar al rango 0 - 1 como se hace en el siguiente ejemplo.
7.4.2. Conjuntos de datos en formato svmlight / libsvm¶
scikit-learn incluye funciones de utilidad para cargar conjuntos de datos en el formato svmlight / libsvm. En este formato, cada línea tiene la forma <label> <feature-id>:<feature-value> <feature-id>:<feature-value> ...
. Este formato es especialmente adecuado para conjuntos de datos dispersos. En este módulo, se utilizan matrices CSR dispersas de scipy para X
y arreglos de numpy para y
.
Puedes cargar un conjunto de datos como los siguientes:
>>> from sklearn.datasets import load_svmlight_file
>>> X_train, y_train = load_svmlight_file("/path/to/train_dataset.txt")
...
También puedes cargar dos conjuntos de datos (o más) a la vez:
>>> X_train, y_train, X_test, y_test = load_svmlight_files(
... ("/path/to/train_dataset.txt", "/path/to/test_dataset.txt"))
...
En este caso, se garantiza que X_train
y X_test
tengan el mismo número de características. Otra forma de lograr el mismo resultado es corregir el número de características:
>>> X_test, y_test = load_svmlight_file(
... "/path/to/test_dataset.txt", n_features=X_train.shape[1])
...
Enlaces relacionados:
_`Conjuntos de datos públicos en formato svmlight / libsvm: https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets
Implementación más rápida compatible con API: https://github.com/mblondel/svmlight-loader
7.4.3. Descargando conjuntos de datos desde el repositorio openml.org¶
openml.org es un repositorio público para datos de aprendizaje automático y experimentos, que permite a todos subir conjuntos de datos abiertos.
El paquete sklearn.datasets
es capaz de descargar conjuntos de datos del repositorio usando la función sklearn.datasets.fetch_openml
.
Por ejemplo, para descargar un conjunto de datos de expresiones genéticas en cerebros de ratones:
>>> from sklearn.datasets import fetch_openml
>>> mice = fetch_openml(name='miceprotein', version=4)
Para especificar completamente un conjunto de datos, debes proporcionar un nombre y una versión, aunque la versión es opcional, ver Versiones del conjunto de datos a continuación. El conjunto de datos contiene un total de 1080 ejemplos pertenecientes a 8 clases diferentes:
>>> mice.data.shape
(1080, 77)
>>> mice.target.shape
(1080,)
>>> np.unique(mice.target)
array(['c-CS-m', 'c-CS-s', 'c-SC-m', 'c-SC-s', 't-CS-m', 't-CS-s', 't-SC-m', 't-SC-s'], dtype=object)
Puedes obtener más información sobre el conjunto de datos mirando los atributos DESCR
y details
:
>>> print(mice.DESCR)
**Author**: Clara Higuera, Katheleen J. Gardiner, Krzysztof J. Cios
**Source**: [UCI](https://archive.ics.uci.edu/ml/datasets/Mice+Protein+Expression) - 2015
**Please cite**: Higuera C, Gardiner KJ, Cios KJ (2015) Self-Organizing
Feature Maps Identify Proteins Critical to Learning in a Mouse Model of Down
Syndrome. PLoS ONE 10(6): e0129126...
>>> mice.details
{'id': '40966', 'name': 'MiceProtein', 'version': '4', 'format': 'ARFF',
'upload_date': '2017-11-08T16:00:15', 'licence': 'Public',
'url': 'https://www.openml.org/data/v1/download/17928620/MiceProtein.arff',
'file_id': '17928620', 'default_target_attribute': 'class',
'row_id_attribute': 'MouseID',
'ignore_attribute': ['Genotype', 'Treatment', 'Behavior'],
'tag': ['OpenML-CC18', 'study_135', 'study_98', 'study_99'],
'visibility': 'public', 'status': 'active',
'md5_checksum': '3c479a6885bfa0438971388283a1ce32'}
El DESCR
contiene una descripción de texto libre de los datos, mientras que details
contiene un diccionario de metadatos almacenados por openml, como el id del conjunto de datos. Para más detalles, consulta la documentación de OpenML <https://docs.openml.org/#data>`_ El data_id
del conjunto de datos de proteínas de ratones es 40966, y puede utilizarlo (o el nombre) para obtener más información sobre el conjunto de datos en el sitio web de openml:
>>> mice.url
'https://www.openml.org/d/40966'
El data_id
también identifica de forma única un conjunto de datos de OpenML:
>>> mice = fetch_openml(data_id=40966)
>>> mice.details
{'id': '4550', 'name': 'MiceProtein', 'version': '1', 'format': 'ARFF',
'creator': ...,
'upload_date': '2016-02-17T14:32:49', 'licence': 'Public', 'url':
'https://www.openml.org/data/v1/download/1804243/MiceProtein.ARFF', 'file_id':
'1804243', 'default_target_attribute': 'class', 'citation': 'Higuera C,
Gardiner KJ, Cios KJ (2015) Self-Organizing Feature Maps Identify Proteins
Critical to Learning in a Mouse Model of Down Syndrome. PLoS ONE 10(6):
e0129126. [Web Link] journal.pone.0129126', 'tag': ['OpenML100', 'study_14',
'study_34'], 'visibility': 'public', 'status': 'active', 'md5_checksum':
'3c479a6885bfa0438971388283a1ce32'}
7.4.3.1. Versiones del conjunto de datos¶
Un conjunto de datos se especifica de forma exclusiva por su data_id
, pero no necesariamente por su nombre. Pueden existir varias «versiones» diferentes de un conjunto de datos con el mismo nombre que pueden contener conjuntos de datos totalmente diferentes. Si se descubre que una versión concreta de un conjunto de datos contiene problemas importantes, puede desactivarse. Si se utiliza un nombre para especificar un conjunto de datos, se obtendrá la versión más antigua de un conjunto de datos que aún esté activa. Esto significa que fetch_openml(name="miceprotein")
puede dar diferentes resultados en diferentes momentos si las versiones anteriores se vuelven inactivas. Puedes ver que el conjunto de datos con data_id
40966 que hemos obtenido arriba es la primera versión del conjunto de datos «miceprotein»:
>>> mice.details['version']
'1'
De hecho, este conjunto de datos sólo tiene una versión. El conjunto de datos iris por otro lado tiene múltiples versiones:
>>> iris = fetch_openml(name="iris")
>>> iris.details['version']
'1'
>>> iris.details['id']
'61'
>>> iris_61 = fetch_openml(data_id=61)
>>> iris_61.details['version']
'1'
>>> iris_61.details['id']
'61'
>>> iris_969 = fetch_openml(data_id=969)
>>> iris_969.details['version']
'3'
>>> iris_969.details['id']
'969'
Al especificar el conjunto de datos por el nombre «iris» se obtiene la versión más baja, la versión 1, con el data_id
61. Para asegurarte de obtener siempre este conjunto de datos exacto, lo más seguro es especificarlo por el conjunto de datos data_id
. El otro conjunto de datos, con data_id
969, es la versión 3 (la versión 2 ha quedado inactiva), y contiene una versión binarizada de los datos:
>>> np.unique(iris_969.target)
array(['N', 'P'], dtype=object)
También puedes especificar tanto el nombre como la versión, que también identifica de forma única el conjunto de datos:
>>> iris_version_3 = fetch_openml(name="iris", version=3)
>>> iris_version_3.details['version']
'3'
>>> iris_version_3.details['id']
'969'
Referencias:
Vanschoren, van Rijn, Bischl and Torgo «OpenML: networked science in machine learning», ACM SIGKDD Explorations Newsletter, 15(2), 49-60, 2014.
7.4.4. Cargando desde conjuntos de datos externos¶
scikit-learn funciona con cualquier dato numérico almacenado como arreglos numpy o matrices dispersas scipy. Otros tipos que son convertibles a arreglos numéricos como DataFrame de pandas también son aceptables.
Aquí hay algunas formas recomendadas de cargar datos de columnas estándar en un formato utilizable por scikit-learn:
pandas.io proporciona herramientas para leer datos desde formatos comunes como CSV, Excel, JSON y SQL. Los DataFrames también pueden construirse a partir de listas de tuplas o dicts. Pandas maneja datos heterogéneos sin problemas y proporciona herramientas para la manipulación y la conversión en una matriz numérica adecuada para scikit-learn.
scipy.io se especializa en formatos binarios a menudo utilizados en el contexto científico de computación como .mat y .arff
numpy/routines.io para la carga estándar de datos columnares en arreglos numpy
datasets.load_svmlight_file
de scikit-learn para el formato svmlight o libSVM dispersodatasets.load_files
de scikit-learn para directorios de archivos de texto donde el nombre de cada directorio es el nombre de cada categoría y cada archivo dentro de cada directorio corresponde a una muestra de esa categoría
Para algunos datos variados como imágenes, vídeos y audio, puedes referirte a:
skimage.io o Imageio para cargar imágenes y vídeos en arreglos numéricos
scipy.io.wavfile.read para leer archivos WAV en un arreglo numpy
Características categóricas (o nominales) almacenadas como cadenas (comunes en DataFrames de pandas) necesitarán convertir a características numéricas usando OneHotEncoder
o OrdinalEncoder
o similar. Ver Preprocesamiento de los datos.
Nota: si administras tus propios datos numéricos se recomienda utilizar un formato de archivo optimizado como HDF5 para reducir los tiempos de carga de datos. Varias bibliotecas como H5Py, PyTables y pandas proporcionan una interfaz Python para leer y escribir datos en ese formato.