Wir teilen unsere Daten nun in die Zugvalidierungssätze (für die Rastersuche) und den Testsatz (für die Inferenz) auf.
X = df.drop(columns=['class',
'image']).copy().to_numpy()y = df['class'].to_numpy()
X_trainval, X_test, y_trainval, y_test = train_test_split(
X, y, test_size=0.25, random_state=143, stratify=y
)
Wir definieren unsere Hyperparameter und die Kreuzvalidierungsstrategie für die Pipeline und passen das Modell an.
rng = np.random.RandomState(143)skfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=rng)
pipeline = Pipeline([('scaler', StandardScaler()),
('classifier', LogisticRegression())])
param_grid = [
{
'classifier': [KNeighborsClassifier()],
'classifier__n_neighbors': [3, 5, 10, 15]
},
{
'classifier': [LogisticRegression(solver='saga', max_iter=10_000)],
'classifier__penalty': ['l1', 'l2'],
'classifier__C': [0.1, 1, 10]
},
{
'classifier': [SVC(random_state=rng)],
'classifier__kernel': ['linear', 'rbf'],
'classifier__C': [0.1, 1, 10]
},
{
'classifier': [RandomForestClassifier(random_state=rng)],
'classifier__n_estimators': [100, 150, 200],
'classifier__max_depth': [3, 5, 7]
},
{
'classifier': [GradientBoostingClassifier(random_state=rng)],
'classifier__n_estimators': [100, 150, 200],
'classifier__max_depth': [3, 5, 7]
}
]
gs = GridSearchCV(pipeline,
param_grid=param_grid,
cv=skfold,
verbose=1)
gs.match(X_trainval, y_trainval)
Dadurch erhalten wir ein optimales Modell, das die Blätter am genauesten klassifiziert. Der nächste Schritt besteht darin, dieses Modell anhand des Testsatzes zu bewerten.