この記事では、コードに注意を払わないと、データマイニングで誤った結果が生じる可能性がある例を示します。
学生が機械学習研究を行うことを学ぶ1つの素晴らしいコース[1]があります。学期の終わりまでに、学生は記事を準備します。講義では、同時にその方法を教えられます。通常、記事の準備には、データを使用した実験の実施が含まれます。学期の結果に基づいて、いくつかの論文はすでにジャーナルに提出する準備ができています。
そのため、MLDevプロジェクトでは、このコースの学生向けのテンプレートリポジトリの作成を支援します。このようなテンプレート、つまりテンプレートを使用すると、記事の作成をより迅速に開始でき、必要なさまざまなツールの学習を減らすことができます。
2020年春の作品を見ていると、「局所的に近似したモデルのアンサンブルの性質の分析」という作品の珍しいグラフに興味がありました[2]。実験の結果を含むグラフは、提示された依存関係の値のギャップを明確に示しています。しかし、初期データの選択とこの依存関係の特性に基づいて、この場所にギャップがあってはなりません。
なぜこのような予想外の結果が得られたのかを知りたい。
実験を繰り返す
, . , , . . , .
, , . , . .
. , , [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もちろん、私たちは記事の著者や図書館と私たちが見つけたものに連絡して話し合いましたMixtureLib
。エラーが確認されました。記事は3月に作成されたため、12月には、元のグラフがどのように取得され、どのように実験が行われたかを正確に再構築することはすでに困難です。それから、実験が部分的に行われたのかどうか疑問に思います。特に、元のノートブックとこのシグマのリストにグラフがないことに注意を払う場合:
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]