빅데이터/머신 러닝 with Python (old)

사이킷 런의 svm.SVC 사용 및 흉내내어 만들어보기 [ML with pYTHON]

언제나휴일 2020. 5. 20. 08:26
반응형

 

사이킷 런의 svm.SVC 사용 및 흉내내어 만들어보기

안녕하세요. 
기계 학습을 시작할 때 많은 개발자들 사이킷 런(scikit-learn) 라이브러리를 사용하죠.
그리고 사이킷 런을 사용하는 출발점인 svm.SVC 객체의 fit 메서드와 predict 메서드를 사용합니다.

그런데 우리가 사용하는 svm.SVC 클래스 내부에서는 어떠한 일들을 할까요?

내부를 좀 더 이해하기 위해 비슷하게 동작하는 클래스를 만들어 보았습니다.
기계학습하는 알고리즘은 극악한 품질 수준을 갖습니다.
알고리즘을 기대하시는 분들은 Pass~

= 다루는 내용 =
사이킷 런의 svm.SVC 사용

흉내내기 - TinySVC 클래스 외형 정의
초기화 메서드 정의
가중치와 임계치 설정 메서드 정의
판별 메서드 정의
특정 가중치와 임계치 테스트 메서드 정의
기계 학습 메서드 정의
fit 메서드 정의
predict 메서드 정의

# http://ehpub.co.kr
# ML with pYTHON
# 사이킷 런의 svm.svc 내부 - 흉내내기
# svc 클래스, svc.fit 메서드, svc.predict 메서드
def myr(s,e,st): #range와 같은 목적, step이 실수
    r=s
    while(r<e):
        yield r
        r+=st

class TinySVC:    
    def __init__(self): #초기화
        self.datas,self.labels=[],[]
        self.w1,self.w2,self.b=0,0,0
    def __setwb(self,w1,w2,b): #가중치, 임계치 설정
        self.w1,self.w2,self.b = w1,w2,b    
    def __discriminate(self,x1,x2): #판별
        if(self.w1*x1+self.w2*x2+self.b<=0):
            return 0
        else:
            return 1
    def __test(self,wt1,wt2,bt): #특정 가중치, 임계치 테스트
        self.__setwb(wt1,wt2,bt)
        for r in range(len(self.labels)):
            if(self.__discriminate(self.datas[r][0],self.datas[r][1])!=self.labels[r]):
                return False
        return True
    def __findwb(self): #기계 학습 - 극악한 품질 수준
        for wt1 in myr(0,1,0.1):
            for wt2 in myr(0,1,0.1):
                for bt in myr(-1,1,0.1):
                    if(self.__test(wt1,wt2,bt)):
                        return True
        return False
    def fit(self,datas,labels):
        self.datas,self.labels = datas,labels
        self.__findwb()
    def predict(self,samples):
        result=[]
        for sample in samples:
            result.append(self.__discriminate(sample[0],sample[1]))
        return result

in_datas = [[0,0],[0,1],[1,0],[1,1]]
out_labs = [0,1,1,1]
examples = [[0,1],[1,0]] 
clf = TinySVC()
clf.fit(in_datas, out_labs) #퍼셉트론 구하기 - 가중치와 임계치를 구한다
results = clf.predict(examples) #결과 예측
print(results)

 

 

반응형