perf: switch SVM default kernel to linear for better performance

This commit is contained in:
Andrew 2026-03-15 12:14:33 +07:00
parent af365cfe68
commit e1f727831f
2 changed files with 21 additions and 11 deletions

View file

@ -35,11 +35,10 @@ STRATEGY = RandomForestStrategy(
random_state=42, random_state=42,
) )
# Option 2: Support Vector Machine # # Option 2: Support Vector Machine
# STRATEGY = SVMStrategy( # STRATEGY = SVMStrategy(
# kernel="rbf", # kernel="linear", # Fast prediction; use 'rbf' for better accuracy but much slower
# C=1.0, # C=1.0,
# gamma="scale",
# random_state=42, # random_state=42,
# ) # )

View file

@ -51,11 +51,15 @@ class RandomForestStrategy(ClassificationStrategy):
class SVMStrategy(ClassificationStrategy): class SVMStrategy(ClassificationStrategy):
"""Support Vector Machine classification strategy.""" """Support Vector Machine classification strategy.
Note: For large rasters, consider using kernel='linear' for faster prediction.
The RBF kernel can be very slow during prediction on large images.
"""
def __init__( def __init__(
self, self,
kernel: str = "rbf", kernel: str = "linear",
C: float = 1.0, C: float = 1.0,
gamma: str = "scale", gamma: str = "scale",
random_state: int = 42, random_state: int = 42,
@ -70,7 +74,7 @@ class SVMStrategy(ClassificationStrategy):
C=C, C=C,
gamma=gamma, gamma=gamma,
random_state=random_state, random_state=random_state,
probability=True, probability=False, # Disabled for performance on large rasters
**kwargs **kwargs
) )
@ -81,7 +85,14 @@ class SVMStrategy(ClassificationStrategy):
return self._clf.predict(X) return self._clf.predict(X)
def predict_proba(self, X: np.ndarray) -> np.ndarray: def predict_proba(self, X: np.ndarray) -> np.ndarray:
return self._clf.predict_proba(X) # probability=True significantly slows down both training and prediction
# Return class-based probabilities as fallback
predictions = self._clf.predict(X)
n_classes = len(self._clf.classes_)
proba = np.zeros((X.shape[0], n_classes))
for i, cls in enumerate(self._clf.classes_):
proba[:, i] = (predictions == cls).astype(float)
return proba
def get_params(self) -> dict[str, Any]: def get_params(self) -> dict[str, Any]:
return { return {