Ajarea ennustamisel ei ole ĂŒks pĂ€ev iseseisev nĂ€ide. Lag-tunnus tĂ€hendab, et anname mudelile sisendiks möödunud pĂ€evade vÀÀrtused. Lohista allpool pĂ€eva ja muuda lagide arvu ning vaata, milline treeningrida tekib. Andmed: Stockholmi pĂ€eva keskmine temperatuur 2000â2009.
Tavalises tabelis on iga rida eraldi nÀide ja mudel Ôpib seost sama rea veergude vahel. Kui tahame ennustada homset temperatuuri, peab samal real olema kaks asja: see, mida me tÀna teame (tunnused), ja see, mis juhtub homme (sihtmuutuja).
Pandas teeb selle shift() abil. shift(1) lĂŒkkab veergu ĂŒhe rea vĂ”rra allapoole, nii et iga rea juurde jĂ”uab eelmise pĂ€eva vÀÀrtus. shift(-1) lĂŒkkab ĂŒlespoole ja toob jĂ€rgmise pĂ€eva vÀÀrtuse. Esimest kasutame tunnuste, teist sihtmuutuja jaoks.
Iga uus lag lisab tunnuste komplekti veel ĂŒhe pĂ€eva tagasi. Kui algul oli 94 tunnust ja vĂ”tame 10 lagi, on sisendis 940 veergu.
shift nihutabOletame, et andmestikus on ainult need 12 pÀeva. Vali suund ja vii kursor (vÔi fookus) mÔnele lahtrile: tume raam nÀitab, kust temperatuuri veerust see vÀÀrtus pÀrit on.
Rohkem lage ei tĂ€henda automaatselt paremat mudelit. Vasakul on nĂ€ha, kui tugevalt korreleerub homne Stockholmi temperatuur sama vĂ”i naaberlinna temperatuuriga k pĂ€eva tagasi. Korrelatsioon langeb aeglaselt, kuid see on suuresti aastaaegade mĂ”ju: talvel on kĂŒlm nii tĂ€na kui ka kahe nĂ€dala pĂ€rast. Uut infot lisab iga jĂ€rgmine pĂ€ev aga ĂŒha vĂ€hem.
Paremal on lineaarse mudeli (Ridge) viga testandmetel, kui sisendiks on kĂ”igi 18 linna keskmine temperatuur ja k lagi. Parim tulemus tuleb 2â3 lagiga, edasi lisanduvad peamiselt mĂŒra ja veerud.
Kriipsjoon: naiivne prognoos âhomme on sama mis tĂ€naâ.
Sama andmestik, sama nÀrvivÔrk (MLPRegressor(hidden_layer_sizes=(50, 30))), 94 tunnust ja 10 lagi. Ainus erinevus on nihke mÀrk. Kui lagid tehakse kÀsuga shift(-i), satuvad sisendisse pÀevad t+1 ⊠t+9, sealhulgas Stockholmi homne miinimum- ja maksimumtemperatuur. Mudel ei ennusta, vaid arvutab sihtmuutuja peaaegu otse vÀlja.
Kaks Ă”ppetundi. Esiteks: kui ajarea mudel on ĂŒllatavalt tĂ€pne, kontrolli kĂ”igepealt, kas mĂ”ni tunnus pĂ€rineb sihtpĂ€evast vĂ”i hilisemast ajast. Teiseks: aus 940 tunnusega nĂ€rvivĂ”rk jÀÀb alla isegi naiivsele prognoosile, sest 2500 treeningrea kohta on tunnuseid liiga palju. VĂ€iksem ja lihtsam lag-komplekt vĂ”idab.
Tee tunnused ja sihtmuutuja ĂŒhte tabelisse enne dropna()-d. Siis kaovad NaN-iga read korraga mĂ”lemast ja read jÀÀvad omavahel joondatuks, kĂ€sitsi iloc[:-8] lĂ”ikamist pole vaja.
lags = 3 cols = [c for c in df.columns if c.endswith("_temp_mean")] # Tunnused: tĂ€na (lag0), eile (lag1), ĂŒleeile (lag2) â shift(+i) vaatab minevikku X_lagged = pd.concat( [df[cols].shift(i).add_suffix(f"_lag{i}") for i in range(lags)], axis=1, ) # Sihtmuutuja: homne temperatuur â shift(-1) vaatab tulevikku data = X_lagged.assign(target=df["STOCKHOLM_temp_mean"].shift(-1)).dropna() X_l, y_l = data.drop(columns="target"), data["target"] # AjajĂ€rjestuses jagamine, ilma segamiseta split = int(len(data) * 0.7) X_train, X_test = X_l.iloc[:split], X_l.iloc[split:] y_train, y_test = y_l.iloc[:split], y_l.iloc[split:]
Kontrolli alati ĂŒht rida kĂ€sitsi: vĂ”ta suvaline kuupĂ€ev, vaata, et _lag0 veerud on selle pĂ€eva vÀÀrtused, _lag1 eelmise pĂ€eva omad ja target jĂ€rgmise pĂ€eva temperatuur.