Scikit-Learn Column Transformer

Machine LearningMachine LearningBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden wir lernen, wie man Scikit-Learn's ColumnTransformer auf einem Dataset verwendet, das verschiedene Feature-Typen enthält. Diese Technik ist nützlich, wenn ein Dataset Komponenten enthält, die unterschiedliche Feature-Extraktions- und -Verarbeitungspipelines erfordern.

VM-Tipps

Nachdem die VM gestartet ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Operationen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills ml/sklearn -.-> lab-49087{{"Scikit-Learn Column Transformer"}} end

Dataset

Wir werden das 20 newsgroups-Dataset verwenden, das aus Beiträgen von Newsgroups zu 20 Themen besteht. Das Dataset wird in Trainings- und Testuntersetzungen aufgeteilt, basierend auf Nachrichten, die vor und nach einem bestimmten Datum veröffentlicht wurden. Wir werden nur Beiträge aus 2 Kategorien verwenden, um die Laufzeit zu beschleunigen.

categories = ["sci.med", "sci.space"]
X_train, y_train = fetch_20newsgroups(
    random_state=1,
    subset="train",
    categories=categories,
    remove=("footers", "quotes"),
    return_X_y=True,
)
X_test, y_test = fetch_20newsgroups(
    random_state=1,
    subset="test",
    categories=categories,
    remove=("footers", "quotes"),
    return_X_y=True,
)

Erstellen von Transformatoren

Wir werden Transformatoren erstellen, die Features aus dem Dataset extrahieren. Wir werden zwei Funktionen definieren, die die Datenumwandlung ausführen, und dann Scikit-Learn's FunctionTransformer verwenden, um Transformatoren zu erstellen.

def subject_body_extractor(posts):
    ## construct object dtype array with two columns
    ## first column = 'subject' and second column = 'body'
    features = np.empty(shape=(len(posts), 2), dtype=object)
    for i, text in enumerate(posts):
        ## temporary variable `_` stores '\n\n'
        headers, _, body = text.partition("\n\n")
        ## store body text in second column
        features[i, 1] = body

        prefix = "Subject:"
        sub = ""
        ## save text after 'Subject:' in first column
        for line in headers.split("\n"):
            if line.startswith(prefix):
                sub = line[len(prefix) :]
                break
        features[i, 0] = sub

    return features

subject_body_transformer = FunctionTransformer(subject_body_extractor)

def text_stats(posts):
    return [{"length": len(text), "num_sentences": text.count(".")} for text in posts]

text_stats_transformer = FunctionTransformer(text_stats)

Klassifizierungspipeline

Wir werden eine Pipeline erstellen, die Features aus dem Dataset extrahiert, kombiniert und einen Klassifizierer auf der kombinierten Featuremenge trainiert. Wir werden dazu Scikit-Learn's Pipeline und ColumnTransformer verwenden.

pipeline = Pipeline(
    [
        ## Extract subject & body
        ("subjectbody", subject_body_transformer),
        ## Use ColumnTransformer to combine the subject and body features
        (
            "union",
            ColumnTransformer(
                [
                    ## bag-of-words for subject (col 0)
                    ("subject", TfidfVectorizer(min_df=50), 0),
                    ## bag-of-words with decomposition for body (col 1)
                    (
                        "body_bow",
                        Pipeline(
                            [
                                ("tfidf", TfidfVectorizer()),
                                ("best", TruncatedSVD(n_components=50)),
                            ]
                        ),
                        1,
                    ),
                    ## Pipeline for pulling text stats from post's body
                    (
                        "body_stats",
                        Pipeline(
                            [
                                (
                                    "stats",
                                    text_stats_transformer,
                                ),  ## returns a list of dicts
                                (
                                    "vect",
                                    DictVectorizer(),
                                ),  ## list of dicts -> feature matrix
                            ]
                        ),
                        1,
                    ),
                ],
                ## weight above ColumnTransformer features
                transformer_weights={
                    "subject": 0.8,
                    "body_bow": 0.5,
                    "body_stats": 1.0,
                },
            ),
        ),
        ## Use a SVC classifier on the combined features
        ("svc", LinearSVC(dual=False)),
    ],
    verbose=True,
)

Training und Testing

Wir werden unsere Pipeline auf den Trainingsdaten anpassen und sie verwenden, um Themen für X_test vorherzusagen. Anschließend werden die Leistungsmesswerte unserer Pipeline ausgegeben.

pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)
print("Classification report:\n\n{}".format(classification_report(y_test, y_pred)))

Zusammenfassung

In diesem Lab haben wir gelernt, wie man Scikit-Learn's ColumnTransformer auf einem Dataset mit verschiedenen Featuretypen anwendet. Wir haben Transformatoren erstellt, die Features aus dem Dataset extrahierten und verwendet, um einen Klassifizierer auf der kombinierten Featuremenge zu trainieren. Der ColumnTransformer hat es uns ermöglicht, die verschiedenen Featuretypen in einer einzigen Pipeline zu verarbeiten.