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.



:)