Proces ten polega na podzieleniu zbioru danych na k równych części (folds).
W Scikit-learn implementuje to funkcja cross_val_score
z opcją KFold
do określenia liczby podziałów (k).
GridSearchCV to metoda doboru hiperparametrów w Scikit-learn
, która testuje wszystkie kombinacje zadanych wartości hiperparametrów, aby znaleźć najlepszą.
Zdefiniowanie siatki: Użytkownik definiuje wartości hiperparametrów. Przykład dla RandomForestClassifier
:
n_estimators
: [100, 200, 300]max_depth
: [5, 10, 15]Przegląd kombinacji: Model trenowany jest dla każdej kombinacji hiperparametrów, a wydajność oceniana na zbiorze walidacyjnym. Używa się walidacji krzyżowej (cv
).
Ocena: Wyniki dla każdej kombinacji są mierzone za pomocą zdefiniowanej metryki, np. accuracy
czy F1-score
.
Wybór najlepszego zestawu: Po przetestowaniu wszystkich kombinacji, zestaw hiperparametrów o najlepszym wyniku zostaje wybrany.
W Scikit-learn implementowane przez GridSearchCV
.
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
# Załadowanie danych
data = load_iris()
X, y = data.data, data.target
# Podział na dane treningowe i testowe
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Definicja hiperparametrów
param_grid = {
'n_estimators': [100, 200, 300],
'max_depth': [5, 10, 15]
}
# Model Random Forest
model = RandomForestClassifier()
# Grid Search z walidacją krzyżową (5-fold) na danych treningowych
grid_search = GridSearchCV(model, param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)
# Najlepsze parametry
print(f"Najlepsze parametry: {grid_search.best_params_}")
# Ocena na zbiorze testowym
test_accuracy = grid_search.score(X_test, y_test)
print(f"Dokładność na zbiorze testowym: {test_accuracy:.2f}")
#Wynik
#Najlepsze parametry: {'max_depth': 10, 'n_estimators': 300}
#Dokładność na zbiorze testowym: 0.98
RandomizedSearchCV to alternatywa dla Grid Search, która nie przeszukuje wszystkich możliwych kombinacji, a jedynie losowo wybrane próbki z przestrzeni hiperparametrów.
W Scikit-learn implementowane przez RandomizedSearchCV
.
from sklearn.model_selection import RandomizedSearchCV, train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from scipy.stats import randint
from sklearn.metrics import accuracy_score
# Załadowanie danych
data = load_iris()
X, y = data.data, data.target
# Podział na dane treningowe i testowe
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Definicja zakresów dla hiperparametrów
param_dist = {
'n_estimators': randint(100, 500),
'max_depth': randint(5, 20)
}
# Model Random Forest
model = RandomForestClassifier()
# Random Search z walidacją krzyżową (5-fold), 10 losowych próbek
random_search = RandomizedSearchCV(model, param_dist, n_iter=10, cv=5, scoring='accuracy', random_state=42)
random_search.fit(X_train, y_train)
# Najlepsze parametry
print(f"Najlepsze parametry: {random_search.best_params_}")
# Ocena na zbiorze testowym
y_pred = random_search.predict(X_test)
test_accuracy = accuracy_score(y_test, y_pred)
print(f"Dokładność na zbiorze testowym: {test_accuracy:.2f}")
n_estimators
: [100, 200, 300]max_depth
: [5, 10, 15]n_estimators
: od 100 do 500max_depth
: od 5 do 20Pozwala zobaczyć, jak model klasyfikuje próbki: ile razy poprawnie przewiduje daną klasę, a ile razy pomyli się, klasyfikując próbki do innych klas.
Elementy Confusion Matrix
Predicted Positive Predicted Negative
Actual Pos 50 10
Actual Neg 5 35
- Model poprawnie przewidział 50 pozytywnych przypadków (TP) i 35 negatywnych (TN).
- 5 negatywnych przypadków zostało błędnie przewidzianych jako pozytywne (FP).
- 10 pozytywnych przypadków zostało błędnie sklasyfikowanych jako negatywne (FN).
from sklearn.metrics import confusion_matrix, classification_report y_true = [0, 0, 1, 1, 0, 1, 0, 1, 1, 1] # rzeczywiste etykiety
y_pred = [0, 1, 1, 1, 0, 0, 0, 1, 1, 1] # przewidziane etykiety
# Macierz pomyłek
cm = confusion_matrix(y_true, y_pred) print("Macierz pomyłek:") print(cm)
print("\nRaport klasyfikacji:")
print(classification_report(y_true, y_pred))
#Macierz pomyłek:
#[[3 1]
#[1 5]]
#Raport klasyfikacji:
# precision recall f1-score support
# 0 0.75 0.75 0.75 4
# 1 0.83 0.83 0.83 6
# accuracy 0.80 10
# macro avg 0.79 0.79 0.79 10
#weighted avg 0.80 0.80 0.80 10
Ćwiczenia dla tego tematu zostały zebrane tutaj.
Kliknij tutaj, aby wrócić do strony głównej kursu.