Seite 1 von 1

LogisticRegression

Verfasst: Sonntag 2. September 2018, 22:18
von EinSportfreund
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

Re: LogisticRegression

Verfasst: Montag 3. September 2018, 08:09
von __deets__
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.

Re: LogisticRegression

Verfasst: Montag 3. September 2018, 14:19
von ThomasL
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

Re: LogisticRegression

Verfasst: Montag 3. September 2018, 23:15
von EinSportfreund
Hallo ThomasL,

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

Grüße, Sportfreund