8.4. Laden anderer Datensätze#

8.4.1. Beispielbilder#

Scikit-learn enthält auch einige Beispiel-JPEG-Bilder, die von ihren Autoren unter Creative Commons-Lizenz veröffentlicht wurden. Diese Bilder können nützlich sein, um Algorithmen und Pipelines anhand von 2D-Daten zu testen.

load_sample_images()

Lädt Beispielbilder für die Bildbearbeitung.

load_sample_image(image_name)

Lädt das Numpy-Array eines einzelnen Beispielbildes.

../_images/loading_other_datasets-1.png

Warnung

Die Standardkodierung von Bildern basiert auf dem uint8 Datentyp, um Speicher zu sparen. Maschinenlernalgorithmen funktionieren oft am besten, wenn die Eingabe zuerst in eine Gleitkommadarstellung konvertiert wird. Wenn Sie vorhaben, matplotlib.pyplot.imshow zu verwenden, vergessen Sie nicht, die Skalierung auf den Bereich 0 - 1 vorzunehmen, wie im folgenden Beispiel gezeigt.

8.4.2. Datensätze im svmlight / libsvm Format#

Scikit-learn enthält Hilfsfunktionen zum Laden von Datensätzen im svmlight / libsvm Format. In diesem Format hat jede Zeile die Form <label> <feature-id>:<feature-value> <feature-id>:<feature-value> .... Dieses Format eignet sich besonders für dünnbesetzte Datensätze. In diesem Modul werden dünnbesetzte SciPy-CSR-Matrizen für X und NumPy-Arrays für y verwendet.

Sie können einen Datensatz wie folgt laden

>>> from sklearn.datasets import load_svmlight_file
>>> X_train, y_train = load_svmlight_file("/path/to/train_dataset.txt")
...

Sie können auch zwei (oder mehr) Datensätze auf einmal laden

>>> X_train, y_train, X_test, y_test = load_svmlight_files(
...     ("/path/to/train_dataset.txt", "/path/to/test_dataset.txt"))
...

In diesem Fall ist garantiert, dass X_train und X_test dieselbe Anzahl von Merkmalen aufweisen. Eine andere Möglichkeit, dasselbe Ergebnis zu erzielen, ist die Festlegung der Anzahl der Merkmale

>>> X_test, y_test = load_svmlight_file(
...     "/path/to/test_dataset.txt", n_features=X_train.shape[1])
...

Verwandte Links

8.4.3. Herunterladen von Datensätzen aus dem openml.org Repository#

openml.org ist ein öffentliches Repository für maschinelle Lernverfahren und Experimente, das es jedem ermöglicht, offene Datensätze hochzuladen.

Das Paket sklearn.datasets kann Datensätze aus dem Repository mithilfe der Funktion sklearn.datasets.fetch_openml herunterladen.

Zum Beispiel, um einen Datensatz von Genexpressionen in Mäusehirnen herunterzuladen

>>> from sklearn.datasets import fetch_openml
>>> mice = fetch_openml(name='miceprotein', version=4)

Um einen Datensatz vollständig zu spezifizieren, müssen Sie einen Namen und eine Version angeben, wobei die Version optional ist, siehe Datensatzversionen unten. Der Datensatz enthält insgesamt 1080 Beispiele, die zu 8 verschiedenen Klassen gehören

>>> 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)

Sie können weitere Informationen über den Datensatz erhalten, indem Sie die Attribute DESCR und details betrachten

>>> 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'}

Die DESCR enthält eine Freitextbeschreibung der Daten, während details ein Wörterbuch mit Metadaten enthält, die von OpenML gespeichert wurden, wie z.B. die Datensatz-ID. Weitere Details finden Sie in der OpenML-Dokumentation. Die data_id des Mäuseprotein-Datensatzes ist 40966, und Sie können diese (oder den Namen) verwenden, um weitere Informationen über den Datensatz auf der OpenML-Website zu erhalten.

>>> mice.url
'https://www.openml.org/d/40966'

Die data_id identifiziert auch eindeutig einen Datensatz von 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'}

8.4.3.1. Datensatzversionen#

Ein Datensatz wird eindeutig durch seine data_id spezifiziert, aber nicht unbedingt durch seinen Namen. Es können mehrere verschiedene "Versionen" eines Datensatzes mit demselben Namen existieren, die völlig unterschiedliche Datensätze enthalten können. Wenn sich eine bestimmte Version eines Datensatzes als problematisch erweist, kann sie deaktiviert werden. Die Verwendung eines Namens zur Spezifizierung eines Datensatzes liefert die früheste, noch aktive Version eines Datensatzes. Das bedeutet, dass fetch_openml(name="miceprotein") zu verschiedenen Zeiten unterschiedliche Ergebnisse liefern kann, wenn frühere Versionen inaktiv werden. Sie können sehen, dass der Datensatz mit der data_id 40966, den wir oben geladen haben, die erste Version des "miceprotein"-Datensatzes ist.

>>> mice.details['version']
'1'

Tatsächlich hat dieser Datensatz nur eine Version. Der Iris-Datensatz hingegen hat mehrere Versionen

>>> 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'

Die Angabe des Datensatzes nach dem Namen "iris" liefert die niedrigste Version, Version 1, mit der data_id 61. Um sicherzustellen, dass Sie immer diesen exakten Datensatz erhalten, ist es am sichersten, ihn durch die data_id des Datensatzes zu spezifizieren. Der andere Datensatz mit der data_id 969 ist Version 3 (Version 2 wurde inaktiv) und enthält eine binarisierte Version der Daten.

>>> np.unique(iris_969.target)
array(['N', 'P'], dtype=object)

Sie können auch sowohl den Namen als auch die Version angeben, was den Datensatz ebenfalls eindeutig identifiziert

>>> iris_version_3 = fetch_openml(name="iris", version=3)
>>> iris_version_3.details['version']
'3'
>>> iris_version_3.details['id']
'969'

Referenzen

8.4.3.2. ARFF-Parser#

Ab Version 1.2 bietet scikit-learn ein neues Schlüsselwortargument parser, das mehrere Optionen zum Parsen der von OpenML bereitgestellten ARFF-Dateien bietet. Der Legacy-Parser (d.h. parser="liac-arff") basiert auf dem Projekt LIAC-ARFF. Dieser Parser ist jedoch langsam und verbraucht mehr Speicher als erforderlich. Ein neuer Parser, der auf Pandas basiert (d.h. parser="pandas"), ist sowohl schneller als auch speichereffizienter. Dieser Parser unterstützt jedoch keine dünnbesetzten Daten. Daher empfehlen wir die Verwendung von parser="auto", der den besten verfügbaren Parser für den angeforderten Datensatz verwendet.

Die Parser "pandas" und "liac-arff" können zu unterschiedlichen Datentypen in der Ausgabe führen. Die bemerkenswertesten Unterschiede sind folgende

  • Der "liac-arff"-Parser kodiert kategorische Merkmale immer als str-Objekte. Im Gegensatz dazu leitet der "pandas"-Parser den Typ beim Lesen ab und numerische Kategorien werden, wo immer möglich, in ganze Zahlen umgewandelt.

  • Der "liac-arff"-Parser verwendet float64 zur Kodierung numerischer Merkmale, die in den Metadaten als 'REAL' und 'NUMERICAL' gekennzeichnet sind. Der "pandas"-Parser leitet stattdessen ab, ob diese numerischen Merkmale ganzen Zahlen entsprechen, und verwendet die Integer-Erweiterungs-dtype von Pandas.

  • Insbesondere werden Klassifizierungsdatensätze mit ganzzahligen Kategorien typischerweise als solche geladen (0, 1, ...) mit dem "pandas"-Parser, während "liac-arff" die Verwendung von Zeichenketten-kodierten Klassenbezeichnungen wie "0", "1" usw. erzwingt.

  • Der "pandas"-Parser entfernt keine einfachen Anführungszeichen - d.h. ' - aus Zeichenketten-Spalten. Zum Beispiel wird eine Zeichenkette 'my string' so beibehalten, wie sie ist, während der "liac-arff"-Parser die einfachen Anführungszeichen entfernt. Bei kategorialen Spalten werden die einfachen Anführungszeichen aus den Werten entfernt.

Zusätzlich gibt der "liac-arff"-Parser, wenn as_frame=False verwendet wird, ordinal kodierte Daten zurück, wobei die Kategorien im Attribut categories der Bunch-Instanz bereitgestellt werden. Stattdessen gibt "pandas" ein NumPy-Array zurück, in dem die Kategorien enthalten sind. Dann liegt es am Benutzer, eine Feature-Engineering-Pipeline mit einer Instanz von OneHotEncoder oder OrdinalEncoder zu entwerfen, typischerweise eingepackt in einen ColumnTransformer, um die kategorialen Spalten explizit vorzuverarbeiten. Sehen Sie zum Beispiel: Column Transformer mit gemischten Typen.

8.4.4. Laden von externen Datensätzen#

Scikit-learn arbeitet mit allen numerischen Daten, die als NumPy-Arrays oder SciPy-Sparse-Matrizen gespeichert sind. Andere Typen, die in numerische Arrays konvertiert werden können, wie z.B. Pandas DataFrames, sind ebenfalls akzeptabel.

Hier sind einige empfohlene Möglichkeiten, Standard-Spalten-Daten in ein für scikit-learn verwendbares Format zu laden

  • pandas.io bietet Werkzeuge zum Lesen von Daten aus gängigen Formaten, einschließlich CSV, Excel, JSON und SQL. DataFrames können auch aus Listen von Tupeln oder Dictionaries erstellt werden. Pandas verarbeitet heterogene Daten reibungslos und bietet Werkzeuge zur Manipulation und Konvertierung in ein numerisches Array, das für scikit-learn geeignet ist.

  • scipy.io spezialisiert sich auf Binärformate, die oft in wissenschaftlichen Berechnungskontexten verwendet werden, wie z.B. .mat und .arff

  • numpy/routines.io zum standardmäßigen Laden von Spalten-Daten in NumPy-Arrays

  • scikit-learns load_svmlight_file für das svmlight oder libSVM Sparse-Format

  • scikit-learns load_files für Verzeichnisse von Textdateien, bei denen der Name jedes Verzeichnisses der Name jeder Kategorie ist und jede Datei innerhalb jedes Verzeichnisses einem Sample aus dieser Kategorie entspricht

Für einige verschiedene Daten wie Bilder, Videos und Audio könnten Sie sich auf Folgendes beziehen

Kategorische (oder nominale) Merkmale, die als Zeichenketten gespeichert sind (häufig in Pandas DataFrames), müssen mit OneHotEncoder oder OrdinalEncoder oder ähnlichen Werkzeugen in numerische Merkmale konvertiert werden. Siehe Datenvorverarbeitung.

Hinweis: Wenn Sie Ihre eigenen numerischen Daten verwalten, wird empfohlen, ein optimiertes Dateiformat wie HDF5 zu verwenden, um die Ladezeiten der Daten zu reduzieren. Verschiedene Bibliotheken wie H5Py, PyTables und Pandas bieten eine Python-Schnittstelle zum Lesen und Schreiben von Daten in diesem Format.