Професионална програма
Loading...
dim4o avatar dim4o 289 Точки

Проблем с ЛАБ-а: резултатите, които се получават са зависими от средата

Здравейте,

Имам следния проблем с лаба към Linear and Logistic Regression. Лаба е лесен, но следния assert не минаваше:

assert_almost_equal(accuracy_score_quad, 0.8986949789869498, delta = 0.001)

Работя в Linux среда без Anaconda, като си инсталирам всичко, което ми трябва точно когато ми трябва. Реших, че това може да е проблем и затова пробвах под Windows с инсталация на Anaconda. Като резултат всички assert-и от лаба си минаваха както се очаква. Върнах се Linux средата (Ubuntu) премахнах всички инсталирани покрай курса пакети и си сложих Anaconda и си настроих всичко по най-стандартния начин. Въпреки това assert-a пак не минаваше. Пробвах още няколко неща, даже си вдигнах една виртуална Ubuntu машина и инсталирах всичко отначало и отново нямаше резултат. Пробвах и онлайн инструменти, т.е. трета (даже четвърта ако броим виртуалката) среда и там имаше различен резултат, но пак е около ~0.904. Само под Windows среда се получава ~0.899. По-долу съм извадил есенцията на проблема, като в коментарите съм написал резултатите в съответните среди:

import numpy as np
import pandas as pd

from nose.tools import *

from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import PolynomialFeatures

bank_data = pd.read_csv('./data/bank.csv', sep=";")
bank_features = bank_data.drop('y', axis=1)
bank_features = pd.get_dummies(bank_features)
bank_output = bank_data.loc[:,'y']

quad_feature_transformer = PolynomialFeatures(degree=2, interaction_only=True)
bank_features_quad = quad_feature_transformer.fit_transform(bank_features)

bank_model_quad = LogisticRegression(C=1e6)
bank_model_quad.fit(bank_features_quad, bank_output)
accuracy_score_quad = bank_model_quad.score(bank_features_quad, bank_output)

print("Accuracy: {}".format(accuracy_score_quad)) 
# Ubuntu output:          0.9028975890289759
# Ubuntu VM output:       0.90400353904
# http://jupyter.org/try: 0.9037823490378235
# Windows output:         0.89869497895

assert_almost_equal(accuracy_score_quad, 0.8986949789869498, delta = 0.001)

Ще съм благодарен ако някой ми даде идея защо се получават тези разминавания или работи под Linux или пробва ЛАБ-а на Ubuntu виртуалка да сподели резултатите.

Интересува ме кои резултати са по-обективни и защо се получава разминаването.

Тагове:
1
Machine Learning 12/03/2018 20:44:30
iordan_93 avatar iordan_93 Trainer 407 Точки

Здравейте,

Проблемът е от т. нар. reproducibility: не можете да получите същите резултати, защото нямате същите условия. В случая, това е seed-a на random generator-a. От него зависят много неща, в това число как ще се раздели dataset-a на training и testing.

При оценяване, съм фиксирал np.random.seed(1000) и е гарантирано, че при мен ще работи.

Ъпдейтвам файловете на лаба с тази корекция. Не е нужно да ъпдейтвате вашите файлове, но ако имате желание - направете го.

1
seandi avatar seandi 38 Точки

Благодаря Данчо за коментара!

0
dim4o avatar dim4o 289 Точки

Някои от резултатити, които получавам са същите като твоите след като си настроя MKL променливата. Освен това резултатите са едни и същи всеки път. Но в зависимот от тази натройка резултатите могат да варират значително. В този случай обяснението за random seed-а не ми звучи задоволително.

0
iordan_93 avatar iordan_93 Trainer 407 Точки

Хм, май имаме по-интересен проблем, отколкото предполагах.

Първо, и със seed, и без, и с няколко различни стойности, при мен (на моя лаптоп) тестовете минават. Което пък е и някаква гаранция, че при автоматичното оценяване ще минат.

Второ, възможно ли е да четете данните от друго място, а не от файла; или пък да правите някоя операция, която аз не правя?

P. S.: Ако единствената разлика наистина е в настройките на чипа - аз имам една хипотеза. Познайте кои machine learning функции бяха най-сериозно засегнати от Meltdown: QR decomposition - основа на немалко линейни модели (source).

P. P. S.: Ако толкова се налага, ще направя проверката за +/- 0,05.

2
16/03/2018 00:36:11
dim4o avatar dim4o 289 Точки

Относно четенето за на данните от друго място - едва ли е възможно. Пробвах с едни и същи данни в различни среди с един и същи код. В такъв случай дори да правя нещо по-различно - това няма значение.

Осносно лабовете не съм сигурен дали +/- 0,05 е добра идея ако само 2-ма човека сме забелязали такива аномалии. Видях, че е излязъл втория ЛАБ и ще тествам как върви с новите натройки. После ще споделя тук резултата.

Защо при seandi нито една от настройките не дава очаквания в теста резултат - честно казано нямам идея. Особено ако наистина работи с кода, който и аз тествам(най-отгоре). Успях да настроя 3 машини(2 физически и една виртуална) да минават тестовете, като резултатите са напълно съответстващи на очкваните от ЛАБ-а. 

Интересна е идеята ти за Meltdown. Възможно е освен производителноста да има и модификации и в изчислителната схема или промяна в някои от сетовете от правила. Не разбирам нещата толкова на ниско ниво и не мога да дам мнение.

0
16/03/2018 09:29:10
seandi avatar seandi 38 Точки

Здравей Данчо,

На твоя въпрос:

Възможно ли е да четете данните от друго място, а не от файла; или пък да правите някоя операция, която аз не правя?

Аз чета данните от папка data (от лаба) и изпълнявам всеки път един и същи код ( кода на dim4o) при различните стойности за MKL_CBWR. 

0
oggy555 avatar oggy555 19 Точки

... и аз получавам .902 на macOS и Ubuntu 17.10, без Intel MKL и двете.

-1
iordan_93 avatar iordan_93 Trainer 407 Точки

Здравейте,

Последните резултати от моето изследване:

1. Файловете и резултатите са коректни. Не четете файла грешно: във всички източници е едно и също.

2. Нямаме нужда от seed - в лаба няма train / test split и всъщност - нищо друго, което да изисква случайни числа. Т. е. не е и от това.

3. Всички, които казвате, че при вас не работи - на моята машина дава коректни резултати. Окончателно: да, от средата е.

4. Meltdown поправките наистина водят до промени с floating-point arithmetic. За момента е най-вероятният източник на проблеми. Може да има значение дори операционната система, но за момента не мога да тествам. Аз съм на Windows 10 Education.

Най-лесното решение: просто не му обръщайте внимание :D. Всички тестове, които проверяват подобни неща в следващите лабове ще са скрити: т. е. при вас няма да се виждат и изпълняват, а на оценяващата машина ще работят.

Има и друго - разликите са малки, в действителност accuracy 0.899 и 0.902 са незначително различни. Въпросът е, че когато проверявам в тестовете, искам да се уверя, че сте избрали правилните данни - затова има тази проверка с delta = 0.001.

Аз съм изключително любопитен да задълбая повече, но наистина сякаш е някаква малка особеност на много ниско ниво (CPU).

0
17/03/2018 12:54:01
seandi avatar seandi 38 Точки

Благодаря за коментара, Данчо!

0
dim4o avatar dim4o 289 Точки

@iordan_93,

Относно т. 3: Няма лесен начин да значеш, че на твоята машина са коректните резултати, а не на някоя от другите smiley . Точно в това е проблема. Но така или иначе - в случая не можеш да направиш много.

Възможно е и Анакондата да не успява да създаде еднакви условия за всички среди. Без Анаконда при мен резултатите бяха различни. Хрумват ми още няколко неща, които могат да се пробват, но засега спирам да го мисля това и се съсредоточвам върху материалите от курса. При мен промяната на MKL параметрите даде желаният резултат.

0
17/03/2018 23:27:58
iordan_93 avatar iordan_93 Trainer 407 Точки

@dim4o,

Както отбелязах, няма "коректни" резултати. Има резултати, които минават тестовете. Всеки един тест не гарантира, че нещо е коректно, но може да покаже, ако не е коректно. Въпросът беше, че тестовете минават.

Това с Anaconda-та ще го проуча и аз.

За мен вариантите са два: или формулата, която смята accuracy, или самата регресия - т. е. predict метода на LogisticRegression класа. По-вероятно първото. Аз ще се наложи да задълбая, защото трябва да избегна такива неща занапред.

1