-
7주차 과제 : SVM
- 사용 언어 : python
- 해결 날짜 : 2021-11-07
-
코드 설명 :
- Mnist data를 Sklearn 라이브러리를 이용하여 가져오고, 이 값은 총 7만개지만 train 데이터와 test 데이터가 섞여 있으므로 train_test_split을 사용하여 6:1로 나누어 주었다.
- 처음에 스케일링을 하지 않고 c값만 변화시켜 정확도를 측정했더니 최대치가 0.85로 매우 낮았다. 성능을 높이기 위하여, 데이터 스케일링이 필요하다고 생각되어 QuantileTransformer 스케일러를 사용하여 데이터를 균등분포 시켰다.
- 그 다음 최대 성능을 내는 C값을 찾기 위해 반복문을 사용하여 우선 0부터 10까지 1씩 늘려가며 (단 C는 양수여야 하기 때문에 0일 때는 0.1로 하였다.) 최적의 C값을 찾았고, 가장 클 때는 0.1이었다. 그 다음 최대일 때는 2로 그 차이가 미미하다고 생각되었기 때문에 C값을 0.1부터 2.9까지 0.1씩 늘려가며 다시 최적의 C값을 찾았다.
- 이 때 훈련 및 성능 측정 모델로 SVC가 아닌 LinearSVC를 사용했는데, SVC를 사용하려니 몇시간 동안 훈련이 되지 않아 진행이 되지 않아서 어쩔 수 없이 LinearSVC를 사용했다.
- 최적의 C값인 1.7로 성능을 측정한 결과 0.882의 정확도를 얻을 수 있었다. 아마 LInearSVC가 아닌 그냥 SVC를 사용했다면 더 높은 결과를 얻었을 수도 있을 것 같다.
-
결과 :
-
코드
from sklearn.datasets import fetch_openml from sklearn.model_selection import train_test_split mnist = fetch_openml('mnist_784') train_input, test_input, train_target, test_target = train_test_split(mnist['data'], mnist['target'], test_size=(1/7), random_state=0) print(train_input.shape) from sklearn.preprocessing import QuantileTransformer scaler = QuantileTransformer() scaler.fit(train_input) train_input_scaled = scaler.transform(train_input) test_input_scaled = scaler.transform(test_input) from sklearn.svm import LinearSVC c_max = 0.1 model = LinearSVC(C=c_max, random_state=0) model.fit(train_input_scaled, train_target) score_max = model.score(test_input_scaled, test_target) print(score_max) for i in range(1,11): model = LinearSVC(C=i, random_state=0) model.fit(train_input_scaled, train_target) temp_score = model.score(test_input_scaled, test_target) if score_max < temp_score: score_max = temp_score c_max = i print(temp_score) import numpy as np li = np.arange(0.1, 3, 0.1) for i in li: model = LinearSVC(C=i, random_state=0) model.fit(train_input_scaled, train_target) temp_score = model.score(test_input_scaled, test_target) if score_max < temp_score: score_max = temp_score c_max = i print("C값이 {c}일 때 Accuracy : {score}".format(c=round(c_max,1), score=score_max))