Днес в тази статия ще проучим в дълбочина проблем с регресията, за да знаем колко точен може да бъде регресионният модел въз основа на набора от данни и колко може да варира въз основа на няколко параметъра. Ще говорим за грешките и как да се справим с тях. От основната линейна регресия до случайната гора и добре познатия метод OLS, който е методът на обикновения най-малък квадрат, ще бъдат разгледани стъпка по стъпка. И така, нека започнем едно вълнуващо пътешествие!

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

Дефиниране на проблема: -

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

Подробности за набора от данни: -

Тук в казуса по-долу ще разгледаме много полезен набор от данни в областта на строителната индустрия. Има общо осем характеристики на материалите, въз основа на които се изчислява основната важна характеристика, наречена „Якост на натиск на бетона“. Осемте характеристики или съставки, включени в набора от данни, са цимент, шлака от доменни пещи, летлива пепел, вода, суперпластификатор, едър и фин инертен материал. И действителната якост на натиск на бетона (MPa) за дадена смес под определена възраст (дни) беше определена от лабораторията. Данните са в необработен вид (немащабирани).

Можете да получите достъп до набора от данни от връзката - https://archive.ics.uci.edu/ml/machine-learning-databases/concrete/compressive/Concrete_Data.xls

И подробното обсъждане на функциите (речник на данни) от връзката: - https://archive.ics.uci.edu/ml/machine-learning-databases/concrete/compressive/Concrete_Readme.txt

Така че към момента сме доста ясни за нашата задача и наличните данни. Първо, нека импортираме полезни библиотеки и набор от данни. Добре е да споменем, че данните от дадения линк са във формат .xlsx. Можем директно да използваме този Excel файл или можем да запазим файла като .csv файл и след това да заредим набора от данни, както ще направим сега.

импортирайте numpy като np

импортиране на панди като pd

df= pd.read_csv(“Concrete_Data.csv”) #зареждане на набора от данни

Анализ на данни: -

В тази част ще анализираме набора от данни, доколкото можем, за да получим някои важни резултати, които могат да бъдат използвани в етапа на предварителна обработка и могат да бъдат полезни при изграждането на модел!

df.head() #Проверка на първите 10 реда и имената на колоните, за да получите представа за данните

#Преименуване на колоните за улеснение при по-нататъшна употреба

df.columns=['Цимент','Blast_furnace_slag','Fly_ash','Water','Superplasticizer','Coarse_agg','Fine_agg','Age','CCS']

df.shape #Да проверим формата на данните

#Получаване на информацията за набора от данни (за всяка функция)

df.info()

И така, ще видим, че наборът от данни съдържа 1030 записа (редове) и 9 колони, всички характеристики са от тип данни „float64“, с изключение на „Възраст“, ​​която е в дни и е от тип данни int64.

# Опишете набора от данни, за да научите повече за него

df.describe()

Тук можем да видим всички подробности за набора от данни. Като средната стойност, стандартното отклонение, минималната стойност, максималната стойност и стойностите на 1-ви, 2-ри и 3-ти квартил на всяка характеристика на нашата рамка от данни. Сега познаваме нашия набор от данни много по-подробно и колоните са съответно 'Cement', 'Blast_furnace_slag', 'Fly_ash', 'Water', 'Superplasticizer', 'Coarse_agg', 'Fine_agg', 'Age' и „CCS“. Тук „CCS“ е нашата целева променлива, която означава „Якост на натиск на бетона“.

#Проверка дали има дублиращ се ред в набора от данни

df.duplicated().sum()

25

Така че в набора от данни има 25 дублиращи се записа. Това е страхотна находка!

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

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

df.drop_duplicates(inplace=True)

df.shape #проверява отново формата на набора от данни

(1005, 9)

И така, сега нашата рамка от данни е от 1005 реда и 9 колони. Сега е много чисто. не е ли

Сега нека видим корелационните стойности между функциите, които използваме. Всички наши функции са цифрови, така че не се притеснявайте много!

импортирайте matplotlib.pyplot като plt #importing matplotlib.pyplot за начертаване на графиките

import seaborn като sns # импортиране на Seaborn библиотека за чертане

#Визуализирайте корелацията между характеристиките чрез топлинна карта

f,ax=plt.subplots(figsize=(15,10))

sns.heatmap(df.corr(method='pearson'), annot=True, fmt= '.1f',ax=ax, cmap=”YlOrRd”)

Изглежда страхотно! Но от топлинната карта не получаваме толкова много високо или много ниско корелирани колони. Може да се каже, че „Суперпластификатор“ и „Вода“ са много по-малко свързани, но това може да се пренебрегне със сигурност. Така че можем да продължим по-нататък.

Ще проверим графиката на връзката между функциите в движение, като използваме вградена функция на Seaborn, наречена Pair plot.

#Как е графиката на връзката между всяка функция...нека видим

sns.pairplot(df)

‹seaborn.axisgrid.PairGrid при 0x20eb7a60e50›

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

И така, нашият анализ на данни приключва тук и ще обсъдим подробно резултатите, които сме получили от анализа.

Заключителни бележки на EDA: -

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

1) Видяхме формата на набора от данни и проверихме рамката с данни за ясна представа за колоните и редовете. Първоначално имаше 1030 реда и 9 различни характеристики, сред които осем характеристики са независими, а деветата характеристика е нашата целева променлива.

2) Потърсихме липсващи стойности или нулеви стойности в набора от данни. Но не се сблъскахме с такива, така че тук не беше необходимо третиране на нулеви стойности.

3) Наборът от данни съдържа 25 дублиращи се записи, което означава, че тези записи могат да повлияят на по-нататъшната ни работа. И така, ние премахнахме тези редове и сега имаме 1005 уникални записа. Също така преименувахме колоните за улеснен достъп.

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

5) Не на последно място, начертахме диаграма на двойки между всяка характеристика на рамката с данни, но изненадващо няма независима характеристика, която да поддържа силна линейна връзка със зависимата характеристика. Така че нашият подход към линейната регресия може да не е плодотворен. Може да се наложи да използваме други процеси на регресия.

Без да губим много време, ще преминем към задачата за предварителна обработка на нашия проект!

Тръбопровод за предварителна обработка: -

Нека продължим със стъпките за предварителна обработка. Ще видим подробно всяка стъпка от тръбопровода за предварителна обработка.

Проверка за отклонения: - Ще използваме функцията box-plot на библиотеката на seaborn, за да открием ясно нашите отклонения. Ще даде пълна картина. Ние ще начертаем за всяка колона. Нека начертаем това...

Премахване на извънредни стойности: — Има много начини за премахване на извънредни стойности. Можем да използваме корен, квадрат или логаритмичен подход за лечение на отклоненията. Но както знаем, всички наши колони са цифрови по природа, така че можем да използваме нещо много готино, за да третираме отклоненията. Нарича се Winsorisation метод! Сега, какво е това winsorisation!

Нека проверим резултатите!!

Тук сме използвали индексиране. Това е полезно свойство на рамката с данни Pandas. Присвоихме всички независими променливи вътре в X1 и зависимата променлива в y1.

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

Изграждане на модели за машинно обучение: -

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

##прогнозиране с тестови данни с нашия модел

Време е да видим работата на модела OLS. Ще използваме метода OLS за обратно елиминиране. Обратното елиминиране не е нищо друго освен метод за избор на характеристики за избор на най-добрите независими функции за точно прогнозиране на резултата.

Нека приложим OLS за обратно елиминиране.

Обратно елиминиране (OLS метод):-

Следователно можем да видим, че стойността на коригирания R_squared е подобрена малко до 0,961 след извършване на обратното елиминиране.

Сега ще проверим следващата част от изхода, за да получим картината на стойностите на „P“ на функциите, използвани за обучение на модела.

RANDOM-FOREST_REGRESSOR: -

Имаме страхотни резултати от метода OLS. Сега нека вземем още един модел, за да проверим точността. Да, говоря за Random Forest Regressor. Да преминем направо към модела.

Заключителни бележки: -

Сега сме в края на нашия проект. Беше красива работа навсякъде. Ние анализирахме данните, обработихме отклоненията и предварително обработихме набора от данни. В тази статия разгледахме четири важни регресионни модела. В крайна сметка стигнахме до най-доброто решение, използвайки Random-Forest и очевидно използвайки метода на обикновените най-малки квадрати. Дано и на вас ви е било приятно! Както се очакваше, наборът от данни не работи толкова много при линейна регресия и регресия на гребен. Но в крайна сметка го завършихме успешно. Покрихме някои страхотни функции на Pandas, Matplotlib и Seaborn. Като цяло, надяваме се, това е страхотна статия за вас. И така, довиждане за днес! Бъдете здрави, пазете се.

БЛАГОДАРЯ ВИ МНОГО...