|
|
4 months ago | |
|---|---|---|
| .. | ||
| solution | 4 months ago | |
| README.md | 4 months ago | |
| assignment.md | 7 months ago | |
| notebook.ipynb | 11 months ago | |
README.md
Regressziós modell készítése Scikit-learn segítségével: regresszió négy módon
Kezdő megjegyzés
A lineáris regressziót akkor használjuk, ha egy numerikus értéket szeretnénk előrejelezni (például házár, hőmérséklet vagy eladás). Ez úgy működik, hogy megtalálja azt a egyenes vonalat, amely a legjobban reprezentálja a bemeneti jellemzők és a kimenet közötti kapcsolatot.
Ebben az órában arra fókuszálunk, hogy megértsük a fogalmat, mielőtt átfogóbb regressziós technikákat fedeznénk fel.

Infografika készítője: Dasani Madipalli
Előadás előtti kvíz
Ez az óra R nyelven is elérhető!
Bevezetés
Eddig megtanultad, hogy mi a regresszió a tök árképzési adatain keresztül, amelyeket ezen az órán végig használni fogunk. Ezt Matplotlib segítségével vizualizáltad is.
Most készen állsz arra, hogy mélyebben elmerülj a gépi tanulás regressziójában. Míg a vizualizáció lehetővé teszi az adatok értelmezését, a gépi tanulás valódi ereje az modellek tanításában rejlik. A modelleket történelmi adatokon tanítják, hogy automatikusan felismerjék az adatok közötti összefüggéseket, és lehetővé teszik új adatok (amelyeket a modell korábban nem látott) kimenetének előrejelzését.
Ebben az órában két regressziótípusról tanulsz: alap lineáris regresszió és polinomiális regresszió, valamint az ezek mögött álló matematikai háttérről. Ezek a modellek lehetővé teszik, hogy megjósoljuk a tök árát különböző bemeneti adatok alapján.
🎥 Kattints a fenti képre egy rövid videós áttekintéshez a lineáris regresszióról.
Az oktatóanyag során minimális matematikai előzetes tudással számolunk, és a cél, hogy elérhető legyen más területekről érkező diákok számára, ezért figyeld a megjegyzéseket, 🧮 hívásokat, ábrákat és egyéb tanulást segítő eszközöket.
Előfeltétel
Mostanra ismerned kell a tök adatainak szerkezetét, amelyet vizsgálunk. Ezeket előre betöltve és megtisztítva megtalálod a dolgozat notebook.ipynb fájljában. Ebben a fájlban a tök ára bushelenként jelenik meg egy új adatkeretben. Győződj meg róla, hogy ezek a notebookok futtathatóak Visual Studio Code környezetben.
Előkészület
Emlékeztetőül: ezt az adatot azért töltöd be, hogy kérdéseket tegyél fel vele kapcsolatban.
- Mikor a legjobb idő tököt vásárolni?
- Milyen árat várhatok egy doboz miniatűr tökre?
- Érdemes fél bushel kosárban vagy 1 1/9 busheles dobozban vásárolni? Térjünk vissza az adatok mélyebb vizsgálatához.
Az előző órában létrehoztál egy Pandas adatkeretet, és feltöltötted az eredeti adatok egy részével, egységesítve az árakat bushel szerint. Ezáltal azonban csak körülbelül 400 adatpontot gyűjtöttél össze, és csak az őszi hónapokra.
Nézd meg az adatokat, amelyeket előre betöltöttünk ebben az óra jegyzetfüzetében. Az adatok előre betöltöttek, és az első szórt diagram már megmutatja a hónap adatokat. Talán több részletet tudunk kinyerni az adatok természetéről, ha jobban megtisztítjuk őket.
Lineáris regressziós egyenes
Ahogy az 1. órában megtanultad, a lineáris regresszió célja, hogy képes legyél felrajzolni egy olyan egyenest, amely:
- Mutatja a változók kapcsolatát. Megjeleníti a változók közötti kapcsolatot
- Képes előrejelzésekre. Pontos előrejelzéseket ad arról, hogy egy új adatpont hol eshet az egyeneshez képest.
A Legkisebb négyzetes regresszió típusú vonalat szokás így húzni. A "Legkisebb négyzetes" kifejezés azt a folyamatot jelenti, amikor minimalizáljuk a modellünkben az összes hibát. Minden adatpontnál mérjük a függőleges távolságot (reziduális néven ismert) az adott pont és a regressziós vonal között.
Ezeket a távolságokat négyzetre emeljük két fő okból:
-
Nagyobb jelentőség a nagyságra, irány helyett: Egy -5-ös hibaértéket ugyanolyan fontosnak akarunk kezelni, mint egy +5-öst. A négyzetre emelés miatt minden érték pozitív lesz.
-
Kiszámíthatatlan kiugrók megszűrése: A négyzetre emelés súlyosabb következményeket ad a nagyobb hibáknak, így az egyenes közelebb húzódik a távolabb eső pontokhoz is.
Ezután összeadjuk az összes négyzetre emelt értéket. A célunk megtalálni azt az egyenest, amelynél az összeg a legalacsonyabb (a lehető legkisebb)—innen ered a "Legkisebb négyzetek" elnevezés.
🧮 Mutasd meg a képletet
Ez az egyenes, amit legjobb illeszkedő egyenesnek hívunk, az alábbi egyenlettel fejezhető ki:
Y = a + bX
Xaz 'magyarázó változó'.Ya 'függő változó'. Az egyenes meredekségeb, ésaaz y-tengely metszéspontja, amiYértékét adjaX = 0esetén.Először kiszámoljuk a
bmeredekséget. Infografika készítője: Jen LooperMásként fogalmazva, és hivatkozva a tök adataink eredeti kérdésére: "jósoljuk meg a tök árát bushelenként hónap alapján", az
Xlenne az ár és azYaz eladás hónapja.Számítsuk ki az Y értékét. Ha $4 körül fizetsz, akkor április lehet! Infografika készítője: Jen Looper
Az egyenes meghatározásának matematikája demonstrálja a meredekséget, amely a metszési ponttól is függ, vagyis attól, hogy
Yhol helyezkedik el, haX = 0.Az értékek kiszámítását megfigyelheted a Math is Fun weboldalon. Látogasd meg továbbá ezt a Legkisebb négyzetes számológépet, hogy lásd, hogyan hatnak a számértékek az egyenesre.
Korreláció
Még egy kifejezést kell megérteni: ez a Korrelációs együttható az adott X és Y változók között. Szórt diagram segítségével gyorsan vizualizálhatod ezt az együtthatót. Ha az adatpontok szépen rendezett vonalban helyezkednek el, a korreláció magas, de ha szétszórtan vannak, a korreláció alacsony.
Egy jó lineáris regressziós modell az lesz, amely Legkisebb négyzetes regresszió módszerrel egy magas (inkább 1-hez közel, mint 0-hoz) Korrelációs együtthatót mutat.
✅ Futtasd le az óra kísérő jegyzetfüzetét, és nézd meg a Hónap és Ár szórt diagramját. Úgy tűnik a hónap-ár kapcsolat a tök eladásoknál magas vagy alacsony korrelációt mutat? Ez változik, ha az Hónap helyett finomabb felbontást használsz, például az év napját (azaz hányadik napja az évnek)?
A lentebbi kódban feltételezzük, hogy megtisztítottuk az adatokat, és rendelkezünk egy new_pumpkins nevű adatkerettel, amely hasonló a következőhöz:
| ID | Month | DayOfYear | Variety | City | Package | Low Price | High Price | Price |
|---|---|---|---|---|---|---|---|---|
| 70 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364 |
| 71 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636 |
| 72 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636 |
| 73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 17.0 | 17.0 | 15.454545 |
| 74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364 |
A tisztításhoz használt kód megtalálható a
notebook.ipynbfájlban. Ugyanazokat a tisztítási lépéseket hajtottuk végre, mint az előző órában, és kiszámoltuk aDayOfYearoszlopot a következő kifejezéssel:
day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)
Most, hogy érted a lineáris regresszió mögötti matematikát, hozzunk létre egy regressziós modellt, hogy megnézzük, tudjuk-e előre jelezni, melyik tökcsomag ára lesz a legjobb. Valaki, aki tököt vásárol farsangi tökkiállításra, ezt az információt felhasználhatja, hogy optimalizálja a vásárlását.
Korreláció keresése
🎥 Kattints a fenti képre egy rövid videós áttekintéshez a korrelációról.
Az előző órából valószínűleg láttad, hogy a havi átlagárak így néznek ki:
Ez arra utal, hogy kell lennie némi korrelációnak, és megpróbálhatunk lineáris regressziós modellt tanítani, hogy előre jelezzük a Hónap és Ár vagy a DayOfYear és Ár kapcsolatot. Itt egy szórt diagram, amely az utóbbi kapcsolatot mutatja:
Nézzük meg, van-e korreláció a corr függvénnyel:
print(new_pumpkins['Month'].corr(new_pumpkins['Price']))
print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price']))
Úgy tűnik, a korreláció meglehetősen kicsi, -0,15 a Hónap szerint, és -0,17 a DayOfYear szerint, de lehet, hogy van egy másik fontos kapcsolat. Úgy tűnik, különböző ár clusteringek vannak, amelyek különböző tökfajtákhoz kapcsolódnak. Ennek megerősítéséhez ábrázoljuk minden tökkategóriát más színnel. Az ax paraméter átadásával a scatter függvénynek minden pont ugyanazon a grafikonon jelenik meg:
ax=None
colors = ['red','blue','green','yellow']
for i,var in enumerate(new_pumpkins['Variety'].unique()):
df = new_pumpkins[new_pumpkins['Variety']==var]
ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var)
A vizsgálatunk arra utal, hogy a tökfajta jobban befolyásolja az árat, mint az eladási időpont. Ezt látjuk egy oszlopdiagramon is:
new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
Most fókuszáljunk csak az egyik tökfajtára, az "pie type"-ra, és nézzük meg, milyen hatással van a dátum az árra:
pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price')
Ha most kiszámoljuk a korrelációt a Price és DayOfYear között a corr függvénnyel, az körülbelül -0,27 lesz - ami azt jelenti, hogy érdemes prediktív modellt tanítani.
A lineáris regressziós modell betanítása előtt fontos, hogy az adataink tiszták legyenek. A lineáris regresszió nem működik jól hiányzó értékekkel, ezért érdemes eltávolítani az összes üres cellát:
pie_pumpkins.dropna(inplace=True)
pie_pumpkins.info()
Egy másik megközelítés, ha ezeket az üres értékeket az adott oszlop átlagával töltjük ki.
Egyszerű lineáris regresszió
🎥 Kattints a fenti képre egy rövid videós összefoglalóhoz a lineáris és polinomiális regresszióról.
A lineáris regressziós modellünk betanításához a Scikit-learn könyvtárat használjuk.
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
Először szétválasztjuk a bemeneti értékeket (jellemzőket) és a várt kimenetet (címkét) külön-numpy tömbökbe:
X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
y = pie_pumpkins['Price']
Figyeljük meg, hogy a bemeneti adatokat át kellett alakítanunk a
reshapesegítségével, hogy a Lineáris Regressziós csomag helyesen értse azokat. A lineáris regresszió 2D tömböt vár bemenetként, ahol a tömb minden sora egy bemeneti jellemző vektort reprezentál. Jelen esetben egyetlen bemenet van, ezért egy N×1 alakú tömböt kell létrehoznunk, ahol N az adatkészlet mérete.
Ezután fel kell osztanunk az adatokat tanító és teszt adatokra, hogy a modellt a tanítás után tudjuk validálni:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
Végül az lineáris regressziós modell tényleges betanítása csak két sor kódot vesz igénybe. Definiáljuk a LinearRegression objektumot, és az adatainkra illesztjük a fit módszerrel:
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)
A LinearRegression objektum a fit-elés után tartalmazza a regresszió összes együtthatóját, amelyek az .coef_ tulajdonsággal érhetőek el. Esetünkben csak egy együttható van, amely körülbelül -0.017 körül kell legyen. Ez azt jelenti, hogy az árak idővel valamennyire csökkenni látszanak, de nem túl sokat, körülbelül 2 cent naponta. A regressziós egyenes Y-tengellyel való metszéspontjához az lin_reg.intercept_ segítségével férhetünk hozzá - ez nálunk körülbelül 21 lesz, amely az év eleji árat jelzi.
Ahhoz, hogy lássuk, mennyire pontos a modellünk, először az árakat megjósolhatjuk egy teszt adathalmazon, majd megmérhetjük, milyen közel vannak a becslések a várt értékekhez. Ezt az úgynevezett gyökös átlagos négyzetes hibával (RMSE) mérjük, ami az elvárt és becsült értékek közötti négyzetes különbségek átlagának gyöke.
pred = lin_reg.predict(X_test)
rmse = np.sqrt(mean_squared_error(y_test,pred))
print(f'RMSE: {rmse:3.3} ({rmse/np.mean(pred)*100:3.3}%)')
Hibaértékünk körülbelül 2 pont körül van, ami nagyjából 17%. Nem túl jó. A modell minőségének másik mutatója a determinációs együttható, amely így számítható ki:
score = lin_reg.score(X_train,y_train)
print('Model determination: ', score)
Ha az érték 0, az azt jelenti, hogy a modell nem veszi figyelembe a bemeneti adatokat, és a legrosszabb lineáris becslőként működik, amely egyszerűen az eredmény átlagértéke. Az 1-es érték azt jelenti, hogy tökéletesen meg tudjuk jósolni az összes várt kimenetet. Nálunk az együttható körülbelül 0.06, ami elég alacsony.
Meg is rajzolhatjuk a tesztadatokat a regressziós egyenessel együtt, hogy jobban lássuk a regresszió működését:
plt.scatter(X_test,y_test)
plt.plot(X_test,pred)
Polinomiális regresszió
A lineáris regresszió egy másik típusa a polinomiális regresszió. Bár néha lineáris kapcsolat van a változók között – például minél nagyobb egy tök térfogata, annál magasabb az ára –, néha ezek a kapcsolatok nem ábrázolhatók síkkal vagy egyenes vonallal.
✅ Itt vannak további példák olyan adatokra, amelyek polinomiális regressziót igényelhetnek.
Nézzük meg újra a Dátum és Ár közötti kapcsolatot. Ez a pontfelhő valóban úgy néz ki, hogy feltétlenül egy egyenes vonallal kell elemezni? Nem ingadozhatnak az árak? Ilyen esetben polinomiális regressziót használhatunk.
✅ A polinomok olyan matematikai kifejezések, amelyek egy vagy több változót és együtthatót tartalmazhatnak.
A polinomiális regresszió ívelt görbét hoz létre, hogy jobban illeszkedjen a nemlineáris adatokra. Esetünkben, ha a bemeneti adatok közé beillesztünk egy négyzetes DayOfYear változót, akkor egy parabolikus görbét tudunk illeszteni, amelynek lesz minimuma az év egy bizonyos pontján.
A Scikit-learn egy hasznos pipeline API-t kínál a különböző adatfeldolgozási lépések összekapcsolására. Egy pipeline egy láncolata az estimátoroknak. Esetünkben egy olyan csővezetéket hozunk létre, amely először polinomiális jellemzőket ad a modellhez, majd megtanítja a regressziót:
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
A PolynomialFeatures(2) használata azt jelenti, hogy minden másodfokú polinomot belefoglalunk a bemeneti adatokból. Esetünkben ez csak a DayOfYear2 lesz, de ha két bemeneti változónk van X és Y, akkor ez hozzáadja az X2, XY és Y2 kifejezéseket. Szükség esetén magasabb fokú polinomokat is használhatunk.
A pipeline-ok ugyanúgy használhatók, mint az eredeti LinearRegression objektum, azaz fit-elhetjük őket, és azután predict-tel kérhetjük le az előrejelzés eredményét:
pred = pipeline.predict(X_test)
rmse = np.sqrt(mean_squared_error(y_test,pred))
print(f'RMSE: {rmse:3.3} ({rmse/np.mean(pred)*100:3.3}%)')
score = pipeline.score(X_train,y_train)
print('Model determination: ', score)
A sima közelítő görbe megrajzolásához a np.linspace-t használjuk, hogy egyenletes bemeneti értéktartományt hozzunk létre, nem pedig közvetlenül a rendezetlen tesztadatokra rajzolunk (ami cikcakkos vonalat eredményezne):
X_range = np.linspace(X_test.min(), X_test.max(), 100).reshape(-1,1)
y_range = pipeline.predict(X_range)
plt.scatter(X_test, y_test)
plt.plot(X_range, y_range)
Itt látható a grafikon, amely a tesztadatokat és a közelítő görbét mutatja:
A polinomiális regresszió használatával kicsit alacsonyabb RMSE-t és magasabb determinációt érhetünk el, de nem jelentősen. Más jellemzőket is figyelembe kell vennünk!
Látható, hogy a legkisebb tökárak valahol Halloween környékén fordulnak elő. Hogyan magyaráznád ezt?
🎃 Gratulálok, most készítettél egy olyan modellt, amely segíthet a pitetök árának előrejelzésében. Valószínűleg ugyanígy megismételheted ugyanezt az eljárást az összes tökfajtára, de az fárasztó lenne. Most tanuljuk meg, hogyan lehet figyelembe venni a tökfajtát a modellünkben!
Kategóriák jellemzői
Az ideális világban ugyanazzal a modellel szeretnénk képesek lenni az árak előrejelzésére különböző tökfajták esetén is. Azonban a Variety oszlop valamiben különbözik az olyan oszlopoktól, mint a Month, mert nem numerikus értékeket tartalmaz. Az ilyen oszlopokat kategóriálisnak nevezzük.
🎥 Kattints a fenti képre egy rövid videós áttekintésért a kategóriális jellemzők használatáról.
Itt láthatod, hogy az átlagár hogyan függ a fajtától:
A fajták figyelembevételéhez először át kell alakítani őket numerikus formára, vagyis kódolni kell őket. Többféle módon tehetjük ezt meg:
- Az egyszerű numerikus kódolás egy táblázatot épít a különböző fajtákról, majd a fajtanév helyére egy indexet ír. Ez lineáris regresszió esetén nem a legjobb megoldás, mert a lineáris regresszió az index számértékét veszi figyelembe, és valamilyen együtthatóval szorozva adja hozzá az eredményhez. Esetünkben az indexek számszerű értéke és az ár közötti kapcsolat egyértelműen nemlineáris, még akkor is, ha az indexeket valamilyen speciális sorrendbe állítjuk.
- A one-hot kódolás a
Varietyoszlopot négy külön oszlopra bontja, egyre minden fajtához. Minden oszlop1értéket tartalmaz, ha az adott sor az adott fajtához tartozik, különben0-t. Ez azt jelenti, hogy négy együttható lesz a lineáris regresszióban, egy-egy minden tökfajtára, amelyek az adott fajta kezdeti árát (vagy inkább "kiegészítő árát") képviselik.
Az alábbi kód megmutatja, hogyan lehet one-hot kódolni a fajtát:
pd.get_dummies(new_pumpkins['Variety'])
| ID | FAIRYTALE | MINIATURE | MIXED HEIRLOOM VARIETIES | PIE TYPE |
|---|---|---|---|---|
| 70 | 0 | 0 | 0 | 1 |
| 71 | 0 | 0 | 0 | 1 |
| ... | ... | ... | ... | ... |
| 1738 | 0 | 1 | 0 | 0 |
| 1739 | 0 | 1 | 0 | 0 |
| 1740 | 0 | 1 | 0 | 0 |
| 1741 | 0 | 1 | 0 | 0 |
| 1742 | 0 | 1 | 0 | 0 |
Lineáris regresszió tanításához one-hot kódolt fajta bemenettel, helyesen kell inicializálni az X és y adatokat:
X = pd.get_dummies(new_pumpkins['Variety'])
y = new_pumpkins['Price']
A többi kód ugyanolyan, mint fent a lineáris regresszió tanításánál. Ha kipróbálod, látni fogod, hogy az átlagos négyzetes hiba nagyjából ugyanaz, de a determinációs együttható sokkal magasabb (körülbelül 77%). Még pontosabb előrejelzésekhez több kategóriás jellemzőt és numerikus jellemzőket is figyelembe vehetünk, például a Month vagy a DayOfYear. Ahhoz, hogy egy nagy jellemzőtömböt kapjunk, használhatjuk a join-t:
X = pd.get_dummies(new_pumpkins['Variety']) \
.join(new_pumpkins['Month']) \
.join(pd.get_dummies(new_pumpkins['City'])) \
.join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']
Itt figyelembe vesszük a City és a Package típust is, ami 2.84-es (10.5%) RMSE-t és 0.94-es determinációs értéket eredményez!
Mindent egybevetve
A legjobb modellhez az előző példából származó kombinált (one-hot kódolt kategóriás + numerikus) adatokat használhatjuk a polinomiális regresszióval együtt. Íme a teljes kód a kényelmedért:
# tanítóadatok előkészítése
X = pd.get_dummies(new_pumpkins['Variety']) \
.join(new_pumpkins['Month']) \
.join(pd.get_dummies(new_pumpkins['City'])) \
.join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']
# tanító-teszt felosztás készítése
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# a folyamat beállítása és betanítása
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
# tesztadatokra eredmények előrejelzése
pred = pipeline.predict(X_test)
# RMSE és determináció számítása
rmse = mean_squared_error(y_test, pred, squared=False)
print(f'RMSE: {rmse:3.3} ({rmse/pred.mean()*100:3.3}%)')
score = pipeline.score(X_train,y_train)
print('Model determination: ', score)
Ennek a modellnek a determinációs együtthatója majdnem 97% lesz, az RMSE pedig 2.23 (kb. 8% előrejelzési hiba).
| Modell | RMSE | Determináció |
|---|---|---|
DayOfYear lineáris |
2.77 (17.2%) | 0.07 |
DayOfYear polinomiális |
2.73 (17.0%) | 0.08 |
Variety lineáris |
5.24 (19.7%) | 0.77 |
| Minden jellemző lineáris | 2.84 (10.5%) | 0.94 |
| Minden jellemző polinomiális | 2.23 (8.25%) | 0.97 |
🏆 Szép munka! Egy leckében négy regressziós modellt készítettél, és a modell pontosságát 97%-ra javítottad. A regresszió befejező szakaszában megismerkedhetsz a logisztikus regresszióval kategóriák meghatározásához.
🚀Kihívás
Tesztelj több különböző változót ebben a jegyzetfüzetben, hogy lásd, hogyan korrelál a változók közötti kapcsolat a modell pontosságával.
Előadás utáni kvíz
Áttekintés és önálló tanulás
Ebben a leckében a lineáris regresszióval ismerkedtünk meg. Vannak más fontos regressziótípusok is. Olvass a lépcsőzetes, Ridge, Lasso és Elasticnet technikákról. Jó tanfolyam a témában a Stanford Statisztikai tanulás kurzus.
Feladat
Nyilatkozat:
Ezt a dokumentumot az AI fordító szolgáltatás, a Co-op Translator segítségével fordítottuk le. Bár igyekszünk pontosságra törekedni, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum anyanyelvű változata tekintendő hivatalos forrásnak. Fontos információk esetén professzionális, emberi fordítást javaslunk. Nem vállalunk felelősséget a fordítás használatából eredő félreértésekért vagy félreértelmezésekért.





