Независимо дали сте начинаещ или професионалист, работещ в Data Science, направете си услуга и участвайте от време на време в състезания, които отговарят на вашите интереси. Ако се интересувате от машинно обучение, анализ на текст, проучвателен анализ и други, помислете за демонстриране на вашите умения, идеи. Това е от полза не само за вас, но и за други в общността на Data Science. Силно препоръчвам конкурси за проекти, тъй като вярвам, че предлагат ценни предимства поради следните причини:

  1. Работа в мрежа
  2. Възможност за учене
  3. Практиката прави перфектния

Въведение в проекта

Това състезание на Kaggle е за „Прогнозиране на времеви редове“, включващо прогнозиране на продажбите в магазините, използвайки исторически данни от Corporación Favorita, основен търговец на хранителни стоки в Еквадор. Участниците имат за цел да създадат точни прогнозни модели за единични продажби на различни артикули в магазините на Favorita, като използват предоставени данни като дати, подробности за магазина, промоции и действителни продажби. Успешните модели ще бъдат оценени въз основа на средната квадратна логаритмична грешка (RMSLE), предлагаща възможност за справяне с предизвикателствата на дребно и прецизиране на методите за прогнозиране.

Зареждане на данни

Всеки проект започва с преглед на данните и създаване на папки за съхраняване на файлове във вашия компютър или извикване на Kaggle API за директно извличане на данни.

Единствената върната рамка от данни с липсващи стойности е „oil_df“. Както показва червената точка на изображението по-долу, липсващите данни бяха съвсем незначителни, така че изпуснах нулеви стойности.

Обработка на данни

Когато работите с данни от времеви серии през различни интервали от време (като ежедневни, месечни или годишни), ефективната обработка на данните става ключова за разкриване на зависимости, корелации и прозрения, които могат да подобрят вашите резултати от моделирането. Получихме пет набора от данни: влак, тест, масло, транзакции, празник и магазини. Тези набори съдържаха допълнителна информация като цени на петрола, празници, видове магазини и честота на транзакциите. Логичната следваща стъпка беше да обединим тези набори от данни с нашите набори за обучение и тестване, като използваме споделени променливи като id, дата или типология на магазина. След процеса на сливане последващата стъпка включва обработка на данни. По-долу можете да намерите кодов фрагмент, който илюстрира действията по предварителна обработка, извършени за коригиране на набора от данни за обучение и тест. Целта беше да се разкрият значими връзки в данните чрез разширяване или създаване на тези нови променливи, които биха могли да добавят значение към прогнозите на модела.

final_df_train = final_df_train.sort_values(by="date", ascending=True)
final_df_train.head()

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

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

Ето обобщение на стъпките, които сме предприели досега:

1️. Импортирани са всички набори от данни

2️. Обединени допълнителни набори от данни с набор от данни за обучение › final_df_train

3️. Създадени са нови функции за final_df_train чрез извличане на информация от датите с помощта на библиотеката datetime.

Проучвателен анализ на данни (EDA)

Не забравяйте, че целта на визуализацията на данни не е просто да визуализира данни, а да извлече историята зад данните.

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

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

Докато изследваме икономическите тенденции и тенденциите в продажбите в Еквадор, ние разглеждаме два ключови компонента на неговата икономика: цените на петрола и продажбите на дребно. Първата визуализация се фокусира върху цените на петрола в Еквадор, които се колебаят поради глобалните икономически сили, геополитическите събития и регионалните фактори, влияещи върху петролните пазари. Графиката представя времева линия от миналото до настоящето, което ни позволява да наблюдаваме години на промени на петролния пазар. Оста y представлява цената на петрола, като предоставя ясна перспектива за тенденциите на цените на петрола в Еквадор и паричната стойност на тази основна стока.

След като основата беше положена, последващият анализ се фокусира върху идентифицирането на семейните продуктови категории с най-високи продажби. Резултатите от тази визуализация подчертават най-добре представящите се семейни продуктови категории по отношение на средните продажби. По-специално, категории като „Хранителни стоки“, „Напитки“, „Продукти“, „Почистване“, „Ежедневно“, „Млечни продукти“ и „Пекарни“ постоянно постигат по-високи средни продажби в сравнение с други. Тези категории играят основна роля в приноса към общите приходи от продажби на магазина.

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

Продължавайки със същата бележка, анализът разшири фокуса си върху месеците, разкривайки интригуващи тенденции в продажбите, съобразени с различни сезони и поводи. Месеците юли, август, октомври, ноември и декември се откроиха като пикови периоди на продажбена активност. Този скок може да се отдаде на празничния сезон, като зимните месеци включват Коледа, когато купувачите обикновено са по-активни. Обратно, първите месеци на годината, от януари до май, отбелязаха период на сравнително по-ниски продажби. Може би с отслабването на инерцията на празничния сезон клиентите са склонни да намалят разходите си след ваканционната бързина. Тези прозрения хвърлят светлина върху сезонната динамика, празненствата и поведението на потребителите.

Сезонност на данните и разширен тест на Dickey Fuller (ADF)

Разбирането на сезонността и използването на инструменти като Augmented Dickey-Fuller (ADF) е от голямо значение при работа с данни от времеви серии, тъй като тези елементи осигуряват жизненоважна представа за основните модели и тенденции, които оформят поведението на данните във времето. В крайна сметка ние правим всички тези анализи за тази цел, разбирайки поведението на данните във времето.

За да разкрием отделните елементи на данните от времевите серии, ние проведохме сезонна декомпозиция, използвайки функцията „seasonal_decompose“ от „statsmodels.tsa“. Тази техника помага да се разбият данните на три основни компонента: тренд, сезонен и остатъчен. Избран е „допълнителен“ модел, което предполага, че наблюдаваните данни са сумата от тези компоненти. Ако искате да навлезете по-дълбоко в теорията, бих препоръчал само статията „Time Series DIY: Seasonal Decomposition“, тъй като тя ми послужи като отправна точка при провеждането на анализа.

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

Компонентът на тенденцията илюстрира всеобхватната посока на продажбите, сезонният компонент насочва вниманието към повтарящи се модели, а остатъчният компонент изобразява отклонения както от тенденцията, така и от сезонните модели. Трябва да се отбележи, че остатъчният компонент показва относително еднообразно и стационарно поведение, което показва, че значителна част от променливостта и нередностите се дължат на тенденцията и сезонните компоненти.

„Разширеният тест на Дики-Фулър“ е вид статистически тест, наречен „тест за единичен корен“. Нулевата хипотеза на теста е, че времевият ред може да бъде представен чрез единичен корен, че не е стационарен (има някаква зависима от времето структура). Алтернативната хипотеза (отхвърляща нулевата хипотеза) е, че динамичният ред е стационарен. Ние интерпретираме този резултат, като използваме p-стойността от теста.

Средна статистика за ADF: -7,093

По-отрицателната стойност на статистиката на ADF предполага по-силна индикация, че данните са стационарни. В този случай относително голямата отрицателна стойност показва голяма вероятност за стационарност в оценявания времеви ред.

Средна p-стойност: 1,187

Както отрицателната ADF статистика, така и ниската p-стойност предоставят убедителни доказателства, че данните показват стационарни характеристики.

Разделяне на данни в набор за обучение и валидиране

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

Избраният алгоритъм е Random Forest Regressor поради няколко причини. При анализа на времевите редове Random Forest Regressor е с предимство поради способността си да се справя със сложни, нелинейни връзки, устойчивост на извънредни стойности и ефективно улавяне на взаимодействието на характеристиките. Неговата ансамбълна природа се „бори“ срещу пренастройването, докато прозренията за важността на характеристиките се използват за разбиране на динамиката на данните. За точни и стабилни прогнози в сложни времеви серии от данни Random Forest Regressor често надминава традиционните модели на линейна регресия.

За по-голяма яснота, следният кодов фрагмент разделя тези предстоящи задачи на отделни стъпки.

Model's results:

{'Training MAE': 14.39046043718243,
 'Valid MAE': 14.879747614036036,
 'Training RMSLE': 0.18859544180669333,
 'Valid RMSLE': 0.18262125548909805,
 'Training R^2': 0.9939454680376552,
 'Valid R^2': 0.9960633903777455}

Както можем да видим от резултатите от модела по-горе, ние отбелязваме тренировъчна RMSLE (Средна квадратна логаритмична грешка) от само 0,18, което е чудесно като начало. Това, което RMSLE прави с прости думи, е да измерва съотношението между предвиденои действително. Стойност на RSMLE от 0,18 показва големината на грешката между прогнозираните стойности и действителните стойности във вашия набор от данни. Колкото по-ниска е Средната квадратна логаритмична грешка, толкова по-добре прогнозите на модела са в съответствие с действителните данни. Следователно искаме да опитаме хипернастройка, за да видим дали все още можем да го намалим.

Параметри на хипернастройка

Трите най-често срещани подхода за настройка на хиперпараметри са: (1) на ръка, (2) GridSearchCV и (3) RandomizedSearchCV. В нашия ML модел сме използвали RandomizedSearchCV. Можем просто да разгледаме param_grid корекциите в Scikit-Learn документация.

Кодът по-долу демонстрира стъпките, обяснени по-горе:

Изход:

Best parameters:
{'n_estimators': 50,
 'min_samples_split': 4,
 'min_samples_leaf': 1,
 'max_samples': 10000,
 'max_features': 'auto',
 'max_depth': None}

Model scores:
{'Training MAE': 98.2941794720012,
 'Valid MAE': 145.11301961984705,
 'Training RMSLE': 0.9524408303957568,
 'Valid RMSLE': 1.3648513324998786,
 'Training R^2': 0.8640611814731654,
 'Valid R^2': 0.7790716598322265}

Както е показано по-горе (Training RMSLE = 1,365), прилагането на параметрите за настройка с RandomizedSearchCV увеличи нашия RMSLE от 0,18 на 1,36. Ние се стремим да го намалим допълнително чрез прилагане на best_parameters и оценка на RMSLE на модела.

Ideal model's scores:
{'Training MAE': 97.14264651620881,
 'Valid MAE': 152.1843386349387,
 'Training RMSLE': 0.9728631060999784,
 'Valid RMSLE': 1.3934895160779928,
 'Training R^2': 0.8695385092910064,
 'Valid R^2': 0.770700236975968}

Въпреки прилагането на best_parameters към нов модел, наречен „ideal_model“, RMSLE не се подобри. Затова решихме да продължим с нашия първоначален модел, който постигна най-ниския RMSLE. По-нататъшното експериментиране с настройка на параметри или проучване на алтернативни алгоритми остава опция за обработка на анализ на данни от времеви серии.

Правене на прогнози

След като обучихме нашия модел и решихме да го използваме, е време да направим прогнозина тестовиянабор (невидени данни). Нашият модел е обучен на данни преди 2015 г. Тестовите данни обаче са от 16 август 2016 г. до 31 август 2016 г. Така че това, което правим, е да се опитваме да използваме моделите, които нашият модел е научил в данните за обучение, за да предвидим продажна цена на „Corporación Favorita“ с характеристики, които никога не е виждал преди, но се предполага, че са подобни на тези в данните за обучение.

test_preds резултати:

array([2.87, 0.76, 3.05, ..., 743.1437014,
       226.6923798, 14.69490199])

Последното нещо, което ни остава, е да преобразуваме нашите резултати от test_preds в изискването за подаване на Kaggle съгласно правилата на Kaggle. За всеки id в тестовия набор трябва да предвидим стойност за променливата sales.

# Format predictions into the same format Kaggle is after
df_preds = pd.DataFrame()
df_preds["id"] = df_test["id"]
df_preds["sales"] = test_preds
df_preds

==============================

Output:

id      sales
3000888 2.87
3000889 0.76
3000890 3.05
3000891 666.43
3000892 0.71
...     ...
3029395 123.3779101
3029396 27.75675
3029397 743.1437014
3029398 226.6923798
3029399 14.69490199

Важност на характеристиките

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

Като каза това, ето кодовия фрагмент за идентифициране и по-късно визуализиране на най-важните функции:

Заключение

Анализът на времеви редове може да се счита за един от най-развитите, използвани и потенциално предпочитани методи при работа с данни. Обосновката зад това е присъщата осезаемост на самия анализ. Има пряко въздействие върху ежедневните операции не само на бизнеса, но и в различни области, които разчитат на AI, за да подобрят своите функционалности. Този аналитичен подход носи значителни практически последици. Следователно, анализът на времевите редове с право привлича вниманието и признателността за неговата умелост в реални прозрения, които резонират с динамиката на реалния свят.

Благодаря ви, че прочетохте!