Regresja wielomianowa z wykorzystanem biblioteki Sklearn.
Pobierz plik z danymi "insurance.csv"
POBIERZ...
Analiza z wykorzytaniem regresji wielomianowej.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import mean_absolute_error
import matplotlib.pyplot as plt
df=pd.read_csv("insurance.csv")
print(df.head())
print(df.isna().sum()) # sprawdzamy ile mamy pustych komórek danych
# zamieniamy stringi na wartości numeryczne
print(df['region'].unique()) # sprawdzamy ile unikalnych stringów mamy w kolumnie region
df['sex']=df['sex'].replace({'female':1,'male':2})
df['smoker']=df['smoker'].replace({'yes':1,'no':2})
df['region']=df['region'].replace({'southwest': 1, 'southeast': 2,'northwest':3,'northeast':4})
print(df.head())
# określamy dane wejsciowe i wyjściowe i dzielimy je na uczące i testujące
X=df.drop(columns=['charges'])
y=df['charges']
X_train, X_test, y_train, y_test=train_test_split(X,y, test_size=0.25, random_state=1)
#skalowanie danych do wymiaru 0 - 100%
scaler=StandardScaler()
X_train_scaler=scaler.fit_transform(X_train)
X_test_scaler=scaler.fit_transform(X_test)
print(X_train_scaler)
for i in range(6):
lin=LinearRegression()
poly=PolynomialFeatures(degree=i) # wielomian i-tego stopnia
X_poly_train=poly.fit_transform(X_train_scaler)
X_test_poly=poly.fit_transform(X_test_scaler)
poly.fit(X_poly_train,y_train)
lin.fit(X_poly_train,y_train)
y_pred=lin.predict(X_test_poly)
print('Wielomian ',i+1,', błąd pomiędzy danymi testowymi a danymi przewidzianymi ',mean_absolute_error(y_test, y_pred))
y_pred_train=lin.predict(X_poly_train)
print ('Wielomian ',i+1,', błąd pomiędzy danymi uczącymi a danymi przewidzianymi jako zbiór uczący ',mean_absolute_error(y_train, y_pred_train))
# wizualizujemy regresje wielomianową na tle danych
plt.figure()
plt.scatter(X_test['age'], y_test, color='blue', label='Actual', s=1)
plt.scatter(X_test['age'], y_pred, color='red', label='Predicted', s=3)
plt.title(f"Regression Plot (Degree {i})")
plt.xlabel("Age")
plt.ylabel("Charges")
plt.legend()
plt.show()
Wyjaśnienie zjawiska overfittingu. Jeżeli podążymy w wielomian zbyt wysokiego stopnia, mode będzie odwzorowywał dane uczące, ale słabo będzie przewidywał.
Wielomian 1 stopnia.
Wielomian 2 stopnia.
Wielomian 3 stopnia. Wartość "le13" w lewej górnej części wykresu oznacza potęgę do której podniesione są wartości osi y.
Wielomian 4 stopnia.