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.
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.
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.
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.
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.
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?
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.
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 β.
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.
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.
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
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.
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.
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()
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()
Ich denke, Sie haben die Daten irgendwie verstanden.
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_predict
Und das richtige Antwortetikettmetrics.accuracy_score
Die 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 Formel
Weil y logarithmisch ist, wenn es der Kreuzentropiefehlerfunktion zugewiesen wirdy = 0
Da wird ein Fehler auftreten wenn
y = tf.clip_by_value(y, 1e-10, 1.0 - 1e-10)
Durch den Minimalwert von y1e-10
Auf den Maximalwert von y
1.0 - 1e-10
Ich 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.cast
Konvertiert 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.