Főoldal / Gépi tanulás alapjai

Gépi tanulás alapjai: scikit-learn és adatelőkészítés

Az adatelőkészítés lépései gépi tanuláshoz: hiányzó értékek kezelése, normalizálás, jellemzőkiválasztás és modellek kiértékelése scikit-learn segítségével.

scikit-learn gépi tanulás Python könyvtár

A scikit-learn helye az ökoszisztémában

A scikit-learn az egyik legszélesebb körben használt Python könyvtár gépi tanuláshoz. Egységes API-t biztosít osztályozás, regresszió, klaszterezés és dimenziócsökkentés feladataihoz. Minden modell a fit(), predict() és score() metódusok révén illeszkedik ugyanabba a mintába, ami megkönnyíti az algoritmusok közötti váltást.

A könyvtár nem alkalmas nagy mértékű párhuzamos tanításra (erre Apache Spark MLlib vagy mélytanulási keretrendszerek szolgálnak), de prototípus-készítésre és közepes méretű adathalmazok esetén iparági standard megoldásnak számít.

Dokumentáció

A scikit-learn teljes dokumentációja és felhasználói útmutatója elérhető a scikit-learn.org oldalon. Az API-referencia és a példagalériában közel 500 futtatható notebookpélda található.

A gépi tanulási munkafolyamat

Egy tipikus gépi tanulási projekt nem kizárólag a modell betanítását jelenti. A munkafolyamat lépései nagyjából az alábbiak szerint alakulnak:

  1. Adatgyűjtés és -feltárás (EDA)
  2. Adatelőkészítés és jellemzőtervezés
  3. Adatok felosztása tanító és tesztelő halmazra
  4. Modell kiválasztása és betanítása
  5. Kiértékelés és hiperparaméter-optimalizálás
  6. Eredmények értelmezése és dokumentálása

Az adatelőkészítés (2. lépés) jellemzően a projekt teljes idejének legjelentősebb részét veszi igénybe. Egy hiányos vagy rosszul előkészített adathalmaz közvetlen hatással van a modell teljesítményére.

Adatok felosztása

A modell teljesítményének megbízható méréséhez az adatokat tanító és tesztelő halmazra kell osztani. A teszt halmaz adatait a modell egyszer sem láthatja a tanítás során.

from sklearn.model_selection import train_test_split import pandas as pd df = pd.read_csv('adatok.csv') X = df.drop('cimke', axis=1) y = df['cimke'] X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42, stratify=y )

A stratify=y paraméter biztosítja, hogy az osztályok aránya mindkét halmazban megegyezzen az eredeti eloszlással – osztályozási feladatoknál ez különösen fontos kiegyensúlyozatlan adatoknál.

Adatelőkészítés

Numerikus jellemzők normalizálása

Sok modell érzékeny az adatok skálázására. A StandardScaler nullára centrálja és egységnyire normalizálja az adatokat (Z-score normalizálás), míg a MinMaxScaler a [0, 1] intervallumba skálázza.

from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test)

Fontos: a fit_transform() kizárólag a tanító halmazon fut – a tesztelő halmazon csak a transform() alkalmazható, hogy elkerüljük az adatszivárgást (data leakage).

Kategorikus változók kódolása

A gépi tanulási modellek általában numerikus bemenetet várnak. A kategorikus változókat kódolni kell:

from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder ohe = OneHotEncoder(sparse_output=False, handle_unknown='ignore') X_encoded = ohe.fit_transform(X_train[['varos', 'kategoria']])

A OneHotEncoder nominális változókhoz alkalmas (ahol nincs sorrend), az OrdinalEncoder pedig ordinális változókhoz (ahol a sorrend értelmes, például "alacsony / közepes / magas").

Pipeline használata

A scikit-learn Pipeline osztálya lehetővé teszi az előfeldolgozási lépések és a modell összekapcsolását egyetlen objektumba. Ez megakadályozza az adatszivárgást és egyszerűbbé teszi a kód struktúráját.

from sklearn.pipeline import Pipeline from sklearn.ensemble import RandomForestClassifier pipeline = Pipeline([ ('scaler', StandardScaler()), ('model', RandomForestClassifier(n_estimators=100, random_state=42)) ]) pipeline.fit(X_train, y_train) pontossag = pipeline.score(X_test, y_test) print(f"Pontosság: {pontossag:.3f}")

Modellek és kiértékelés

A modell megválasztása az adatok jellegétől és a feladat típusától függ. Az alábbi algoritmusok a scikit-learn-ben könnyen elérhetők:

Osztályozás

  • Logisztikus regresszió: egyszerű, jól értelmezhető alapvonal
  • Random Forest: robusztus, kevés hangolást igényel
  • Gradient Boosting: általában magasabb pontosságot ér el, de lassabb
  • SVM: kis-közepes adathalmazokra, magas dimenziós terekre jó

Regresszió

  • Lineáris regresszió: alapvonal, értelmezhetőség prioritásakor
  • Ridge, Lasso: regularizált változatok, ha túlillesztés várható
  • Random Forest Regressor: nemlineáris összefüggésekre

Kiértékelési metrikák

from sklearn.metrics import ( classification_report, confusion_matrix, mean_absolute_error, r2_score ) y_pred = pipeline.predict(X_test) print(classification_report(y_test, y_pred)) print(confusion_matrix(y_test, y_pred))

Osztályozásnál a pontosság (accuracy) mellett fontos figyelni a precíziót (precision), visszahívást (recall) és az F1-pontszámot, különösen kiegyensúlyozatlan osztályok esetén. Regressziónál az MAE (Mean Absolute Error) és R² a leggyakrabban alkalmazott metrikák.

Keresztvalidáció

Az egyetlen tanító/teszt felosztás eredménye véletlenszerű lehet. A keresztvalidáció (cross-validation) megbízhatóbb képet ad a modell általánosítási képességéről.

from sklearn.model_selection import cross_val_score eredmenyek = cross_val_score( pipeline, X, y, cv=5, scoring='f1_weighted' ) print(f"Átlag F1: {eredmenyek.mean():.3f} ± {eredmenyek.std():.3f}")

Felhasználási területek Magyarországon

A scikit-learn alapú gépi tanulás Magyarországon egyre szélesebb körben alkalmazzák. A pénzügyi szektorban hitelkockázat-értékelés és csalásdetektálás, az egészségügyben diagnosztikai segédeszközök, a közlekedésben forgalomoptimalizálás, a kiskereskedelemben keresletelemzés.

Az MNB (Magyar Nemzeti Bank) és egyes nagyobb kereskedelmi bankok publikáltan alkalmazzák gépi tanulási módszereket kockázatmodellezésre, bár a konkrét implementációk nem nyilvánosak. Az KSH által publikált nyilvános adatsorok alkalmasak prediktív modellek tesztelésére és oktatási célú projektekhez.

Megjegyzés

A scikit-learn 1.0-s verziótól az API bizonyos elnevezései megváltoztak. Például a sparse paraméter neve sparse_output lett a OneHotEncoder-ben. Érdemes a könyvtár verziószámát rögzíteni a requirements.txt fájlban a reprodukálhatóság érdekében.

Kapcsolódó cikkek