LogisticRegression

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
EinSportfreund
User
Beiträge: 2
Registriert: Sonntag 2. September 2018, 19:39

Guten Tag,

ich bin gerade dabei mich in Machine Learning einzuarbeiten und bleibe gerade an einem Problem hängen. Ich programmiere viel mit perl, hier gibt es aber keine anständigen Tools für Machine Learning, deswegen steige ich gerade erst auf Python um.

Hier das Problem:
Ich versuche, eine logistische Regression durchzuführen und habe dieses Beispiel versucht auf eigene Daten zu verwenden:
https://universalflowuniversity.com/Boo ... Python.pdf
Seite 57

Mein Code:

Code: Alles auswählen

#!/usr/bin/env python3
import numpy as np
import matplotlib.pyplot as plt
import mglearn
from sklearn.linear_model import LogisticRegression

daten = np.genfromtxt('data1.txt',delimiter='\t')

X = daten[1::,1:3:1]
y = daten[1::,0:1:1]
y = np.concatenate(y)
y = y.astype(int)

fig, ax = plt.subplots()
clf = LogisticRegression().fit(X, y)
print ("clf.coef_:")
print (clf.coef_)
mglearn.plots.plot_2d_separator(clf, X, fill=False)
mglearn.discrete_scatter(X[:, 0], X[:, 1], y)
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")
plt.show()
Ich habe lediglich die Datenquelle geändert, statt mglearn.datasets.make_forge() lese ich aus einer Datei.
Wenn ich data1.txt verwende (das sind die Werte aus dem Beispiel, nur als Datei), bekomme ich ein plausibles Ergebnis, bei dem eine Gerade die 2 Datenpunkte teilt.
Bild
Wenn ich aber die Daten aus data2.txt verwende (das sind eigene Daten), dann bekomme ich keine plausible Gerade mehr.
Bild

Gibt es hier jemanden, der sich mit dieser Regression auskennt und kann mir einen Tipp geben?

Grüße, Sportfreund

data1.txt
1 9.96346605 4.59676542
0 11.0329545 -0.16816717
1 11.54155807 5.21116083
0 8.69289001 1.54322016
0 8.1062269 4.28695977
1 8.30988863 4.80623966
1 11.93027136 4.64866327
0 9.67284681 -0.20283165
1 8.34810316 5.13415623
1 8.67494727 4.47573059
1 9.17748385 5.09283177
1 10.24028948 2.45544401
0 8.68937095 1.48709629
0 8.92229526 -0.63993225
1 9.49123469 4.33224792
1 9.25694192 5.13284858
1 7.99815287 4.8525051
0 8.18378052 1.29564214
0 8.7337095 2.49162431
1 9.32298256 5.09840649
0 10.06393839 0.99078055
0 9.50048972 -0.26430318
0 8.34468785 1.63824349
0 9.50169345 1.93824624
1 9.15072323 5.49832246
0 11.563957 1.3389402

data2.txt
1 76 154
0 51 101
0 51 102
0 52 103
0 55 104
0 50 105
0 45 106
0 45 107
0 50 108
1 70 134
0 50 110
1 68 133
0 49 112
1 64 138
0 55 114
1 70 135
1 72 166
0 54 117
0 53 118
0 52 119
0 46 120
0 61 121
1 77 140
0 44 123
1 67 150
1 68 151
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich bin da kein Experte, aber die meisten ML Algorithmen kennen Hyperparameter. So auch dieser:

http://scikit-learn.org/stable/modules/ ... ssion.html

Spiel mit C und tol rum, und schau, ob es das Ergebnis verbessert. Für libsvm (Cousin von liblinear das du verwendest) haben die ein Skript, dass das automatisiert. Da generieren sie einfach Parameterpaare und prüfen danach wie gut die Klassifikation ist.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Habe einfach mal die Daten in data2.txt normalisiert und kriege einen schönen Plot

Code: Alles auswählen

daten = np.genfromtxt('data2.txt', delimiter='\t')

X = daten[:, 1:3]   # warum [1::,1:3:1] ?   daten ist nicht 3 Dim   daten.shape = (26, 3) und fängt bei 0 an

# y = np.concatenate(y)    #  überflüssig
# y = y.astype(int)

y = daten[:, 0].astype(int)

# normalizing X
mean_c0 = np.mean(X[:,0])
mean_c1 = np.mean(X[:,1])

std_c0 = np.std(X[:,0])
std_c1 = np.std(X[:,1])

X[:,0] = (X[:,0] - mean_c0) / std_c0
X[:,1] = (X[:,1] - mean_c1) / std_c1

# plotten
fig, ax = plt.subplots()
clf = LogisticRegression().fit(X, y)
print ("clf.coef_:")
print (clf.coef_)
plot_2d_separator(clf, X, fill=False)
discrete_scatter(X[:, 0], X[:, 1], y)
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")
plt.show()
Bild
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
EinSportfreund
User
Beiträge: 2
Registriert: Sonntag 2. September 2018, 19:39

Hallo ThomasL,

vielen Dank für die schnelle Antwort. Jetzt schaut bei mir die Gerade auch plausibel aus.

Grüße, Sportfreund
Antworten