scikit-learnAan de slag met scikit-learn


Opmerkingen

scikit-learn is een open-source bibliotheek voor algemeen gebruik voor gegevensanalyse geschreven in python. Het is gebaseerd op andere python-bibliotheken: NumPy, SciPy en matplotlib

scikit-learn bevat een aantal implementatie voor verschillende populaire algoritmen van machine learning.

Installatie van scikit-learn

De huidige stabiele versie van scikit-learn vereist :

  • Python (> = 2.6 of> = 3.3),
  • NumPy (> = 1.6.1),
  • SciPy (> = 0,9).

Voor de meeste installaties kan pip python package manager python en al zijn afhankelijkheden installeren:

pip install scikit-learn
 

Voor Linux-systemen wordt echter aanbevolen conda pakketbeheer te gebruiken om mogelijke build-processen te voorkomen

conda install scikit-learn
 

Om te controleren of je scikit-learn , voer je uit in shell:

python -c 'import sklearn; print(sklearn.__version__)'
 

Installatie van Windows en Mac OSX:

Canopy en Anaconda leveren beide een recente versie van scikit-learn , naast een grote set wetenschappelijke pythonbibliotheken voor Windows, Mac OSX (ook relevant voor Linux).

Pijpleidingen maken

Het vinden van patronen in gegevens verloopt vaak in een reeks gegevensverwerkingsstappen, bijvoorbeeld functieselectie, normalisatie en classificatie. In sklearn wordt hiervoor een pijplijn van fasen gebruikt.

De volgende code toont bijvoorbeeld een pijplijn die uit twee fasen bestaat. De eerste schaalt de functies en de tweede traint een classificator op de resulterende uitgebreide dataset:

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

pipeline = make_pipeline(StandardScaler(), KNeighborsClassifier(n_neighbors=4))
 

Nadat de pijplijn is gemaakt, kunt u deze als een normale fase gebruiken (afhankelijk van de specifieke stappen). Hier gedraagt de pijplijn zich bijvoorbeeld als een classificator. Bijgevolg kunnen we het als volgt gebruiken:

# fitting a classifier
pipeline.fit(X_train, y_train)
# getting predictions for the new data sample
pipeline.predict_proba(X_test)
 

Interfaces en conventies:

Verschillende bewerkingen met gegevens worden gedaan met behulp van speciale klassen.

De meeste klassen behoren tot een van de volgende groepen:

  • classificatie-algoritmen (afgeleid van sklearn.base.ClassifierMixin ) om classificatieproblemen op te lossen
  • regressie-algoritmen (afgeleid van sklearn.base.RegressorMixin ) om het probleem van het reconstrueren van continue variabelen op te lossen (regressieprobleem)
  • gegevenstransformaties (afgeleid van sklearn.base.TransformerMixin ) die de gegevens voorbewerken

Gegevens worden opgeslagen in numpy.array s (maar andere array-achtige objecten zoals pandas.DataFrame 's. pandas.DataFrame worden geaccepteerd als die converteerbaar zijn naar numpy.array s)

Elk object in de gegevens wordt beschreven door een reeks kenmerken, de algemene conventie is dat een gegevensmonster wordt weergegeven met een array, waarbij de eerste dimensie gegevensmonster-ID is, de tweede dimensie kenmerk-ID is.

import numpy
data = numpy.arange(10).reshape(5, 2)
print(data)

Output:
[[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]
 

In sklearn bevat de gegevensset hierboven 5 objecten die elk worden beschreven door 2 functies.

Voorbeeld datasets

Voor het gemak van testen biedt sklearn enkele ingebouwde datasets in de module sklearn.datasets . Laten we bijvoorbeeld Fisher's iris-gegevensset laden:

import sklearn.datasets
iris_dataset = sklearn.datasets.load_iris()
iris_dataset.keys()
['target_names', 'data', 'target', 'DESCR', 'feature_names']
 

U kunt de volledige beschrijving, namen van functies en namen van klassen ( target_names ) lezen. Die worden opgeslagen als tekenreeksen.

We zijn geïnteresseerd in de gegevens en klassen, die zijn opgeslagen in data en target . Volgens afspraak worden deze aangeduid als X en y

X, y = iris_dataset['data'], iris_dataset['target']
X.shape, y.shape
((150, 4), (150,))
 
numpy.unique(y)
array([0, 1, 2])
 

Vormen van X en y zeggen dat er 150 monsters zijn met 4 functies. Elk monster behoort tot een van de volgende klassen: 0, 1 of 2.

X en y kunnen nu worden gebruikt bij het trainen van een classifier door de methode fit() de classifier aan te roepen.


Hier is de volledige lijst met datasets die door de module sklearn.datasets met hun grootte en beoogd gebruik:

Laden met Beschrijving Grootte Gebruik
load_boston() Gegevensset huisprijzen Boston 506 regressie
load_breast_cancer() Gegevensset borstkanker Wisconsin 569 classificatie (binair)
load_diabetes() Diabetes gegevensset 442 regressie
load_digits(n_class) Cijfers dataset 1797 classificatie
load_iris() Iris gegevensset 150 classificatie (multi-klasse)
load_linnerud() Linnerud-gegevensset 20 multivariate regressie

Merk op dat (bron: http://scikit-learn.org/stable/datasets/) :

Deze datasets zijn nuttig om snel het gedrag van de verschillende algoritmen die in de scikit zijn geïmplementeerd te illustreren. Ze zijn echter vaak te klein om representatief te zijn voor echte machine-leertaken.

Naast deze ingebouwde speelgoed-voorbeeldgegevenssets biedt sklearn.datasets ook hulpprogramma's voor het laden van externe gegevenssets:

  • load_mlcomp voor het laden van voorbeeldgegevenssets uit de mlcomp.org- repository (merk op dat de gegevenssets eerder moeten worden gedownload). Hier is een voorbeeld van gebruik.
  • fetch_lfw_pairs en fetch_lfw_people voor het laden van Labeled Faces in the Wild (LFW) paren dataset van http://vis-www.cs.umass.edu/lfw/ , gebruikt voor gezichtsverificatie (resp. gezichtsherkenning). Deze dataset is groter dan 200 MB. Hier is een voorbeeld van gebruik.

Train een classificator met kruisvalidatie

Irisgegevensset gebruiken:

import sklearn.datasets
iris_dataset = sklearn.datasets.load_iris()
X, y = iris_dataset['data'], iris_dataset['target']
 

Gegevens worden opgesplitst in trein- en testsets. Om dit te doen gebruiken we de utility-functie train_test_split om zowel X als y (data en train_size=0.75 ) willekeurig te splitsen met de optie train_size=0.75 (trainingssets bevatten 75% van de data).

Trainingsdatasets worden ingevoerd in een classificator van de dichtstbijzijnde k . De methodische fit van de classificator past het model aan de gegevens.

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.75) 
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(X_train, y_train)
 

Eindelijk de kwaliteit van het testmonster voorspellen:

clf.score(X_test, y_test) # Output: 0.94736842105263153
 

Door één paar trein- en testsets te gebruiken, kunnen we een bevooroordeelde schatting van de kwaliteit van de classificator krijgen vanwege de willekeurige keuze voor de gegevensverdeling. Door middel van kruisvalidatie kunnen we de classificator op verschillende trein / test subsets van de gegevens passen en een gemiddelde maken over alle nauwkeurigheidsresultaten. De functie cross_val_score past een classificator aan de invoergegevens met behulp van cross_val_score . Als invoer kan het aantal verschillende splits (vouwen) worden gebruikt (5 in het onderstaande voorbeeld).

from sklearn.cross_validation import cross_val_score
scores = cross_val_score(clf, X, y, cv=5)
print(scores)
# Output: array([ 0.96666667,  0.96666667,  0.93333333,  0.96666667,  1.        ])
print "Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() / 2)
# Output: Accuracy: 0.97 (+/- 0.03)