Open njs03332 opened 2 years ago
위의 그림처럼 모든 샘플이 경계 바깥쪽에 완벽히 분류된다면 하드 마진 분류
하지만, 하드 마진 분류는 1. 데이터가 선형적으로 구분될 수 있을 때 제대로 작동 2. 이상치에 민감
아래와 같은 경우에는 하드 마진을 찾을 수 없음
그래서 조금 더 유연한 모델 필요
경계 사이의 폭을 가능한 넓게 유지하는 것과 마진 오류(잘못 분류된 것) 사이에 적절한 균형을 잡는 것, 소프트 마진 분류
SVM에 하이퍼파라미터 C는 잘못 분류된 마진 오류에 대한 Cost
왼쪽은 C가 작아서 마진 내로 잘못 분류된 서포트 벡터가 있더라도 용인이 많이 되어 마진 폭이 큼, 오른쪽은 C가 커서 마진 내로 잘못 분류된 서포트 벡터가 있다면 높은 비용이 따르므로 마진 폭이 좁음
SVM이 과대적합이라면 C를 감소시켜 모델을 규제할 수 있음
선형 SVM 훈련을 위해 다음 세 가지 방법
LinearSVC(C=1, loss="hinge")
SVC(kernel="linear", C=1) # 데이터셋이 크면 속도가 매우 느리기 때문체 추천은 하지 않음
SGDClassifier(loss="hinge", alpha=1/(m*C)) # LinearSVC보다 수렴은 느리나 메모리보다 크기가 큰 데이터셋을 다룰 때는 유용
from sklearn.datasets import make_moons
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
X, y = make_moons(n_samples=100, noise=0.15) polynomial_svm_clf = Pipeline([ ("poly_features", PolynomialFeatures(degree=3)), ("scaler", StandaradScaler()), ("svm_clf", LinearSVC(C=10, loss="hinge")) ])
polynomial_svm_clf.fit(X, y)
![image](https://user-images.githubusercontent.com/26505830/171621524-502318d7-8b84-410e-8f8b-11e686c2b321.png)
### 5.2.1 다항식 커널
- 다항식 특성을 추가하는 것은 간단하고 모든 머신러닝 알고리즘에서 잘 작동함
- 하지만 낮은 차수의 다항식은 매우 복잡한 데이터셋을 잘 표현하지 못하고,
높은 차수의 다항식은 굉장히 많은 특성을 추가하므로 모델을 느리게 만듦
- SVM의 경우 커널트릭을 사용해 실제로는 특성을 추가하지 않으면서 다항식 특성을 많이 추가한 것과 같은 결과를 얻을 수 있음
- 모델이 과대적합이라면 다항식 차수를 줄여야하고, 과소적합이라면 차수를 늘려야 함
- coef0는 모델이 높은 차수와 낮은 차수에 얼마나 영향을 받을지 조절
```python
from sklearn.svm import SVC
poly_kernel_svm_clf = Pipeline([
("scaler", StandardScaler()),
("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5))
])
poly_kernel_svm_clf.fit(X,y)
X = iris["data"][:, (2, 3)] # 꽃잎 길이, 꽃잎 너비
y = iris["target"]
softmax_reg = LogisticRegression(multi_class="multinomial", solver="lbfgs", C=10) softmax_reg.fit(X, y)
- 꽃잎 길이 5, 너비 2인 붓꽃의 경우 94.2%의 확률로 Iris-Virginica (클래스2)라고 출력함
```python
>>> softmax_reg.predict([[5, 2]])
array([2])
>>> softmax_Reg.predict_proba([[5, 2]])
array([[6.38014896e-09, 5.74929995e-01, 9.42506362e-01]])