Линейната регресия е един от най-популярните статистически методи, който се използва за прогнозен анализ. Той показва линейна връзка между зависима (y) променлива и една или повече независими (y) променливи.

yᵢ = b₀ + b₁xᵢ + ε

y = зависима променлива

x = независима променлива

b₀ = пресечна точка на линията на регресия (степен на свобода)

b₁ = коефициент на линейна регресия

ε = член на грешката

Видове линейна регресия

  • Опростена линейна регресия – При това алгоритъмът за регресия моделира връзката между зависима променлива и отделна независима променлива.
  • Множествена линейна регресия – При това алгоритъмът за регресия моделира връзката между зависима променлива и повече от една независима променлива.

Постановка на проблема: Заплата V/S опит

Ще разгледаме набор от данни с две променливи: заплата (зависимата променлива) и опит (независимата променлива). Целите на този проблем са следните:

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

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

1. Предварителна обработка на данните

# import libraries
import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
%matplotlib inline

import seaborn as sns
# mount drive
from google.colab import drive
drive.mount('/content/drive')

sns.scatterplot(x=df.YearsExperience, y = df.Salary)

Извод

Разглеждайки графиката, можем да видим, че заплатата (y) и годините опит (x) имат линейна връзка и са свързани. Графиката също така показва увеличение на заплатата с увеличаване на броя на годините опит. Нека използваме предоставената информация, за да предвидим допълнително заплатата в зависимост от годината на опит.

След това трябва да извлечем зависимите и независимите променливи от дадения набор от данни. Независимата променлива е години опит, а зависимата променлива е заплата. Ето кода:

x = df.iloc[:,:-1]      # independent variable (yoe)
y = df.iloc[:,1:]       # dependent variable (salary)

print(x.shape)
>> (30, 1)

Тъй като сме извлекли независимата променлива (x) и зависимата променлива (y), ще разделим и двете променливи на набори за обучение и тестване. Имаме 30 наблюдения, така че ще използваме 20 за обучителния набор и 10 за тестовия набор. Ние разделяме нашия набор от данни, за да можем да обучим нашия модел на един набор от данни и след това да го тестваме на друг.

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

# splitting the dataset into training and testing set
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x,y, test_size=1/3, random_state=0)
print(x_train.shape)
print(y_test.shape)

>> (20, 1)
>> (10, 1)

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

2. Напасване на простата линейна регресия към набора за обучение

Сега следващата стъпка е да се намери най-подходящата линия, където разликата между прогнозираните и действителните стойности е минимална. За да постигнем това, ще импортираме класа LinearRegression от пакета с линейни модели от sci-kit learn. След като импортираме класа, ще изградим обект на регресионен клас.

from sklearn.linear_model import LinearRegression
regressor = LinearRegression()

regressor.fit(x_train,y_train)

# getting model coefficient 
regressor.coef_

>> array([[9345.94244312]])

Използвахме функциятаfit(), за да напаснем нашия обект за проста линейна регресия към набора за обучение. Дадохме променливите x_train и y_train на метода fit(), които са нашите набори от данни за обучение за независимите и зависимите променливи. Ние приспособихме нашия регресорен обект към набора за обучение, така че моделът да може лесно да научи корелациите между променливите за прогнозиране и целевите.

3. Прогнозиране на резултата от набор от тести

В резултат на това нашият модел вече е готов да предвиди резултатите от новите наблюдения. На този етап ще дадем на модела набор от тестови данни (нови наблюдения), за да видим дали може да предвиди планирания резултат.

Ще бъде създаден вектор за прогнозиране, наречен y_pred и x_pred, съдържащ съответно прогнози за тестовия набор от данни и набора за обучение.

# prediction of test and training set

x_pred = regressor.predict(x_train)
y_pred = regressor.predict(x_test)

Генерират се две променливи, y_pred и x_pred, които включват прогнози за заплати съответно за комплектите за обучение и тест.

Бързо обобщение:

Досега сме спестявали заплата в y-променлива и година опит в x-променлива, които бяха допълнително разделени на данни за обучение и набор от тестове.

Ние обучихме набори от данни, като предоставихме стойности x_train и y_train на метода train_test_split() за избор на модел. След успешно обучение на модела, прогнозирахме стойностите на набора за тестване и обучение, където предадохме данни за обучение и тестване на независими променливи (x = година опит), за да прогнозираме заплатата за набора за обучение и тестване.

4. Визуализиране на резултатите от набора за обучение

Резултатът от обучителния набор може да се визуализира графично.

plt.scatter(x_train,y_train,color='blue') 
plt.plot(x_train, x_pred, color= 'red')

plt.title("Salary vs Experience (Training Data)")
plt.xlabel('Years of Expereince')
plt.ylabel('Salary')
plt.show()

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

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

5. Визуализация на комплекта за тестване

plt.scatter(x_test,y_test,color='red') 
plt.plot(x_train, x_pred, color= 'green')

plt.title("Salary vs Experience (Training Data)")
plt.xlabel('Years of Expereince')
plt.ylabel('Salary')
plt.show()

Червеният цвят в диаграмата по-горе представлява наблюдения, а зелената линия на регресия представлява прогноза. Както виждаме, по-голямата част от наблюденията са близо до регресионната линия, така че можем да заключим, че нашата проста линейна регресия е добър модел, способен да прави точни прогнози.

Ето връзката към моето хранилище на GitHub, където можете да изтеглите данните и кода на Python: https://github.com/naghma28/linear-regression-model

Можете да се свържете с мен в LinkedIn: Naghma Firdous

Оценявам, че отделихте време да прочетете това. Чувствайте се свободни да предложите всякакви отзиви.

Нагма Фирдоус