<aside> 🧑🏫 Support vector machine을 이용한 Iris dataset classification
</aside>
코드에 대한 분석을 주석으로 기입했다.
#sklearn에서 제공하는 irisdataset을 가져 올 수 있는 함수
iris_data = load_iris()
#iris_data를 print해봄으로써 정확히 어떤 데이터 셋인지 확인 가능, 직접 데이터 확인
print(iris_data)
#iris_data에 대한 설명을 확인 (평균, max, min , correlation 등등)
print(iris_data.DESCR)
#iris_data에 딕셔너리 형태로 데이터가 저장되어 있는데 iris_data["data"]로도 확인 가능
##실제 iris_data의 feature 값들 확인
print(iris_data.data)
##실제 iris_data의 feature의 이름 확인
print(iris_data.feature_names)
##실제 iris_data의 target 값들을 확인
print(iris_data.target)
##실제 iris_data의 target 값들의 이름 확인
print(iris_data.target_names)


#pandas라는 라이브러리를 이용해서 x값으로는 iris_data의 data를 넣고,
#column의 이름 에는 각 feature들의 이름을 넣었다.
df = pd.DataFrame(data=iris_data.data, columns=iris_data.feature_names)
#target이라는 column에는 iris_data의 target 값들을 저장한다.
df['target'] = iris_data.target
#기존에 target 값들은 label로 0,1,2로 구성되어있는데 이는 각각각(setosa, versicolor, virginica)
#와 같은 꽃이름을 지칭하는 것이기 때문에 label을 이름으로 바꿔준다!
df['target'] = df['target'].map({0:"setosa", 1:"versicolor", 2:"virginica"})
print(df)
#df의 마지막에 있는 column은 target이므로 y 값이고 그 뒤에 있는 column은 다 feature값이므로
#x 값이다. 이에 맞춰 데이터를 구성한다.
x_data = df.iloc[:, :-1]
y_data = df.iloc[:, [-1]]
#pairplot을 그려 각각의 target당 특정 feature에 대해 어떤 분포를 이루는지 확인해본다.
sns.pairplot(df, hue="target", height=3)
plt.show()


#다양한 모델을 사용할것이기 때문에 model list를 만들어 다양한 model을 집어넣을 것이다.
models = []
#SVM을 regulariztion을 가할 수 있도록 parameter C를 서언한다
C = 1.0
#SVM에 linear kernel 을 하용하는 model
models.append(("SVC with linear kernel", svm.SVC(kernel = 'linear', C=C)))
#linear SVM에 linear kernel을 사용하는 model
models.append(("Linear SVC with linear kernel", svm.LinearSVC(C=C, max_iter=10000)))
#SVM에 RBF kernel 을 ,사용하는 model
models.append(("SVC with RBF kernel", svm.SVC(kernel = 'rbf', gamma=0.7, C=C)))
#SVM에 polynomial kernel 을 ,사용하는 model
models.append(("SVC with polynomial kernel", svm.SVC(kernel = 'poly', degree=3, gamma='auto', C=C)))
#결과를 저장하는 list
results = []
#모델의 이름
names = []
for name, model in models:
model.fit(x_data, y_data.values.ravel())
y_pred = model.predict(x_data)
print(name, "'s Accuracy is ", accuracy_score(y_data, y_pred))

#test_test_split을 하는 sklearn function을 사용
from sklearn.model_selection import train_test_split
#i/10는 test set의 ratio
#1-i/10은 train set의 ratio
# 7:3 , 6:4, 5:5, 4:6, 3:7의 결과를 분석해봄
for i in range(3,8):
print("--------------train : test = {} : {}---------------".format(1-i/10,i/10))
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=i/10, random_state=42)
for name, model in models:
#train 값들만 이용하여 모델 학습
model.fit(x_train, y_train.values.ravel())
#train 값들의 accuracy 계산
y_pred_train = model.predict(x_train)
print(name, "'s train Accuracy is ", accuracy_score(y_train, y_pred_train))
#test 값들의 accuracy 계산
y_pred_test = model.predict(x_test)
print(name, "'s test Accuracy is ", accuracy_score(y_test, y_pred_test))