overfitting: hard margin(제약 ↑) > C 값을 낮춤
underfitting: soft margin(제약 ↓) > C 값을 높임
#데이터 로딩/ train,test set 나누기
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)
#전처리 -Scaling
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
#모델 생성 및 학습
#작으면 : soft - under fitting, 너무크면: hard - over fitting
#from sklearn.svm import SVC, linearSVC < 이거로 사용 가능
C_list = [0.0001, 0.001, 0.01, 0.1, 1, 10, 100]
train_acc_list = []
test_acc_list = []
for C in C_list:
svc = SVC(kernel='linear', C=C, random_state=0) #linearSVC()
svc.fit(X_train_scaled, y_train)
pred_train = svc.predict(X_train_scaled)
pred_test = svc.predict(X_test_scaled)
train_acc_list.append(accuracy_score(y_train, pred_train))
test_acc_list.append(accuracy_score(y_test, pred_test))
svc kernel : linear(선형)/rbf, poly, sigmoid (비선형)
x, y 값 차이 클때, 지수적으로 증가: log사용
# y, x의 값의 차이가 크다 -> 변화 흐름을 제대로 확인하기가 어렵다 #0.6 -> 0.9x ===> (0.9,1.0) # X: 지수적으로 증가 => log print(C_list) print(np.log10(np.array(C_list)))
C를 고정하고 gamma값을 변경해서 모델의 복잡도를 확인
C, gamma: 큰값 - 복잡한 모델(강한 규제), overfitting이 발생할 수 있다.
: 작은 값 - 단순한 모델(약한 규제), underfitting이 발생할 수 있다.
overfitting: C, gamma 를 감소
underfitting: C, gamma를 증가
gamma_list = [0.0001, 0.001, 0.01, 0.1, 1, 10, 100] #default:1
train_acc_list =[]
test_acc_list =[]
for gamma in gamma_list:
svc = SVC(kernel='rbf', #rbf: 기본, 'poly', 'sigmoid', 'linear'(선형)
C=1, #C는 고정
gamma = gamma,
random_state=0
)
svc.fit(X_train_scaled, y_train)
pred_train = svc.predict(X_train_scaled)
pred_test = svc.predict(X_test_scaled)
train_acc_list.append(accuracy_score(y_train, pred_train))
test_acc_list.append(accuracy_score(y_test, pred_test))
SVC -> probability=True(default:False)로 설정해야 predict_proba()-클래스별 확률-을 조회할 수 있다.
ROC AUC score/ AP score 볼때
-gridsearch
- kernel: 'linear', 'rbf'
- C, gamma: 0.001, 0.01, 0.1, 1, 10
- 평가지표: accuracy(refit), roc_auc, average_precision
#pipeline
from sklearn.pipeline import Pipeline
pipeline = Pipeline([('scaler',StandardScaler()),('svm',SVC(random_state=0, probability=True))], verbose=True)
#grid search
params = {
"svm__kernel":['linear','rbf','poly','sigmoid'], #linear만 선형, 나머지는 비선형
"svm__C":[0.001, 0.01, 0.1, 1, 10],
"svm__gamma":[0.001, 0.01, 0.1, 1, 10]
#<-underfitting--------------------일반화--------------------overfitting->
}
gs = GridSearchCV(pipeline,params,scoring=["accuracy", "roc_auc", "average_precision"], refit="accuracy",cv=4, n_jobs=-1)
#train
gs.fit(X_train,y_train)
gs.best_score_
gs.best_params_
result_df = pd.DataFrame(gs.cv_results_)
result_df.sort_values('rank_test_accuracy').head()