Въведение

В тази част ще извършим проучвателен анализ на данни (EDA) върху нашите данни, което е решаваща част от повечето проблеми с машинното обучение. Въпреки че може да не увеличим резултата си, ние ще извлечем безценна информация от нашите данни, което често е една от основните цели на машинното обучение в реалния свят. Ще използваме някои от традиционните EDA техники, но ще се докоснем и до няколко недостатъчно използвани. Можете да намерите тетрадката за този урок тук.

Без повече шум, нека започнем кодирането (в Colab)!

EDA не е колекция от библиотеки на Python

Когато за първи път започнах машинно обучение, бях абсолютно поразен от броя на преносими компютри в Kaggle с EDA или свързани етикети. Бях толкова уплашен от фразата EDA, че не можах да събера смелост да науча повече за нея, което попречи на обучението ми. Ако сте в същата лодка като мен преди малко, тогава се надявам, че четенето на този раздел ще ви помогне да преодолеете страха си и да разберете, че няма нищо магическо или мистериозно в EDA. В противен случай, моля, не се колебайте да пропуснете този раздел.

Според Уикипедия,

Проучвателен анализ на данни е подход за анализиране на набори от данни за обобщаване на техните основни характеристики, често с визуални методи. Статистически модел може да се използва или не, но основно EDA е за да видим какво могат да ни кажат данните отвъд формалното моделиране или задачата за тестване на хипотези.

Не можах да разбера самото определение на EDA: Какво всъщност означава анализирането на набор от данни? Има ли конкретна колекция от техники, които трябва да приложите към вашия набор от данни? След като направих малко проучване, разбрах, че отговорът на последното е категорично не, което беше моментът „Аха!“ за мен. EDA не е набор от техники - това е изкуство, дисциплина, умение. Разбира се, има инструменти, които могат да ви помогнат да разберете по-добре вашия набор от данни, като хистограми, графики на частични зависимости и т.н., но те са точно това — инструменти. Композиторът има редица техники и инструменти на свое разположение, като молив, гума, нотни листове и може би GarageBand, но актът на създаване на добра музика зависи единствено от креативността и компетентността на композитора.

За да обобщим, EDA не е колекция от научни библиотеки и алгоритми за данни. Вместо това, това е изкуство (или подход, както го нарича Уикипедия), при което целта ви е да откриете модели и да получите представа за вашия набор от данни (това може да включва всичко, вариращо от нещо толкова просто като осъзнаването, че две колони са абсолютно еднакви до откриването на отклонения в функция), която изисква креативност, а не сляпо следване на механичен процес. С други думи, наистина няма правилен начин да го направите, стига да свършите работата (въпреки че наистина има грешни начини да го направите, както ще видим). Въпреки това има някои полезни инструменти, когато става въпрос за EDA, някои от които ще се срещнем в тази статия.

Основен EDA

Преди да преминем към по-напреднали техники, първо трябва да придобием основно разбиране за нашите данни. Така че нека започнем с визуализиране на разпределението на нашите колони.

Първо, нека просто да разгледаме разпределението на нашата зависима променлива, тъй като това е единствената колона с непрекъснати стойности. Можем да извикаме .hist() на DataFrames и Series и pandas ще свърши работата вместо нас. Като алтернатива можем да използваме и matplotlib:

train_raw[dep_var].hist(bins=100)

Output:

Както виждаме, голяма част от нашите зависими стойности е разпределена някъде между 87–112. Изглежда има някои редове, в които y-стойността е по-голяма от 125, а в някои е по-малка от 80. Можем да заменим такива случаи с 80 и 120, което може да подобри резултата на нашия модел. Но ние ще направим такива модификации след EDA, така че засега просто трябва да запомним да опитаме това.

След това нека видим разпределението на останалите ни функции, които са категорични и двоични. Първо можехме да изпробваме това само на тренировъчния набор и когато решихме да изпратим окончателния си модел на Kaggle, щяхме да го изпробваме и на нашия тестов комплект, тъй като трябва да сме сигурни, че тестовият ни набор не е твърде различен от нашия тренировъчен комплект. Но бихме могли да го направим точно сега, за да не се изненадаме по-късно, ако наистина е различно. Между другото, имайте предвид, че по дефиниция хистограмите са непрекъснати и затова не можем да ги използваме тук. Вместо това можем да използваме лентови диаграми на matplotlib, като оста x е класовете на всяка колона, а височината на всяка лента е честотата на всеки клас:

# Create a subplot for each of our columns for each dataset
fig, axs = plt.subplots(2*(train.shape[1]-1), figsize=(30, 30))
# More space between the plots
fig.tight_layout()
for i, feat in enumerate(train.columns):
    if feat == dep_var: continue
    # This is a Series whose index is each class in our column
    # and whose values are the number of occurences of each class
    val_counts = train_raw[feat].value_counts()
    # Our classes
    indx = val_counts.index
    # The frequency of each class
    occ = val_counts.values
    # Draw the plot for the training set
    axs[2*i].bar(indx, occ)
    axs[2*i].set_title(feat)
    # Same as val_counts but for the test set
    val_counts = test_raw[feat].value_counts()
    # Set the occurences of classes that appear in
    # the training set but not in the test set to 0
    for j in indx:
        if j not in val_counts.index: val_counts[j] = 0
    # Modify the Series so that for categorical features, the ith index
    # in val_counts corresponds to the same category as the ith index
    # in val_counts for the training set
val_counts = pd.Series([val_counts[i] for i in indx], index=indx)
    occ = val_counts.values
    axs[2*i+1].bar(indx, occ, color='red')

Output:
(Too big)

Между другото, трябва да се отбележи, че този код не отчита класовете в нашите категориални колони да се показват в тестовия набор, но не и в тренировъчния набор. Има 4 класа „X5“ в тестовия набор, които не присъстват в тренировъчния набор, но всеки от тях се появява само веднъж, така че не е нужно да се тревожим за това.

Първо, нека просто обсъдим нашия тренировъчен набор. Както можете да видите, в повечето случаи или честотата на нулите е много висока, а честотата на единиците е ниска, или обратното. Тъй като нашите двоични характеристики най-вероятно се отнасят до това дали превозното средство има конкретна опция или не, това би означавало, че повечето опции са или такива, които всеки иска, или луксозни, които не всички хора могат да си позволят. По отношение на категориалните променливи, единствената, която остава след обширната ни селекция от функции, е „X5“ и можем да има около 25 уникални класа. Последните 7 или повече функции почти не съществуват, което ни води до още една промяна, която можем да направим в нашия набор от данни по-късно: обозначаване на такива класове като специален клас. Така че „g“, „y“, „u“, „h“, „x“, „f“ и (евентуално) „o“ ще бъдат заменени с „рядко“, което може да помогне за представянето на нашия модел.

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

Моля, обърнете внимание, че това е само разпределението на индивидуални колони: Тоест, ние не разгледахме разпределението на групи функции. Например, може би в обучителния набор, когато 'X314' е нула, 'X5' има тенденция да бъде 'w', 'v' или 'q', но може би в тестовия набор, 'X314' = 0 обикновено се сдвоява с „X5“ = „реклама“, която нашият модел не е свикнал да вижда. Но това е проблем за друг ден и засега това трябва да е достатъчно.

Заключение

В тази част започнахме да правим проучвателен анализ на данни за нашия набор от данни, което е съществена част от всеки проект за машинно обучение. Но EDA не е колекция от алгоритми или определени библиотеки за наука за данни: това е изкуство, което изисква креативност и въображение, но наличието на правилния набор от инструменти със сигурност може да помогне. Разгледахме разпределението на нашите характеристики и установихме, че в това състезание тренировъчните и тестовите набори са много сходни по отношение на тяхното (основно) разпределение.

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

Следва продължение...

Моля, ако имате някакви въпроси или обратна връзка, чувствайте се добре дошли да ги публикувате в коментарите по-долу и както винаги, благодарим ви за четенето!

Част 1: https://medium.com/python-in-plain-english/mercedes-benz-greener-manufacturing-part-1-basic-data-pre-processing-a32d17803064

Част 2: https://medium.com/python-in-plain-english/tackling-kaggles-mercedes-benz-greener-manufacturing-competition-with-python-3ddff72d0187

Част 3 (продължение): https://medium.com/python-in-plain-english/tackling-kaggles-mercedes-benz-greener-manufacturing-competition-with-python-b5220f479a44

Част 3 (продължение): https://medium.com/python-in-plain-english/tackling-kaggles-mercedes-benz-greener-manufacturing-competition-with-python-7b203e886f8d

Част 3 (продължение): https://medium.com/python-in-plain-english/tackling-kaggles-mercedes-benz-greener-manufacturing-competition-with-python-a004659e02c4

Част 4: https://medium.com/python-in-plain-english/tackling-kaggles-mercedes-benz-greener-manufacturing-competition-with-python-82dd27e53757

Част 5: https://medium.com/python-in-plain-english/tackling-kaggles-mercedes-benz-greener-manufacturing-competition-with-python-e31198ecafae

Част 5 (последна част): https://medium.com/python-in-plain-english/tackling-kaggles-mercedes-benz-greener-manufacturing-competition-with-python-ecbd2714d952

Twitter: https://twitter.com/bobmcdear

GitHub: https://github.com/bobmcdear