Neste artigo, mostrarei um exemplo de como a falta de atenção ao código pode levar a resultados incorretos na mineração de dados.
Há um ótimo curso [1] em que os alunos aprendem a fazer pesquisas sobre aprendizado de máquina. No final do semestre, os alunos elaboram um artigo. Nas palestras, eles são ensinados simultaneamente a fazer isso. Normalmente, a preparação de um artigo envolve a realização de um experimento com dados. Com base nos resultados do semestre, diversos artigos já estão prontos para serem submetidos à revista.
Assim, no projeto MLDev, ajudamos a criar um repositório de modelos para os alunos deste curso. Esse modelo, ou de outra forma, um modelo, permitirá que você comece a trabalhar em um artigo mais rápido e gaste menos tempo estudando as várias ferramentas necessárias.
Enquanto examinava os trabalhos da primavera de 2020, me interessei por um gráfico incomum no trabalho “Análise das propriedades de um conjunto de modelos que se aproximam localmente” [2]. O gráfico com os resultados do experimento mostra claramente uma lacuna nos valores da dependência apresentada. Mas com base na escolha dos dados iniciais e nas propriedades dessa dependência, não deve haver uma lacuna neste local.
É curioso verificar por que tal resultado inesperado foi obtido no trabalho.
Repetindo o experimento
, . , , . . , .
, , . , . .
. , , [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 Claro, entramos em contato e discutimos o que encontramos com os autores do artigo e a biblioteca MixtureLib
. O erro foi confirmado. O artigo foi feito em março, então em dezembro já é difícil reconstruir exatamente como o gráfico original foi obtido e como o experimento foi realizado. Então, questiona-se se o experimento foi realizado em partes. Principalmente se você prestar atenção na falta de gráficos no caderno original e nesta lista de sigma:
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]