scikit-learn Zelfstudie
Aan de slag met scikit-learn
Zoeken…
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).
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)
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
enfetch_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.