[PYTHON] Überarbeitetes Scikit-Lernen

Notieren Sie sich, was Sie über die nützliche API von scikit-learn gelernt haben. Ich habe ein Memo in $ HOME / Desktop / memo.md geschrieben, es aber versehentlich gerahmt, also habe ich versucht, Qiita zu verwenden. Ich werde nach Bedarf neues Lernen hinzufügen.

(Ich würde mich freuen, wenn Sie auf Fehler hinweisen könnten. Danke.)

Datenvorverarbeitung

Gott wohnt im Vorverarbeitungsmodul der Bibliothek, und wir müssen den Committern beim Import danken.

Dimensionsreduktion der Identität

Wählen Sie k Elemente aus. Das erste Argument von SelectKBest ist eine Funktion, und f_classif usw. kann zusätzlich zu chi2 verwendet werden. Es gibt andere RFECVs zum Reduzieren der Dimension des Elements, aber ich bin mir nicht sicher, wie sie sich unterscheiden, daher möchte ich dies in Zukunft untersuchen.

from sklearn.feature_selection.univariate_selection import SelectKBest, chi2

fselect = SelectKBest(chi2 , k=2000)

Referenz: [Wie verwende ich SelectKBest, GridSearchCV und Kreuzvalidierung im sklearn-Paket ordnungsgemäß zusammen?](Https://www.quora.com/How-do-I-properly-use-SelectKBest-GridSearchCV-and- Kreuzvalidierung-im-sklearn-Paket-zusammen)

Behandeln Sie Daten mit fehlenden Werten

Eine moderne Waffe namens Pandas hat die Datenvorverarbeitung erheblich vereinfacht. Es passt gut zu Jupyter-Notebooks und entfernt Daten, die NaN enthalten, in einer Zeile. NaN und in einigen Fällen 0 usw. werden als fehlende Werte bezeichnet.

Fehlende Werte können auch mit scikit-learn entfernt werden. Ein Auszug aus einem Muster eines Referenzartikels (offizielles Dokument). Wenn imp.fit () ausgeführt wird, werden der Durchschnittswert und der Medianwert berechnet, und wenn imp.transform () ausgeführt wird, wird der fehlende Wert durch den Durchschnittswert und den Medianwert ersetzt.

import numpy as np
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit([[1, 2], [np.nan, 3], [7, 6]])

X = [[np.nan, 2], [6, np.nan], [7, 6]]
print(imp.transform(X)) 
# [[ 4.          2.        ]
#  [ 6.          3.666...]
#  [ 7.          6.        ]]

Referenz: offizielles Dokument von scikit-learn

Normalisieren Sie die Daten

Ich habe die Normalisierung immer selbst geschrieben (obwohl ich nur ein paar numpy-Methoden nenne), aber scikit-learn erledigt das für mich. L1-Norm und L2-Norm können verwendet werden. Auszug aus dem Beispielcode des Dokuments.

X = [[ 1., -1.,  2.],
     [ 2.,  0.,  0.],
     [ 0.,  1., -1.]]
X_normalized = preprocessing.normalize(X, norm='l2')

print(X_normalized)
# array([[ 0.40..., -0.40...,  0.81...],
#       [ 1.  ...,  0.  ...,  0.  ...],
#       [ 0.  ...,  0.70..., -0.70...]])

Referenz: offizielles Dokument von scikit-learn

Daten skalieren

Ich finde Japanisch seltsam. Wie nennt man Skalierung auf Japanisch? Verarbeiten Sie die Daten so, dass der Durchschnitt 0 und die Varianz 1 beträgt.

Probe (ry

Wie in der Dokumentation angegeben, kann es mit Pipeline kombiniert werden.

from sklearn import preprocessing
import numpy as np
X = np.array([[ 1., -1.,  2.],
              [ 2.,  0.,  0.],
              [ 0.,  1., -1.]])
X_scaled = preprocessing.scale(X)

print(X_scaled)
# array([[ 0.  ..., -1.22...,  1.33...],
#       [ 1.22...,  0.  ..., -0.26...],
#       [-1.22...,  1.22..., -1.06...]])

Es gibt verschiedene Typen wie StandardScaler und MinMaxScaler. Bitte lesen Sie das folgende Dokument (fit, transform API wächst).

Referenz: offizielles Dokument von scikit-learn

Modell Bestätigung

K Falten, während sich das Etikettenverhältnis gut anfühlt

Wenn KFold split () aufruft, reicht es aus, ein Array mit mehreren Dimensionen des Beispiels einzugeben, StratifiedKFold muss jedoch ein Array mit Beschriftungen eingeben. Warum das? Dies liegt daran, dass sich das Verhältnis der Bezeichnungen der Lehrerdaten dadurch gut anfühlt.

from sklearn.model_selection import StratifiedKFold
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([0, 0, 1, 1])
skf = StratifiedKFold(n_splits=2)
skf.get_n_splits(X, y)

print(skf)  

for train_index, test_index in skf.split(X, y):
   print("TRAIN:", train_index, "TEST:", test_index)
   X_train, X_test = X[train_index], X[test_index]
   y_train, y_test = y[train_index], y[test_index]

Referenz: offizielles Dokument von scikit-learn

Vorverarbeitung-> nahtloses Lernen

Beim Umgang mit Daten, die eine Vorverarbeitung erfordern, scheint der Code sauber zu sein, wenn die Vorverarbeitung und Extraktion von Features in model.fit () durchgeführt werden kann. Ein System namens Pipeline macht dies möglich. Es bleibt der Name.

Before

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.svm import LinearSVC

# build the feature matrices
ngram_counter = CountVectorizer(ngram_range=(1, 4), analyzer='char')
X_train = ngram_counter.fit_transform(data_train)
X_test  = ngram_counter.transform(data_test)

# train the classifier
classifier = LinearSVC()
model = classifier.fit(X_train, y_train)

# test the classifier
y_test = model.predict(X_test)

After

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.svm import LinearSVC

# build the pipeline
ppl = Pipeline([
              ('ngram', CountVectorizer(ngram_range=(1, 4), analyzer='char')),
              ('clf',   LinearSVC())
      ])

# train the classifier
model = ppl.fit(data_train)

# test the classifier
y_test = model.predict(data_test)

Der Code stammt aus dem Blog-Beitrag unten, aber es gibt auch eine Feature Union am Ende des Artikels.

Referenz: Verwenden von Pipelines und FeatureUnions in scikit-learn

Bewertungsindex

Logistischer Verlust

Ich möchte das Scicit-Learn-Ökosystem auch mit meinem eigenen Lerngerät nutzen

Wenn Sie ein Modell verwenden müssen, das nicht von scikit-learn bereitgestellt wird, müssen Sie es selbst implementieren. Nach der Implementierung des Modells müssen zur Validierung eine Kreuzvalidierung und eine Rastersuche durchgeführt werden. Wenn Sie auf die Schiene von model_selection von scikit-learn gelangen können, können Sie diese Implementierung überspringen. Dies kann erreicht werden, indem BaseEstimator bei der Implementierung des Modells geerbt wird.

Der im folgenden Referenzartikel gezeigte Code wird zitiert.

from sklearn.base import BaseEstimator

class MyEstimator(BaseEstimator):
    def __init__(self, param1, param2):
        self.param1 = param1
        self.param2 = param2

    def fit(self, x, y):
        return self 

    def predict(self, x):
        return [1.0]*len(x) 

    def score(self, x, y):
        return 1

    def get_params(self, deep=True):
        return {'param1': self.param1, 'param2': self.param2}

    def set_params(self, **parameters):
        for parameter, value in parameters.items():
            setattr(self,parameter, value)
        return self

Wenn Sie ClassifierMixin und RegressorMixin erben, können Sie übrigens model.score verwenden, das auf der Scikit-Learn-Seite implementiert ist. Ich möchte positiv auf die Schienen kommen.

Referenz: Implementieren Sie einen selbst erstellten Mindestschätzer (Estimator) mit scikit-learn

Recommended Posts

Überarbeitetes Scikit-Lernen
Isomap mit Scikit-lernen
scikit-learn Importfehler
DBSCAN mit Scikit-Learn
Clustering mit Scikit-Learn (1)
Scikit-learn einfach aktualisieren.
Clustering mit Scikit-Learn (2)
PCA mit Scikit-Learn
kmeans ++ mit scikit-learn