In diesem Artikel zeige ich Ihnen anhand eines Beispiels, wie die Nichtbeachtung des Codes zu falschen Ergebnissen beim Data Mining führen kann.
Es gibt einen großartigen Kurs [1], in dem die Schüler lernen, maschinelles Lernen zu erforschen. Bis zum Ende des Semesters bereiten die Studierenden einen Artikel vor. In den Vorlesungen wird ihnen gleichzeitig erklärt, wie es geht. Bei der Vorbereitung eines Artikels wird normalerweise ein Experiment mit Daten durchgeführt. Basierend auf den Ergebnissen des Semesters stehen bereits mehrere Arbeiten zur Einreichung in der Zeitschrift bereit.
Im MLDev-Projekt helfen wir daher beim Erstellen eines Vorlagen-Repositorys für die Teilnehmer dieses Kurses. Mit einer solchen Vorlage oder mit anderen Worten einer Vorlage können Sie schneller an einem Artikel arbeiten und die verschiedenen erforderlichen Tools weniger studieren.
Während ich die Arbeiten für das Frühjahr 2020 durchgesehen habe, interessierte mich eine ungewöhnliche Grafik in der Arbeit „Analyse der Eigenschaften eines Ensembles lokal approximierender Modelle“ [2]. Die Grafik mit den Ergebnissen des Experiments zeigt deutlich eine Lücke in den Werten der dargestellten Abhängigkeit. Aufgrund der Wahl der Anfangsdaten und der Eigenschaften dieser Abhängigkeit sollte es an dieser Stelle jedoch keine Lücke geben.
Es ist neugierig zu prüfen, warum solch ein unerwartetes Ergebnis in der Arbeit erzielt wurde.
Experiment wiederholen
, . , , . . , .
, , . , . .
. , , [2]. . .
Google Colab . MixtureLib
GitHub [3]. MixtureLib
. . , .
!git clone https://github.com/andriygav/MixtureLib.git
!python3 -m pip install MixtureLib/src/.
from mixturelib.localmodels import EachModelLinear
from mixturelib.hypermodels import HyperExpertNN, HyperModelDirichlet
from mixturelib.mixture import MixtureEM
. , .
correlations = []
sigmas = [0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,
1.0,0.03,0.04,0.05,0.06,0.07,0.08,0.09,
0.15,0.25,0.35,0.45,0.55,0.65,0.75,0.85,
0.95,0.11,0.12,0.13,0.14,0.15,0.22,0.27,
0.32,0.37,0.42,0.47,0.52,0.57,0.62,0.67,
0.72,0.77,0.82,0.87,0.92,0.97]
, EachModelLinear
, . . MixtureEM
HyperNetEM
, . , . , .
torch.random.manualseed(42)
first_model = EachModelLinear(input_dim=2)
second_model = EachModelLinear(input_dim=2)
list_of_models = [firstmodel, second_model]
HpMd = HyperExpertNN(inputdim=2, hiddendim=5,outputdim=2, epochs=1000)
mixture = MixtureEM(HyperParameters={'beta': 1.},
HyperModel=HpMd,
ListOfModels=listofmodels,
modeltype='sample')
. .
for i, sigma in enumerate(sigmas):
#
x1 = np.random.normal(0, 1, (200, 1))
x2 = np.random.normal(0, 1, (200, 1))
y1 = np.array([f1(x) for x in x1])
y2 = np.array([f2(x) for x in x2])
s1 = np.random.normal(0, sigma, 200).reshape((200, 1))
s2 = np.random.normal(0, sigma, 200).reshape((200, 1))
X1 = np.hstack([x1, s1])
X2 = np.hstack([s2, x2])
X = np.vstack([X1, X2])
Y = np.hstack([y1, y2])
realsecondw = np.array([[10.], [0.]])
realfirstw = np.array([[0.], [50.]])
Xtr = torch.FloatTensor(X)
Ytr = torch.FloatTensor(Y).view([-1,1])
#
# …
for i, sigma in enumerate(sigmas):
#
# ...
#
torch.random.manual_seed(42)
mixture.fit(X_tr, Y_tr)
predicted_first_w = mixture.ListOfModels[0].W.numpy()
predicted_second_w = mixture.ListOfModels[1].W.numpy()
weights = []
weights.append([predicted_first_w[0][0], predicted_first_w[1][0]])
weights.append([predicted_second_w[0][0], predicted_second_w[1][0]])
# ,
Y1 = X.dot(weights[0])
Y2 = X.dot(weights[1])
correlations.append(cor_Pearson(Y1, Y2))
, . , . , . , , . , .
, , . . , .
. , , , . , , , . , .
fit()
MixtureEM
. , , . . .
? fit()
. MixtureLib
, fit()
. .
, fit()
fit()
scikit-learn
, . partial_fit()
(. ).
, , . . , .
, . fit()
.
, .
, , . , .
, . , .
. , , ?
, , . , .
, .
[1] “ ”, - https://m1p.org
[2] - https://github.com/Intelligent-Systems-Phystech/2020_Project-51
[3] MixtureLib
- https://github.com/andriygav/MixtureLib
[4] - https://colab.research.google.com/drive/1DZoJN32EpTZVSi2N3BduRCRf-ZST8snP#scrollTo=1JopTLX4eMnX
PS Natürlich haben wir mit den Autoren des Artikels und der Bibliothek Kontakt aufgenommen und besprochen, was wir gefunden haben MixtureLib
. Der Fehler wurde bestätigt. Der Artikel wurde bereits im März erstellt, daher ist es bereits im Dezember schwierig, genau zu rekonstruieren, wie der ursprüngliche Graph erhalten wurde und wie das Experiment durchgeführt wurde. Dann fragt man sich, ob das Experiment in Teilen durchgeführt wurde. Vor allem, wenn Sie auf das Fehlen von Grafiken im Original-Notizbuch und auf diese Sigma-Liste achten:
sigmas = [0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,
1.0,0.03,0.04,0.05,0.06,0.07,0.08,0.09,
0.15,0.25,0.35,0.45,0.55,0.65,0.75,0.85,
0.95,0.11,0.12,0.13,0.14,0.15,0.22,0.27,
0.32,0.37,0.42,0.47,0.52,0.57,0.62,0.67,
0.72,0.77,0.82,0.87,0.92,0.97]