Kursinnehåll
Linjär Regression med Python
Linjär Regression med Python
Mått
När man bygger en modell är det viktigt att mäta dess prestanda.
Vi behöver ett poängvärde kopplat till modellen som noggrant beskriver hur väl den passar data. Detta poängvärde kallas en metrik, och det finns många olika metrik att välja mellan.
I detta kapitel fokuserar vi på de mest använda.
Vi kommer att använda följande notation:
Vi är redan bekanta med en metrik, SSR (Sum of Squared Residuals), som vi minimerade för att identifiera de optimala parametrarna.
Med vår notation kan vi uttrycka formeln för SSR enligt följande:
eller lika med:
Denna metriken var bra för att jämföra modeller med samma antal observationer. Dock ger den oss ingen förståelse för hur väl modellen presterar. Här är varför:
Antag att du har två modeller på olika träningsuppsättningar (visas i bilden nedan).
Du kan se att den första modellen passar bra men ändå har ett högre SSR än den andra modellen, som visuellt passar data sämre. Detta hände enbart eftersom den första modellen har betydligt fler datapunkter, så summan blir högre, men i genomsnitt är residualerna för den första modellen lägre. Att ta medelvärdet av kvadrerade residualer som en metrisk skulle beskriva modellen bättre. Det är precis vad Mean Squared Error(MSE) är.
MSE
eller lika med:
För att beräkna MSE-måttet med Python kan du använda NumPy:s funktioner:
mse = np.mean((y_true-y_pred)**2)
Eller så kan du använda Scikit-learns mean_squared_error()
-metod:
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y_true, y_pred)
Där y_true
är en array med faktiska målvariabelvärden och y_pred
är en array med predikterade målvariabelvärden för samma egenskaper.
Problemet är att felet som visas är kvadrerat. Till exempel, anta att MSE för modellen som förutspår huspriser är 49 dollars². Vi är intresserade av pris, inte pris i kvadrat som ges av MSE, så vi vill ta roten ur MSE och få 7 dollar. Nu har vi ett mått med samma enhet som det predikterade värdet. Detta mått kallas Root Mean Squared Error (RMSE).
RMSE
För att beräkna RMSE-måttet med Python kan du använda NumPy:s funktioner:
rmse = np.sqrt(np.mean((y_true-y_pred)**2))
Eller så kan du använda Scikit-learns mean_squared_error()
-metod med squared=False
:
from sklearn.metrics import mean_squared_error
rmse = mean_squared_error(y_true, y_pred, squared=False)
MAE
I SSR kvadrerade vi residualerna för att eliminera tecknet. Ett annat tillvägagångssätt är att ta de absoluta värdena av residualerna istället för att kvadrera dem. Det är idén bakom Mean Absolute Error (MAE).
eller lika
Det är samma som MSE, men istället för att kvadrera residualerna tar vi deras absolutbelopp.
Även om MAE liknar MSE, är den mer robust mot avvikare eftersom den använder absolutbeloppet av residualerna och därmed inte förstärker stora fel lika mycket som MSE gör. Därför är MAE ofta ett bättre val när datasettet innehåller avvikare, eftersom dess värde inte ökar oproportionerligt på grund av några extrema fel.
För att beräkna MAE-måttet med python kan du använda NumPy:s funktioner:
mae = np.mean(np.fabs(y_true-y_pred))
Eller så kan du använda Scikit-learns mean_absolute_error()
-metod:
from sklearn.metrics import mean_absolute_error
mae = mean_absolute_error(y_true, y_pred)
För att välja parametrarna använde vi SSR-måttet. Det beror på att det är bra för matematiska beräkningar och möjliggör härledning av den normala ekvationen. Men för att jämföra modeller ytterligare kan du använda vilket annat mått som helst.
Vid jämförelse av modeller kommer SSR, MSE och RMSE alltid att identifiera vilken modell som är bättre och vilken som är sämre på samma sätt. MAE kan däremot ibland föredra en annan modell än SSR/MSE/RMSE eftersom dessa straffar höga residualer mycket mer. Vanligtvis bör du välja ett mått i förväg och fokusera på att minimera det.
Nu kan du säkert avgöra att den andra modellen är bättre eftersom alla dess mått är lägre. Dock innebär inte alltid lägre mått att modellen är bättre.
Tack för dina kommentarer!