Daten auf eine Normalverteilung abbilden

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 wird gezeigt, wie die Box-Cox- und Yeo-Johnson-Transformationen über PowerTransformer verwendet werden, um Daten aus verschiedenen Verteilungen auf eine Normalverteilung abzubilden.

Tipps für die virtuelle Maschine

Nachdem der Start der virtuellen Maschine abgeschlossen 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 Vorgängen kann aufgrund der Einschränkungen von 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"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/preprocessing("Preprocessing and Normalization") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/preprocessing -.-> lab-49209{{"Daten auf eine Normalverteilung abbilden"}} sklearn/model_selection -.-> lab-49209{{"Daten auf eine Normalverteilung abbilden"}} ml/sklearn -.-> lab-49209{{"Daten auf eine Normalverteilung abbilden"}} end

Bibliotheken importieren

Zunächst müssen wir die erforderlichen Bibliotheken importieren: numpy, matplotlib, PowerTransformer, QuantileTransformer und train_test_split.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PowerTransformer
from sklearn.preprocessing import QuantileTransformer
from sklearn.model_selection import train_test_split

Konstanten festlegen

Wir werden die Konstanten für die Anzahl der Stichproben, die Schriftgröße und die Anzahl der Bins festlegen.

N_SAMPLES = 1000
FONT_SIZE = 6
BINS = 30

Zufällige Verteilungen erstellen

Wir werden sechs verschiedene Wahrscheinlichkeitsverteilungen generieren: Lognormal, Chi-Quadrat, Weibull, Gaußsche, Gleichverteilung und bimodale Verteilung.

rng = np.random.RandomState(304)
bc = PowerTransformer(method="box-cox")
yj = PowerTransformer(method="yeo-johnson")
qt = QuantileTransformer(n_quantiles=500, output_distribution="normal", random_state=rng)
size = (N_SAMPLES, 1)

## lognormale Verteilung
X_lognormal = rng.lognormal(size=size)

## Chi-Quadrat-Verteilung
df = 3
X_chisq = rng.chisquare(df=df, size=size)

## Weibull-Verteilung
a = 50
X_weibull = rng.weibull(a=a, size=size)

## Gaußsche Verteilung
loc = 100
X_gaussian = rng.normal(loc=loc, size=size)

## Gleichverteilung
X_uniform = rng.uniform(low=0, high=1, size=size)

## bimodale Verteilung
loc_a, loc_b = 100, 105
X_a, X_b = rng.normal(loc=loc_a, size=size), rng.normal(loc=loc_b, size=size)
X_bimodal = np.concatenate([X_a, X_b], axis=0)

Diagramme erstellen

Jetzt werden wir Diagramme für jede der sechs Verteilungen erstellen, die die ursprüngliche Verteilung und die transformierte Verteilung mit Hilfe der Box-Cox-, Yeo-Johnson- und Quantile-Transformation zeigen.

distributions = [
    ("Lognormal", X_lognormal),
    ("Chi-squared", X_chisq),
    ("Weibull", X_weibull),
    ("Gaussian", X_gaussian),
    ("Uniform", X_uniform),
    ("Bimodal", X_bimodal),
]

colors = ["#D81B60", "#0188FF", "#FFC107", "#B7A2FF", "#000000", "#2EC5AC"]

fig, axes = plt.subplots(nrows=8, ncols=3, figsize=plt.figaspect(2))
axes = axes.flatten()
axes_idxs = [
    (0, 3, 6, 9),
    (1, 4, 7, 10),
    (2, 5, 8, 11),
    (12, 15, 18, 21),
    (13, 16, 19, 22),
    (14, 17, 20, 23),
]
axes_list = [(axes[i], axes[j], axes[k], axes[l]) for (i, j, k, l) in axes_idxs]

for distribution, color, axes in zip(distributions, colors, axes_list):
    name, X = distribution
    X_train, X_test = train_test_split(X, test_size=0.5)

    ## durchführen von Potenztransformationen und Quantile-Transformation
    X_trans_bc = bc.fit(X_train).transform(X_test)
    lmbda_bc = round(bc.lambdas_[0], 2)
    X_trans_yj = yj.fit(X_train).transform(X_test)
    lmbda_yj = round(yj.lambdas_[0], 2)
    X_trans_qt = qt.fit(X_train).transform(X_test)

    ax_original, ax_bc, ax_yj, ax_qt = axes

    ax_original.hist(X_train, color=color, bins=BINS)
    ax_original.set_title(name, fontsize=FONT_SIZE)
    ax_original.tick_params(axis="both", which="major", labelsize=FONT_SIZE)

    for ax, X_trans, meth_name, lmbda in zip(
        (ax_bc, ax_yj, ax_qt),
        (X_trans_bc, X_trans_yj, X_trans_qt),
        ("Box-Cox", "Yeo-Johnson", "Quantile transform"),
        (lmbda_bc, lmbda_yj, None),
    ):
        ax.hist(X_trans, color=color, bins=BINS)
        title = "After {}".format(meth_name)
        if lmbda is not None:
            title += "\n$\\lambda$ = {}".format(lmbda)
        ax.set_title(title, fontsize=FONT_SIZE)
        ax.tick_params(axis="both", which="major", labelsize=FONT_SIZE)
        ax.set_xlim([-3.5, 3.5])

plt.tight_layout()
plt.show()

Zusammenfassung

In diesem Lab haben wir gelernt, wie man PowerTransformer verwendet, um Daten aus verschiedenen Verteilungen mithilfe der Box-Cox- und Yeo-Johnson-Transformationen auf eine Normalverteilung abzubilden. Wir haben auch gelernt, wie man QuantileTransformer verwendet, um jede beliebige Verteilung in eine Gaußsche Verteilung zu bringen. Es ist wichtig, die Daten vor und nach der Transformation zu visualisieren, da einige Transformationen bei bestimmten Datensätzen unwirksam sein können.