[Python] Ich habe die Theorie und Implementierung der logistischen Regression gründlich erklärt

Einführung

In diesem Artikel werden wir die logistische Regression mithilfe von Tensorflow und sckit-learn implementieren.

Ich habe die lineare Regression im vorherigen Artikel zusammengefasst. Wenn Sie möchten, lesen Sie bitte den folgenden Artikel.

Versuchen Sie eine multiple Regressionsanalyse mit Scicit-Learn, Tensorflow und Keras in Python

Dieses Mal werden wir den Iris-Datensatz verwenden.

Über den Iris-Datensatz

Irisdaten sind Daten einer Blumensorte namens Iris.

Es gibt 50 Daten zu jeder der drei Irisarten "Setosa", "Virginica" und "Virginica" für insgesamt 150 Daten.

Schauen wir uns den Inhalt an.

from sklearn.datasets import load_iris
import pandas as pd

iris = load_iris()
iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)

print(iris_df.head())

sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) 0 5.1 3.5 1.4 0.2 1 4.9 3.0 1.4 0.2 2 4.7 3.2 1.3 0.2 3 4.6 3.1 1.5 0.2 4 5.0 3.6 1.4 0.2

Da jeder Spaltenname in "iris.feature_names" gespeichert ist, können Sie die obigen Daten ausgeben, indem Sie sie an das Argument "Dataframe of Pandas" übergeben.

"Sepal Length" speichert die Blütenblattlänge, "Sepal Width" speichert die Blütenblattbreite, "Petal Length" speichert die Blütenblattlänge und "Petal Width" speichert die Daten der Blütenblattbreite. Ich bin.

Sie können das richtige Antwortetikett wie unten gezeigt anzeigen.

print(iris.target)

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]

Auf diese Weise werden die Iris-Sorten "setosa", "versicolor" und "virginica" auf 0, 1 bzw. 2 gesetzt.

Dieses Mal werden wir die Daten von "virginica" löschen, da wir eine binäre Klassifizierung durch logistische Regression durchführen werden.

Erstellen Sie dann basierend auf der Zielvariablen ein Modell, das angibt, ob es sich um "setosa" oder "versicolor" handelt.

Über logistische Regression

Ich werde die logistische Regression erläutern.

Logistische Regression heißt Regression, aber wir machen eine binäre Klassifikation.

Vorhersage durch Berechnung der Wahrscheinlichkeit anhand einiger erklärender Variablen. In diesem Beispiel werden wir anhand der Daten zur Länge und Breite der Blütenblätter feststellen, ob es sich um "Setosa" oder "Versicolor" handelt.

Lassen Sie uns nun ein wenig überspringen, aber betrachten wir ein Modell für maschinelles Lernen, wenn alle Modelle linear angenähert sind.

Unter der Annahme, dass die Zielvariable "die Anzahl der Besucher des Pools" und die erklärende Variable "Temperatur" ist, wird eine lineare Regression durchgeführt.

Anzahl der Besucher = β_0 + β_1 × Temperatur

In diesem Fall wird die Anzahl der Besucher auf der linken Seite als Antwortvariable und die Formel auf der rechten Seite als linearer Prädiktor bezeichnet.

Aber das ist offensichtlich ein schlechtes Modell, nicht wahr? Weil die Formel auf der rechten Seite je nach Temperatur negativ sein kann, die Anzahl der Besucher jedoch nicht negativ sein kann.

Ändern Sie daher wie folgt, damit die Antwortvariable dem linearen Prädiktor entspricht.

log (Anzahl der Besucher) = β_0 + β_1 × Temperatur

Durch Anwenden der logarithmischen Funktion auf die linke Seite auf diese Weise konnten wir beide Seiten korrekt korrespondieren lassen. Die logarithmische Funktion wird in diesem Fall als Verknüpfungsfunktion bezeichnet.

Als nächstes machen wir das Bestehen der Aufnahmeprüfung zur Zielvariablen. In diesem Fall ist es natürlich 0 oder 1, weil es bestanden hat oder nicht.

Stellen wir die erklärende Variable auf die Lernzeit ein. Die folgenden Modelle können berücksichtigt werden.

Pass / Fail (1, 0) = β_0 + β_1 × Lernzeit

Dieses Modell ist auch kein gutes Modell. Die linke Seite ist nur 0 oder 1, aber die rechte Seite entspricht offensichtlich nicht dieser.

Was ist dann, wenn die Zielvariable die Erfolgsquote wie folgt ist?

Erfolgsquote = β_0 + β_1 × Lernzeit

Dieses Modell ist auch kein gutes Modell. Die Erfolgsquote auf der linken Seite reicht von 0 bis 1, jedoch nicht auf der rechten Seite.

Damit diese Antwortvariable dem linearen Prädiktor entspricht, wird eine Logit-Funktion als Verknüpfungsfunktion verwendet. Die Logit-Funktion wird durch die folgende Formel ausgedrückt.

f(p) = ln(\frac{p}{1-p}) \quad (0 < p < 1))

Informationen zur Logit-Funktion finden Sie im Artikel hier.

Für Ereignis A, das mit der Wahrscheinlichkeit p auftritt, wird das Verhältnis der Wahrscheinlichkeit, dass A auftritt, zu der Wahrscheinlichkeit, dass es nicht auftritt, $ \ frac {p} {1-p} $ als "ods" bezeichnet.

Die Logit-Funktion hat die folgende Form.

image.png

Wenn Sie die Logit-Funktion als Link-Funktion verwenden, können Sie das folgende Modell mit der Erfolgsrate p erstellen.

ln(\frac{p}{1-p}) = β_0 + β_1 × Lernzeit

Dieses Modell ist ein gutes Modell, da die linke und die rechte Seite übereinstimmen.

Was wir jetzt wollen, ist ein Modell, das die Erfolgsrate vorhersagt. Lösen wir also p. Nehmen wir an, dass die Lernzeit $ x_1 $ beträgt.

\begin{align}
ln(\frac{p}{1-p}) &= β_0 + β_1 × x_1\\
ln(\frac{p}{1-p}) &= z \quad  (z = β_0 + β_1 × x_1)\\
\frac{p}{1-p}&=e^z\\
p& = e^z - e^zp\\
p &= \frac{e^z}{1+e^z}\\
p & = \frac{1}{1+e^{-z}}
\end{align}

Auf diese Weise kann die Sigmoidfunktion abgeleitet werden. Verallgemeinern Sie z etwas mehr

z= β_0 + β_1 × x_1  + β_2 × x_2 ... + β_n × x_n

Sagen wir. Dies ist die Formel für die logistische Regression. Ziel ist die Optimierung von β.

Über die β-Optimierung

Unter Berücksichtigung der folgenden Gleichung kann β durch die Methode der kleinsten Quadrate auf die gleiche Weise wie die multiple Regressionsanalyse optimiert werden.

ln(\frac{p}{1-p}) = β_0 + β_1 × x_1  + β_2 × x_2 ... + β_n × x_n

Die Methode der kleinsten Quadrate finden Sie im Artikel hier.

Die andere ist, die wahrscheinlichste Methode zu verwenden.

Über die wahrscheinlichste Methode

Die wahrscheinlichste Methode ist im Artikel hier leicht verständlich zusammengefasst. Bitte beziehen Sie sich darauf.

Ich werde kurz die wahrscheinlichste Methode erklären.

Um über die wahrscheinlichste Methode nachzudenken, müssen wir die Wahrscheinlichkeit und die Wahrscheinlichkeitsfunktion verstehen.

Das Folgende ist ein Zitat aus der Kotobank.

Yudo [Wahrscheinlichkeitswahrscheinlichkeit] In der Wahrscheinlichkeitsdichtefunktion wird der beobachtete Wert der Wahrscheinlichkeitsvariablen zugeordnet. Mit anderen Worten ist es ein Wert, der durch den beobachteten Wert der Wahrscheinlichkeitsdichte bewertet wird. Wenn dies als eine Funktion einer unbekannten Population angesehen wird, wird es insbesondere als Wahrscheinlichkeitsfunktion bezeichnet. Der natürliche Logarithmus der Wahrscheinlichkeitsfunktion wird als logarithmische Wahrscheinlichkeit bezeichnet. Angesichts der beobachteten Werte und ihrer Wahrscheinlichkeitsverteilung ergibt der Wert der Matrix, der die Wahrscheinlichkeit oder die logarithmische Wahrscheinlichkeit maximiert, eine natürliche Schätzung der Matrix. Dies wird als wahrscheinlichster Schätzer bezeichnet und weist verschiedene günstige Aggressionseigenschaften auf, z. B. eine enge Übereinstimmung mit dem wahren Wert der Population, wenn die Stichprobengröße zunimmt, und eine Normalverteilung.

Das Folgende ist ein Zitat aus Wikipedia.

Was ist die Wahrscheinlichkeitsfunktion? Wenn in der Statistik ein Ergebnis unter einer bestimmten Voraussetzung erscheint, wird aus dem Beobachtungsergebnis im Gegenteil abgeleitet, dass die Voraussetzung "was" war. Der numerische Wert, der die Plausibilität (Plausibilität) darstellt, wird als eine Funktion mit "was" als Variable angesehen. Es wird auch einfach Wahrscheinlichkeit genannt.

Ich bin mir nicht sicher, also überprüfen wir es mit einer Formel.

Wenn N Daten $ x_1, x_2, x_3, ..., x_n $ beobachtet werden, wird die Wahrscheinlichkeitsfunktion durch die folgende Formel ausgedrückt, wobei p (x) die Wahrscheinlichkeit ist, dass jeder Wert auftritt.

p(x_1)p(x_2)....p(x_3)

Von diesem Punkt an verstehe ich, dass die wahrscheinlichste Methode eine Methode zur Schätzung der "Wahrscheinlichkeitsverteilung, der die Originaldaten folgen" ist, unter Berücksichtigung der "Wahrscheinlichkeit, dass die Daten auftreten, wenn die Daten beobachtet werden". Bitte denken Sie nach.

Zum Beispiel sollten Sie eine Münze werfen. Natürlich haben Vorder- und Rückseite der Münze die gleiche Wahrscheinlichkeit, es sei denn, es gibt einen Tintenfisch.

Es ist der "Bernouy-Prozess" in der Statistik.

In der realen Welt ist es jedoch selten, mit Dingen wie Münzen umzugehen, deren Wahrscheinlichkeitsverteilung sinnlich bekannt ist. Diesmal gehen wir also davon aus, dass die Chancen, die Vorder- und Rückseite der Münze zu erhalten, nicht gleich sind.

Wie finde ich die Wahrscheinlichkeitsverteilung, der diese Münze folgt?

Es scheint, dass Sie viele Münzen werfen und Aufzeichnungen führen sollten. Als ich die Münze dreimal warf, wurde sie vorne, vorne und hinten.

Wenn die Wahrscheinlichkeit, dass die Vorderseite erscheint, $ p $ ist, beträgt die Wahrscheinlichkeit, dass die Rückseite erscheint, $ 1-p , also die Wahrscheinlichkeit, dass dieses Ereignis eintritt, dh die Wahrscheinlichkeitsfunktion $p^2(1-p)$$

Es wird sein. Nun ist das passiert. Wenn beispielsweise die Wahrscheinlichkeit, dass die Münze auf der Vorderseite erscheint, $ \ frac {1} {2} $ beträgt und die Wahrscheinlichkeit, dass die Münze auf der Rückseite erscheint, $ \ frac {1} {2} $ beträgt, beträgt die Wahrscheinlichkeit, dass dieses Ereignis eintritt, $ \ frac {1} {8}. Es wird $ sein. Wenn die Wahrscheinlichkeit, dass die Münze auf der Vorderseite erscheint, $ \ frac {2} {3} $ beträgt und die Wahrscheinlichkeit, dass die Münze auf der Rückseite erscheint, $ \ frac {1} {3} $ beträgt, beträgt die Wahrscheinlichkeit, dass dieses Ereignis eintritt, $ \ frac {4} {27} $ Es wird sein.

Denken Sie auf diese Weise, wenn Sie die Wahrscheinlichkeit berücksichtigen, dass die Münze $ p $ herauskommt, und die Wahrscheinlichkeit, dass die Münze $ 1-p $ herauskommt, unter der Bedingung, dass "die Münze dreimal geworfen wird und sie vorne, vorne, hinten wird" Darüber hinaus wird die wahrscheinlichste Methode verwendet, wenn berücksichtigt wird, welche Art von $ p $ wahrscheinlich (wahrscheinlicher) ist.

Nun ist das Phänomen aufgetreten, dass "wenn ich dreimal eine Münze geworfen habe, war es vorne, vorne, hinten", also ist das plausible $ p $ "wenn ich dreimal eine Münze geworfen habe, vorne, vorne, hinten". Es ist $ p $, das die Wahrscheinlichkeit maximiert, dass das Ereignis "war" eintreten wird.

Mit anderen Worten, um das "wahrscheinliche" $ p $ (wahrscheinlichste Methode) zu finden, ist es ausreichend, $ p $ auszuwählen, das die größte Wahrscheinlichkeitsfunktion hat, nämlich die "Wahrscheinlichkeit des Ereignisses".

Mit anderen Worten, in diesem Beispiel kann $ p $ erhalten werden, das $ p ^ 2 (1-p) $ maximiert, so dass der Logarithmus beider Seiten zur Differenzierung verwendet werden kann, oder der Wert kann so wie er ist differenziert werden und der Maximalwert ist $ p $. Es sieht gut aus, wenn Sie danach fragen.

Auf diese Weise wird das Verfahren zum Ermitteln der Wahrscheinlichkeitsverteilung, die die ursprünglichen Daten aus dem Ergebnis ergeben, als wahrscheinlichste Schätzung oder Bayes'sche Schätzung bezeichnet.

Dieses Mal wusste ich von Anfang an, dass es der Bernoulli-Verteilung auf der Vorder- und Rückseite folgen würde, so dass ich die Wahrscheinlichkeitsfunktion leicht finden konnte, aber in Wirklichkeit muss ich vom Standpunkt der Wahrscheinlichkeitsverteilung (Normalverteilung usw.) aus denken, dass die Originaldaten folgen. Es wird schwieriger, weil es nicht sein wird.

Die Folie von hier war sehr einfach zu verstehen.

Nochmals zur β-Optimierung

Betrachten wir die Wahrscheinlichkeitsfunktion für diese logistische Regression. Für die logistische Regression ist die Wahrscheinlichkeit, dass die Zielvariable für diese Daten 1 ist, gegeben, wenn die Zielvariable bei (0, 1) und die erklärenden Variablen $ x_1, x_2, x_3, ..., x_n $ für einige Daten gegeben sind. $ p $ ist

p  = \frac{1}{1+e^{-z}} \quad (z= β_0 + β_1 × x_1  + β_2 × x_2 ... + β_n × x_n)

Es wird sein. Die Wahrscheinlichkeit, dass die Zielvariable 1 ist, beträgt $ p $, und die Wahrscheinlichkeit, dass die Zielvariable 0 ist, beträgt $ 1-p $.

Wenn bekannt ist, ob die Zielvariable (0, 1) für "bestimmte Daten" ist, dh welche Daten sind diese Daten (in diesem Irisbeispiel "Setosa" oder "Virginica"? Denken Sie darüber nach, wann Sie es wissen.

Unter der Annahme, dass die Wahrscheinlichkeit, dass die "bestimmten Daten" die Daten der "Zielvariablen" sind, $ L $ ist, ist $ t_n $ die Zielvariable (0, 1) unter Verwendung des obigen $ p $ (Wahrscheinlichkeit, dass die Zielvariable 1 ist). )

L = p^{t_n}(1-p)^{1-t_n}

Kann ausgedrückt werden als. Sie können sehen, dass wenn die Zielvariable 1 ist, $ L $ $ p $ ist und wenn die Zielvariable 0 ist, $ L $ $ 1-p $ ist.

Mit anderen Worten, $ L $ ist die "Wahrscheinlichkeit des Ereignisses", wenn die Zielvariable bekannt ist, dh wenn das Ergebnis bekannt ist. Wenn Sie $ p $ finden, das $ L $ maximiert, was die Wahrscheinlichkeit ist, dass das Ereignis eintritt, können Sie unter der Bedingung, dass das Ereignis eingetreten ist, denken, dass $ p $ ein plausibles $ p $ ist. Ich kann es schaffen

Dieses Beispiel galt für ein Datenelement. Betrachten wir nun alle Daten.

Da es für jede Daten unabhängig ist, kann die Gesamtwahrscheinlichkeitsfunktion wie folgt als Produkt von $ n $ Datenwahrscheinlichkeitsfunktionen betrachtet werden.

L(β)= \prod_{n = 1}^{N}
p_n^{t_n}(1-p_n)^{1-t_n}

Finden Sie $ p $, das die Wahrscheinlichkeitsfunktion $ L (β) $ für diese $ n $ -Daten maximiert, dh $ β $ (weil $ p $ eine Funktion von $ β $ ist). Auf diese Weise scheint es möglich zu sein, den Parameter $ β $ zu optimieren.

Um die Berechnung der obigen Formel zu vereinfachen, nehmen Sie den Logarithmus beider Seiten und addieren Sie ein Minus, um die folgende Formel zu erhalten.

E(β) = -logL(β) = - \sum^N_{n = 1}
\{t_nlogp_n + (1-t_n)log(1-p_n)\}

Das auf diese Weise abgeleitete $ E (β) $ wird als Kreuzentropiefehlerfunktion bezeichnet.

Implementiert mit scikit-learn

Lassen Sie es uns mit sckit-learn implementieren. Lassen Sie uns zunächst den Datensatz vorbereiten.

from sklearn.datasets import load_iris
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import seaborn as sns
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn import metrics
import matplotlib.pyplot as plt

iris = load_iris()
iris_data = iris.data[:100]
iris_target_data = pd.DataFrame(iris.target[:100], columns=['Species'])
iris_df = pd.DataFrame(iris_data, columns=iris.feature_names)

print(iris_df)

sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) 0 5.1 3.5 1.4 0.2 1 4.9 3.0 1.4 0.2 2 4.7 3.2 1.3 0.2 3 4.6 3.1 1.5 0.2 4 5.0 3.6 1.4 0.2 .. ... ... ... ... 95 5.7 3.0 4.2 1.2 96 5.7 2.9 4.2 1.3 97 6.2 2.9 4.3 1.3 98 5.1 2.5 3.0 1.1 99 5.7 2.8 4.1 1.3

Wir werden die beiden Daten "setosa" und "versicolor" klassifizieren. Daher beschäftigen wir uns nur mit den ersten 100 Daten.

Die ersten 50 sind Daten über "Setoba" und die letzten 50 sind Daten über "Versicolor".

Werfen wir einen Blick auf den Inhalt von iris_target_data.

print(iris_target_data)

Species 0 0 1 0 2 0 3 0 4 0 .. ... 95 1 96 1 97 1 98 1 99 1

Auf diese Weise ist es ein Datenrahmen, der 0- und 1-Daten speichert.

Das ursprüngliche numpy-Array wurde an den Datenrahmen zurückgegeben, da es die unten gezeigte Apply-Methode des Datenrahmens verwendet.

def species(num):
    if num == 0:
        return 'setosa'
    else:
        return 'versicolor'


iris_target_speacies = iris_target_data['Species'].apply(species)
print(iris_target_speacies)

0 setosa 1 setosa 2 setosa 3 setosa 4 setosa ...
95 versicolor 96 versicolor 97 versicolor 98 versicolor 99 versicolor

Wenn Sie auf diese Weise die Apply-Methode von Dataframe verwenden, können Sie die durch das Argument für die angegebene Spalte angegebene Funktion ausführen und den Dataframe empfangen, dem der Rückgabewert zugewiesen ist. Sie können horizontal kombinieren, indem Sie "axis = 1" angeben.

Der folgende Code kombiniert "iris_df" und "iris_target_speacies".

iris_all_data = pd.concat([iris_df, iris_target_speacies], axis=1)
print(iris_all_data)

sepal length (cm) sepal width (cm) ... petal width (cm) Species 0 5.1 3.5 ... 0.2 setosa 1 4.9 3.0 ... 0.2 setosa 2 4.7 3.2 ... 0.2 setosa 3 4.6 3.1 ... 0.2 setosa 4 5.0 3.6 ... 0.2 setosa .. ... ... ... ... ... 95 5.7 3.0 ... 1.2 versicolor 96 5.7 2.9 ... 1.3 versicolor 97 6.2 2.9 ... 1.3 versicolor 98 5.1 2.5 ... 1.1 versicolor 99 5.7 2.8 ... 1.3 versicolor

Lassen Sie uns die Daten mit dem folgenden Code visualisieren. Das Streudiagramm und das Häufigkeitsverhältnis für jede Daten werden angezeigt.

sns.pairplot(iris_all_data, hue='Species')
plt.show()

image.png

Es scheint, dass solche Daten klassifiziert werden können.

Schauen wir uns die Häufigkeitstabelle für "Kelchblattlänge" im folgenden Code an.

sns.countplot('sepal length (cm)', data=iris_all_data, hue='Species')
plt.show()

image.png

Ich denke, Sie haben die Daten irgendwie verstanden.

Lerne wie es ist

Erstellen wir ein Modell mit dem folgenden Code. Sie werden lernen, wie es ist, nicht zum Training und zum Testen.

logistic_model = LogisticRegression()
logistic_model.fit(iris_df, iris_target_data)

Damit ist die Modellerstellung abgeschlossen.

Mit dem folgenden Code

β_1,β_2,β_3,β_4

Sie können den Wert von ausgeben.

print(logistic_model.coef_[0])

[-0.40247392 -1.46382925 2.23785648 1.00009294]

Es ist schwer zu verstehen, ob es so bleibt, wie es ist, daher gibt der folgende Code es auf leicht verständliche Weise aus.

coeff_df = DataFrame([iris_df.columns, logistic_model.coef_[0]]).T
print(coeff_df)

0 1 0 sepal length (cm) -0.402474 1 sepal width (cm) -1.46383 2 petal length (cm) 2.23786 3 petal width (cm) 1.00009

Aus diesem Ergebnis ist ersichtlich, dass, wenn die "Blütenblattlänge" oder "Blütenblattbreite" groß ist, die Wahrscheinlichkeit, "versicolor" zu sein, hoch ist und wenn die "Kelchblattbreite" oder "Kelchblattlänge" groß ist, die Wahrscheinlichkeit hoch ist, "setosa" zu sein.

Sie können sehen, dass dieses Ergebnis gut mit dem Diagramm übereinstimmt.

Lassen Sie uns die Vorhersagegenauigkeit mit dem folgenden Code überprüfen. Testen Sie mit dem trainierten Modell wie es ist.

...py print(logistic_model.score(iris_df, iris_target_data))


>1.0

Es kann mit 100% Genauigkeit klassifiziert werden. Es ist wunderbar.

Sie können die Genauigkeit auch mit den folgenden Methoden überprüfen.

```python
class_predict = logistic_model.predict(iris_df)
print(class_predict)

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]

Mit der Vorhersagemethode können Sie den vorhergesagten Wert für die auf diese Weise angegebenen Daten in Form eines Numpy-Arrays abrufen.

Diesclass_predictUnd das richtige Antwortetikettmetrics.accuracy_scoreDie Vorhersagegenauigkeit kann durch Vergleichen mit berechnet werden.

print(metrics.accuracy_score(iris_target_data, class_predict))

1.0

Natürlich ist diese Methode auch 100%.

####Lernen Sie separat für Tests und Schulungen Als nächstes untersuchen wir die Daten separat für Tests und Schulungen.

Der Code sieht folgendermaßen aus:

X_train, X_test, Y_train, Y_test = train_test_split(iris_df, iris_target_data)
logistic_model2 = LogisticRegression()
logistic_model2.fit(X_train, Y_train)
coeff_df2 = DataFrame([iris_df.columns, logistic_model2.coef_[0]]).T
print(coeff_df2)
print(logistic_model2.score(X_test, Y_test))

0 1 0 sepal length (cm) -0.381626 1 sepal width (cm) -1.33919 2 petal length (cm) 2.12026 3 petal width (cm) 0.954906 1.0

Selbst wenn die Daten für Tests und Schulungen getrennt wurden, betrug die Vorhersagegenauigkeit 100%. Es ist wunderbar.

#Implementiert mit Tensorflow Wenn Sie es mit Tensorflow implementieren, müssen Sie die ursprüngliche Formel verstehen. Lass uns nachsehen.

p  = \frac{1}{1+e^{-z}} \quad (z= β_0 + β_1 × x_1  + β_2 × x_2 ... + β_n × x_n)

Der Kreuzentropiefehler wird für die Verlustfunktion verwendet. Dies ist der logarithmische Wert der Wahrscheinlichkeitsfunktion multipliziert mit minus.

E(β) = -logL(β) = - \sum^N_{n = 1}
\{t_nlogp_n + (1-t_n)log(1-p_n)\}

Lassen Sie es uns implementieren. Bereiten wir die Daten mit dem folgenden Code vor.

from sklearn.datasets import load_iris
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import seaborn as sns
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn import metrics
import matplotlib.pyplot as plt
import tensorflow as tf

iris = load_iris()
iris_data = iris.data[:100]
iris_target_data = pd.DataFrame(iris.target[:100], columns=['Species'])
iris_df = pd.DataFrame(iris_data, columns=iris.feature_names)
X_train, X_test, Y_train, Y_test = train_test_split(iris_df, iris_target_data)

print(X_train.shape)
print(X_test.shape)
print(Y_train.shape)
print(Y_test.shape)

(75, 4) (25, 4) (75, 1) (25, 1)

Erstellen wir ein Modell mit dem folgenden Code.

X = tf.placeholder(dtype=tf.float32, shape=[None, 4])
W = tf.Variable(tf.zeros([4, 1]))
b = tf.Variable(tf.zeros([1, 1]))
y = tf.nn.sigmoid(tf.matmul(X, W) + b)
y = tf.clip_by_value(y, 1e-10, 1.0 - 1e-10)
t = tf.placeholder(dtype=tf.float32, shape=[None, 1])

Die erklärende Variable ist in X gespeichert, und die Zielvariable ist in t gespeichert. Y ist die obige FormelpEs entspricht.

Weil y logarithmisch ist, wenn es der Kreuzentropiefehlerfunktion zugewiesen wirdy = 0Da wird ein Fehler auftreten wenn y = tf.clip_by_value(y, 1e-10, 1.0 - 1e-10)Durch den Minimalwert von y1e-10Auf den Maximalwert von y 1.0 - 1e-10Ich mache es.

Optimieren wir die Kreuzentropiefehlerfunktion mit Adam mit der folgenden Formel.

cross_entropy = tf.reduce_sum(t * tf.log(y) + (1 - t) * tf.log(1 - y))
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)

Nachdem das Modell vollständig ist, führen wir es mit dem folgenden Code aus.

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for step in range(10000):
        if step % 10 == 0:
            loss_val = sess.run(cross_entropy, feed_dict={X: X_train, t: Y_train})
            W_val = sess.run(W)
            b_val = sess.run(b)
            print('Step: {},   Loss: {} W_val: {} b_val: {}'.format(step, loss_val, W_val, b_val))

        sess.run(train_step, feed_dict={X: X_train, t: Y_train})

    correct_prediction = sess.run(tf.cast(tf.greater(y, 0.5), tf.int32), feed_dict={X: X_train, t: Y_train})
 print ('Auswertung von Trainingsdaten:' ,metrics.accuracy_score (Y_train, korrekte_Vorhersage))

    test_data = tf.placeholder(dtype=tf.float32, shape=[None, 4])
    test_prediction = tf.nn.sigmoid(tf.matmul(test_data, W_val) + b_val)
    test_correct_prediction = sess.run(tf.cast(tf.greater(test_prediction, 0.5), tf.int32), feed_dict={test_data: X_test})

 print ('Auswertung von Testdaten:' ,metrics.accuracy_score (Y_test, test_correct_prediction))

Step: 9990, Loss: 0.10178631544113159 W_val: [[ 0.25520977] [-3.2158086 ] [ 3.3751483 ] [ 3.4625392 ]] b_val: [[-3.2248065]] Auswertung von Trainingsdaten: 1.0 Auswertung der Testdaten: 1.0

tf.greater(y, 0.5)Um 0.True für y größer als 5 und 0.Für y kleiner als 5 wird ein Boolescher Wert mit False zurückgegeben.

Estf.castKonvertiert True in 1 und False in 0 durch Zuweisen zu.

Dies ist das Ende der Implementierung durch Tensorflow.

#Am Ende Vielen Dank, dass Sie bisher bei uns geblieben sind.

Danke für deine harte Arbeit.

Recommended Posts

[Python] Ich habe die Theorie und Implementierung der logistischen Regression gründlich erklärt
[Python] Ich habe die Theorie und Implementierung des Entscheidungsbaums gründlich erklärt
[Python] Ich habe die Theorie und Implementierung der Support Vector Machine (SVM) ausführlich erklärt.
Python-Implementierung der Bayes'schen linearen Regressionsklasse
Deep Learning von Grund auf neu Die Theorie und Implementierung des mit Python erlernten Deep Learning Kapitel 3
Ich habe mir die Versionen von Blender und Python angesehen
Erstellen Sie eine Python-Umgebung, um die Theorie und Implementierung von Deep Learning zu erlernen
Ich möchte die Natur von Python und Pip kennenlernen
Theorie und Implementierung mehrerer Regressionsmodelle - warum Regularisierung erforderlich ist -
Die Geschichte von Python und die Geschichte von NaN
Ich habe die Geschwindigkeit von Hash mit Topaz, Ruby und Python verglichen
[Einführung in Python] Ich habe die Namenskonventionen von C # und Python verglichen.
Überprüfung der Theorie, dass "Python und Swift ziemlich ähnlich sind"
PRML Kapitel 4 Bayesianische logistische Regression Python-Implementierung
Überprüfen Sie das Konzept und die Terminologie der Regression
Ich kannte die Grundlagen von Python nicht
Ich habe versucht, Couseras logistische Regression in Python zu implementieren
Die Python-Projektvorlage, an die ich denke.
Ich habe die numerische Berechnung von Python durch Rust ersetzt und die Geschwindigkeit verglichen
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Ich habe die Geschwindigkeit der Listeneinschlussnotation für und während mit Python2.7 gemessen.
Als ich versuchte, über logistische Regression zu schreiben, fand ich schließlich den Mittelwert und die Varianz der logistischen Verteilung.
Zusammenfassung der Unterschiede zwischen PHP und Python
Die Antwort von "1/2" unterscheidet sich zwischen Python2 und 3
Warum die Python-Implementierung von ISUCON 5 Bottle verwendet
Angeben des Bereichs von Ruby- und Python-Arrays
Vergleichen Sie die Geschwindigkeit von Python Append und Map
Probieren Sie Progate Free Edition [Python I]
TRIE-Baumimplementierung mit Python und LOUDS
Ich habe einige der neuen Funktionen von Python 3.8 touched angesprochen
E / A-bezogene Zusammenfassung von Python und Fortan
Ich habe die Varianten von UKR gelesen und implementiert
Berücksichtigung der Stärken und Schwächen von Python
Erläuterung der Bearbeitungsentfernung und Implementierung in Python
Ich verglich die Geschwindigkeit von Go Language Web Framework Echo und Python Web Framework Flask
Ich habe die Geschwindigkeit regulärer Ausdrücke in Ruby, Python und Perl (Version 2013) verglichen.
[Python] Vergleich der Theorie und Implementierung der Hauptkomponentenanalyse durch Python (PCA, Kernel PCA, 2DPCA)
Lernen Sie während der Implementierung mit Scipy die Grundlagen der logistischen Regression und des mehrschichtigen Perzeptrons
"Lineare Regression" und "Probabilistische Version der linearen Regression" in Python "Bayes lineare Regression"
[Rezept des Trainers] Ich habe die Flasche des Python-Frameworks berührt.
Erläuterung des Konzepts der Regressionsanalyse mit Python Teil 2
Der Prozess der Installation von Atom und der Ausführung von Python
Erstellen Sie einen API-Server, um den Betrieb der Front-Implementierung mit Python3 und Flask zu überprüfen
Python - Erläuterung und Zusammenfassung der Verwendung der 24 wichtigsten Pakete
Ich verfolgte die Implementierung des Befehls du (erste Hälfte)
der Zen von Python
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
Visualisieren Sie den Bereich der internen und externen Einfügungen mit Python
Berechnen Sie den Regressionskoeffizienten der einfachen Regressionsanalyse mit Python
Referenz und Änderung der rekursiven Python-Obergrenze
Ich habe die Geschwindigkeit der Referenz des Pythons in der Liste und die Referenz der Wörterbucheinbeziehung aus der In-Liste verglichen.
Erläuterung des Konzepts der Regressionsanalyse mit Python Teil 1
Ich habe das Standardbetriebssystem und die Shell der Docker-Maschine überprüft
Ich verfolgte die Implementierung des Befehls du (zweite Hälfte)
Ich berührte Bachstelze (3). Untersuchung und Implementierung von Popup-Nachrichten.
Erläuterung des Konzepts der Regressionsanalyse mit Python Extra 1
Ein Memorandum über die Umsetzung von Empfehlungen in Python
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen