12
10월패키지 불러오기 (import)
xlsx파일도 csv와 마찬가지로, pandas를 사용하여 불러옵니다.
pandas모듈을 사용하기 위하여 import합니다.
import pandas as pd
pd.read_csv를 사용해서 csv파일 읽기
pandas안에 있는 read_csv를 통해서 xslx파일을 읽을 수 있습니다.
만약 엑셀안에 sheet가 여러개 있다면, sheetname이라는 옵션을 통하여 특정 sheet를 불러올 수 있습니다.
이번에는 SVM을 통하여 wine의 퀄리티를 예측해보겠습니다.(참조 :https://archive.ics.uci.edu/ml/datasets/Wine+Quality )
변수에 대한 정보는 위 홈페이지를 참조하시면 됩니다.
간단하게 설명하자면, 이번 데이터에서는 quality가 예측하려는 y값입니다.
와인 데이터에서는 y값이 0부터 10까지 있습니다. 은행 데이터에서 2가지를 맞추는 것이 아니라 10가지를 맞추어야 합니다.
속성으로는 와인의 산도, 당도, 염화물 등 정보가 들어있습니다.
pd.read_excel('red_wine.xlsx',sheetname=0).head()
data = pd.read_excel('red_wine.xlsx')
iloc라는 기능을 통해 인덱스를 가지고 원하는 행, 열을 뽑아낼 수 있습니다.
data.iloc[원하는 행, 원하는 열]
전체를 뽑고싶다면, data.iloc[:,:] 이고, 1~3행, 1~5행을 뽑고 싶다면 data.iloc[1:3,1:5] 이고, 전체 행과 마지막 열을 뽑고 싶다면 data.iloc[:,-1]과 같이 사용할 수 있습니다.
우리가 사용하는 데이터셋 마지막 열을 y(label)이고 나머지는 x(attributes)입니다. 따라서 x에는 마지막 행을 제외한 모든 행을 사용하고, y에는 마지막 행만 사용합니다
x = data.iloc[:,:-1] y = data.iloc[:,-1] print('나누기 전 x의 길이 : '+ str(len(x))) print('나누기 전 y의 길이 : '+str(len(y)))
dummy화 시키기, label 인코딩 하기
이번 데이터에서는 속성중에서 더미변수로 만들어야 할 속성이 없습니다.
모두 숫자(연속형)으로 이루어져 있기 때문입니다.
train test 나누기
분석을 하기 앞서, 모델에 학습을 시킬 데이터와 모델의 성능을 검증할 데이터를 분리해야 합니다.
일반적으로 전체 데이터셋에서 70%를 학습으로, 30%를 검증으로 사용합니다.
이와 같이 train과 test를 나누기 위해 sklearn.model_selection을 import합니다.
import sklearn.model_selection x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(x,y,test_size = 0.3) print('나눈 후 x_train의 길이 : '+ str(len(x_train))) print('나눈 후 y_train의 길이 : '+ str(len(y_train))) print('나눈 후 x_test의 길이 : '+ str(len(x_test))) print('나눈 후 y_test의 길이 : '+ str(len(y_test)))
SVM(Support Vector Machine)
SVM(Support Vector Machine)은 2차원이 아닌 3차원 이상의 공간으로 확장하여 초평면을 통해 분류하는 방법입니다.
SVM은 복잡한 수식으로 이루어져있기 때문에 전공자가 아닌 이상 이해하기힘들며, SVM에 있는 커널함수의 종류도 아주 많기 때문에, 하나의 SVM을 이해했다고 하더라도, 수 많은 커널함수를 공부해야 하고, 새로운 커널함수가 쏟아져 나옵니다.
따라서 기초적인 RBF커널함수를 사용하는 SVM만 다루겠습니다.
2차원에서 선을 통한 분류로는 모든 경우에 대해 정확해게 분류를 할 수 없습니다.
하지만, 3차원으로 확장을 시키면 비교적 정확하게 분류할 수 있습니다.
RBF커널 함수를 통해 선형의 문제를 고차원에 대입하여 오른쪽 그림처럼 분류 할 수 있습니다.
RBF커널 함수를 사용하는 SVM에 주요 파라미터로 c값과 gamma가 있습니다.
c값는 cost라고 하는데, 얼마나 정확하게 분류할 것인가를 결정합니다.
그럼 c값이 무조건 높은 것이 좋은게 아닌가라고 생각할 수 있습니다.
하지만, 머신러닝에서는 과적합에 빠지면 안됩니다.
c값이 너무 높다면, training 데이터에만 적합한 모델이 만들어지고, 새로운 데이터가 들어온다면 제대로 예측을 할 수 없습니다. 이를 과적합이라고 합니다.
반대로, c값이 낮다면, 일반적인 경계를 찾기는 하지만 정확한 분류가 안될 수도 있습니다.
왼쪽은 c값이 낮을 때, 오른쪽은 c값이 높을때 입니다.
이제 RBF커널이 나옵니다.
2차원 선형 분류를 커널함수를 통해 차원을 확장하여 정확한 분류를 해내면서 SVM은 성정해 왔습니다.
RBF커널에서 커널함수는 언덕과 같이 생겼습니다.
이 언덕과 같이 생긴 커널함수를 만나 2차원 문제를 고차원에 대입하여 정확하게 분류를 해내는 것입니다.
gamma는 이 언덕의 기울기 입니다.
gamma 값이 클수록 완만한 언덕이 되고, gamma값이 작을수록 경사가 큰 언덕이 됩니다..
따라서, c값은 얼마나 정확하게 구분을 할 것인지, gamma값은 커널 함수의 곡률을 결정하는 파라미터라고 보면 되겠습니다.
또한, RBF커널함수를 사용하는 SVM에서는 이 c와 gamma값을 조정해나가면서 최적의 모델을 찾는 것이 중요하겠습니다.
와인 데이터 분석
import sklearn.svm clf = sklearn.svm.SVC(C=10, kernel='rbf', gamma=10) #c와 gamma값을 조정하면서 정확도를 높여보세요 clf.fit(X=x_train,y=y_train)
y_predict = clf.predict(x_test) #y_predict 값에 x_test를 통해 예측한 값이 할당됩니다.
모델의 검증
우리는 test데이터중에서 x_test로 모델을 통해 예측한 y_predict값과 실제값인 y_test을 가지고 있습니다.
y_test중에서 y_predict가 얼마나 잘 맞췄는지 본다면 이 모델의 정확도를 알 수 있을 것입니다.
import sklearn.metrics sklearn.metrics.accuracy_score(y_test, y_predict)#accuracy_score을 통해 단순히 몇개를 맞추었는지 알 수 있습니다.
print(sklearn.metrics.classification_report(y_test, y_predict)) #classification_report를 통해 precision, recall fsocre를 알 수 있습니다.
Leave A Comment