В мире анализа данных линейная регрессия является широко используемым методом для понимания связи между зависимой переменной и одной или несколькими независимыми переменными. Однако линейная регрессия может моделировать только линейные отношения и может быть не в состоянии точно представить более сложные нелинейные отношения.

Введите полиномиальную регрессию признаков. Этот метод расширяет линейную регрессию, чтобы соответствовать нелинейным данным, вводя полиномиальные члены в линейную модель. Эти термины являются степенями исходной независимой переменной (переменных), такой как x², x³ и т. д.

Добавленные полиномиальные члены позволяют модели фиксировать более сложные взаимосвязи между независимыми и зависимыми переменными. Например, модель полиномиальной регрессии признаков со степенью 2 будет включать в модель как исходную независимую переменную (x), так и квадрат этой переменной (x²). Это позволяет модели подгонять к данным параболическую кривую, а не просто прямую линию.

Быстрый аналитический пример того, как полиномиальные функции могут улучшить производительность регрессии. Вот анализ вместе с кодированием с использованием языка программирования python. Набор данных с использованием https://www.kaggle.com/datasets/ardikasatria/datasetanamanpadisumatera/.

import pandas as pd
import numpy as np

#visual
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px

#add
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
pd.set_option('display.max_columns', None)

df = pd.read_csv('Data_Tanaman_Padi_Sumatera_version_1.csv')

df.info()

#output
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 224 entries, 0 to 223
Data columns (total 7 columns):
 #   Column          Non-Null Count  Dtype  
---  ------          --------------  -----  
 0   Provinsi        224 non-null    object 
 1   Tahun           224 non-null    int64  
 2   Produksi        224 non-null    float64
 3   Luas Panen      224 non-null    float64
 4   Curah hujan     224 non-null    float64
 5   Kelembapan      224 non-null    float64
 6   Suhu rata-rata  224 non-null    float64
dtypes: float64(5), int64(1), object(1)
cek = pd.DataFrame({
    'Data Kosong': df.isnull().sum(),
    'Data Duplikat': df.duplicated().sum(),
    'Data NaNN': df.isna().sum(),
    'Type Data': df.dtypes
})

Из данных выше есть следующая информация:
1. Есть 7 столбцов и 224 строки данных.
2. Столбцы состоят из провинции, года, производства, площади урожая, осадков, влажности, средней температуры. .
3. Нет пустых данных или данных NaNN.
4. Нет повторяющихся данных.

Исследовательский анализ данных

df.corr()

Из корреляции числовых данных было обнаружено, что столбец «Общая убранная площадь» сильно коррелирует (положительная корреляция более 0,9) с общим производством риса.

# visualization between land area and rice production

fig = px.scatter(df, x="Luas Panen", y="Produksi",template='plotly_dark', 
                 color="Provinsi")
fig.show() 

Следующим шагом является создание регрессионной модели.

#ImportLibrary
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, MinMaxScaler, PolynomialFeatures

from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.model_selection import cross_val_score
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error, max_error

#function for evaluate
def MAPE(y_test, y_pred):
    y_test, y_pred = np.array(y_test), np.array(y_pred)
    return np.mean(np.abs((y_test - y_pred) / y_test)) * 100
def performance(model,X_train,y_train,y_pred,y_test):
    print('Train Score:',round(model.score(X_train,y_train), 4))
    print('Test Score (R2 Score):',round(r2_score(y_test,y_pred), 4))
    print('Metrics In Testing Data: ')
    print('MSE:',round(mean_squared_error(y_test,y_pred), 4))
    print('RMSE:', round(np.sqrt(mean_squared_error(y_test,y_pred)), 4))
    print('MAE:',mean_absolute_error(y_test,y_pred))
    print('Max Error:',max_error(y_test,y_pred))
    print('MAPE:',round(MAPE(y_test, y_pred), 2), '%')

Простая линейная регрессия

#Determine variables Feature = X, Target = y

X = df[['Luas Panen']]
y = df[['Produksi']]

#model
linreg = LinearRegression()

#fitting
linreg.fit(X,y)
lr_pred = linreg.predict(X)

#R2 Score
print('Test Score (R2 Score):',round(r2_score(y,lr_pred), 4))

#output
Test Score (R2 Score): 0.8202

Множественная линейная регрессия

#backup dataset
df_copy = df.copy()

#determine variable feature and target
X_copy = df_copy.drop(['Produksi'], axis = 1)
y_copy = df_copy[['Produksi']]  #target

#train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_copy[['Luas Panen']], 
                                                    y_copy, test_size=0.33)

#Linear Regression
model = LinearRegression()
#fitting model
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print('Performance Linear :\n')
print(performance(model,X_train,y_train,y_pred,y_test))
print('')

#Polynomial Feature - quadratic 
X_train_poly = X_train
X_test_poly = X_test
#transform polynomial
quad_feature = PolynomialFeatures(degree = 2)
X_train_quad = quad_feature.fit_transform(X_train_poly)
X_test_quad = quad_feature.fit_transform(X_test_poly)
#fitting
model.fit(X_train_quad, y_train)
#predict
y_pred_train_poly = model.predict(X_train_quad)
y_pred_test_poly = model.predict(X_test_quad)
print('Performance Linear dengan poly 2 degree:\n')
print(performance(model,X_train_quad,y_train,y_pred_test_poly,y_test))
print('')

#output
Performance Linear :

Train Score: 0.8618
Test Score (R2 Score): 0.9049
Metrics In Testing Data: 
MSE: 104505477169.5254
RMSE: 323273.069
MAE: 239470.27455571038
Max Error: 1568923.7720117718
MAPE: 42.1 %


Performance Linear dengan poly 2 degree:

Train Score: 0.8986
Test Score (R2 Score): 0.9109
Metrics In Testing Data: 
MSE: 97960775140.3649
RMSE: 312986.861
MAE: 222956.16338961213
Max Error: 1160215.7495861053
MAPE: 18.59 %

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

Ниже представлена ​​визуализация результатов моделирования:

plt.figure(figsize=(18,9))

plt.scatter(X_train, y_train, c='black')

model = LinearRegression()
model.fit(X_train, y_train)
X_vis = np.linspace(0,900000,1000).reshape(-1,1)
y_vis = model.predict(X_vis)
plt.plot(X_vis, y_vis, '--g', label = 'linear')

#quad
quad_feature = PolynomialFeatures(degree = 2)
X_train_quad = quad_feature.fit_transform(X_train)
model.fit(X_train_quad, y_train)
X_vis_quad = quad_feature.transform(X_vis)
y_vis = model.predict(X_vis_quad)
plt.plot(X_vis, y_vis, '--r', label = 'quadratic')

plt.title('visualisasi regresi')
plt.legend()
plt.xlabel('Luas Panen')
plt.ylabel('Jumlah Produksi')
plt.legend()
plt.grid(True)
plt.show()

Одним из преимуществ полиномиальной регрессии признаков является ее гибкость. Его можно применять к любой линейной модели, такой как линейная регрессия, логистическая регрессия и даже к машинам опорных векторов (SVM). Его также можно использовать для моделирования широкого спектра данных, от простых полиномов до более сложных полиномов более высокой степени.

Одним из ключевых соображений при использовании полиномиальной регрессии признаков является выбор подходящей степени для полинома. Полином более высокой степени сможет соответствовать более сложным данным, но это также может привести к переоснащению. Переобучение происходит, когда модель слишком сложна и соответствует шуму в данных, а не лежащим в основе отношениям. Чтобы избежать переобучения, важно использовать такие методы, как перекрестная проверка, чтобы убедиться, что модель не слишком сложна для данных.

В заключение, полиномиальная регрессия признаков является мощным инструментом для понимания нелинейных отношений в данных. Его можно использовать для моделирования широкого спектра данных, и это гибкий метод, который можно применять ко многим различным типам линейных моделей. Однако, как и в случае с любой техникой, важно использовать ее надлежащим образом и избегать переобучения.

Автор: Adhe Firmansyah

https://www.kaggle.com/datasets/ardikasatria/datasetanamanpadisumatera/