В мире анализа данных линейная регрессия является широко используемым методом для понимания связи между зависимой переменной и одной или несколькими независимыми переменными. Однако линейная регрессия может моделировать только линейные отношения и может быть не в состоянии точно представить более сложные нелинейные отношения.
Введите полиномиальную регрессию признаков. Этот метод расширяет линейную регрессию, чтобы соответствовать нелинейным данным, вводя полиномиальные члены в линейную модель. Эти термины являются степенями исходной независимой переменной (переменных), такой как 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/