Python의 Scikit-Learn으로 SVM 및 커널 SVM 구현

Python의 Scikit-Learn으로 SVM 및 커널 SVM 구현

개요

이 가이드는 SVM(Support Vector Machines)에 대한 세 가이드 중 첫 번째 부분입니다. 이 시리즈에서는 위조 지폐 사용 사례에 대해 작업하고 단순 SVM에 대해 학습한 다음 SVM 하이퍼파라미터에 대해 학습하고 마지막으로 커널 트릭 다른 유형의 SVM을 탐색합니다.

모든 가이드를 읽거나 가장 관심 있는 가이드를 확인하려면 아래의 각 가이드에서 다루는 주제 표를 참조하세요.

1. Python의 Scikit-Learn으로 SVM 및 커널 SVM 구현

  • 사용 사례: 지폐를 잊어버림
  • SVM의 배경
  • 단순(선형) SVM 모델
    • 데이터세트 정보
    • 데이터세트 가져오기
    • 데이터 세트 탐색
  • Scikit-Learn으로 SVM 구현
    • 데이터를 훈련/테스트 세트로 나누기
    • 모델 훈련
    • 예측하기
    • 모델 평가
    • 결과 해석

2. SVM 하이퍼파라미터의 이해 (곧 출시됩니다!)

  • C 하이퍼파라미터
  • 감마 하이퍼파라미터

3. Python의 Scikit-Learn으로 다른 SVM 기능 구현 (곧 출시됩니다!)

  • SVM의 일반적인 아이디어(요약)
  • 커널(트릭) SVM
  • Scikit-Learn으로 비선형 커널 SVM 구현
  • 라이브러리 가져 오기
    • 데이터세트 가져오기
    • 데이터를 기능(X)과 대상(y)으로 나누기
    • 데이터를 훈련/테스트 세트로 나누기
    • 알고리즘 훈련
  • 다항식 커널
    • 예측하기
    • 알고리즘 평가
  • 가우스 커널
    • 예측 및 평가
  • 시그모이드 커널
    • 예측 및 평가
  • 비선형 커널 성능 비교

사용 사례: 위조 지폐

때때로 사람들은 지폐를 위조하는 방법을 찾습니다. 그 노트를 보고 그 유효성을 검증하는 사람이 있다면 그 노트에 속기 힘들지도 모른다.

하지만 각 음표를 볼 사람이 없으면 어떻게 될까요? 지폐가 위조인지 진짜인지 자동으로 알 수 있는 방법이 있나요?

이러한 질문에 대답하는 방법에는 여러 가지가 있습니다. 하나의 답은 받은 지폐를 각각 사진으로 찍어 위조지폐의 이미지와 비교한 뒤 진짜인지 위조인지 구분하는 것이다. 노트의 유효성 검사를 기다리는 것이 지루하거나 중요할 수 있다면 해당 비교를 신속하게 수행하는 것도 흥미로울 것입니다.

이미지가 사용되기 때문에 이미지를 압축하고 그레이스케일로 축소하고 측정값을 추출하거나 양자화할 수 있습니다. 이러한 방식으로 각 이미지의 픽셀 대신 이미지 측정값 간에 비교가 이루어집니다.

지금까지 지폐를 처리하고 비교하는 방법은 찾았는데 어떻게 진짜와 위조로 분류될까요? 기계 학습을 사용하여 해당 분류를 수행할 수 있습니다. 라는 분류 알고리즘이 있습니다. 벡터 머신 지원, 주로 다음과 같은 축약형으로 알려져 있습니다. SVM..

SVM의 배경

SVM은 1968년 Vladmir Vapnik과 Alexey Chervonenkis에 의해 처음 소개되었습니다. 당시 그들의 알고리즘은 단 하나의 직선으로 분리할 수 있는 데이터의 분류 또는 선형으로 분리 가능한. 우리는 그 분리가 어떻게 보이는지 볼 수 있습니다:

Python의 Scikit-Learn PlatoBlockchain 데이터 인텔리전스를 사용하여 SVM 및 커널 SVM 구현. 수직 검색. 일체 포함.

위의 이미지에서 우리는 중간에 선이 있고 어떤 점은 왼쪽에 있고 다른 점은 그 선의 오른쪽에 있습니다. 두 점 그룹이 완벽하게 분리되어 있고 선 사이에 또는 선에 가까운 점이 없습니다. 비슷한 점과 그것을 나누는 선 사이에 마진이 있는 것 같은데, 그 마진을 마진이라고 합니다. 분리 여백. 분리 여백의 기능은 유사한 점과 이를 나누는 선 사이의 간격을 더 크게 만드는 것입니다. SVM은 일부 점을 사용하여 이를 수행하고 선의 여백에 대한 결정을 지원하기 위해 수직 벡터를 계산합니다. 그것들은 지지 벡터 알고리즘 이름의 일부입니다. 나중에 그들에 대해 더 많이 이해할 것입니다. 그리고 중간에 보이는 직선은 다음과 같은 방법으로 찾을 수 있습니다. 극대화 선과 점 사이의 공간 또는 분리 여백을 최대화하는 공간. 이러한 방법은 최적화 이론.

방금 본 예에서 각 개별 점이 유사한 점에 서로 가깝고 두 그룹이 서로 멀리 떨어져 있기 때문에 두 점 그룹을 쉽게 분리할 수 있습니다.

하지만 데이터를 하나의 직선으로 구분할 수 있는 방법이 없다면 어떻게 될까요? 어지럽게 어긋난 점이 있거나 곡선이 필요한 경우?

이 문제를 해결하기 위해 SVM은 나중에 1990년대에 개선되어 이상치 또는 XNUMX차원 이상이고 선형적으로 분리할 수 없는 더 복잡한 문제와 같이 중심 경향에서 멀리 떨어진 점이 있는 데이터도 분류할 수 있습니다. .

궁금한 점은 SVM이 때때로 정답의 90% 이상을 달성하거나 , 어려운 문제.

SVM은 학습이 무엇인지에 대한 통계적 설명을 기반으로 하기 때문에 다른 기계 학습 알고리즘과 비교할 때 고유한 방식으로 구현됩니다. 통계적 학습 이론.

이 기사에서는 서포트 벡터 머신 알고리즘이 무엇인지, 서포트 벡터 머신의 간단한 이론, Python의 Scikit-Learn 라이브러리에서의 구현에 대해 알아봅니다. 그런 다음 다음으로 알려진 또 다른 SVM 개념으로 이동합니다. 커널 SVM커널 트릭, 또한 Scikit-Learn의 도움으로 구현할 것입니다.

단순(선형) SVM 모델

데이터세트 정보

소개에 제공된 예에 따라 실제 및 위조 지폐 이미지의 측정값이 있는 데이터 세트를 사용합니다.

두 개의 음표를 볼 때 우리의 눈은 일반적으로 왼쪽에서 오른쪽으로 훑어보고 어디가 유사하거나 다른지 확인합니다. 녹색 점 앞에 오는 검은색 점이나 그림 위에 있는 반짝이는 표시를 찾습니다. 이것은 우리가 노트를 보는 순서가 있다는 것을 의미합니다. 녹색과 검은색 점이 있다는 것을 알지만 녹색 점이 검은색보다 먼저 오는 경우 또는 검은색이 녹색보다 먼저 오는 경우 음표를 구별하기가 더 어려울 것입니다.

방금 설명한 것과 유사한 방법이 지폐 이미지에 적용될 수 있습니다. 일반적으로 이 방법은 이미지의 픽셀을 신호로 변환한 다음 신호를 작은 파동으로 변환하여 이미지에서 각각 다른 신호가 발생하는 순서를 고려합니다. 웨이블릿. 웨이블릿을 얻은 후 어떤 신호가 다른 신호보다 먼저 발생하는 순서를 알 수 있는 방법이 있습니다. 시간, 그러나 정확히 어떤 신호인지는 아닙니다. 이를 알기 위해서는 이미지의 주파수를 얻어야 합니다. 그들은 각 신호의 분해를 수행하는 방법으로 얻습니다. 푸리에 방법.

웨이블릿을 통해 시간 차원을 구하고 Fourier 방법을 통해 주파수 차원을 구한 후 시간과 주파수를 중첩하여 두 값이 일치하는지 확인합니다. 회선 분석. 컨볼루션은 웨이블릿을 이미지의 주파수와 일치시키는 핏을 얻고 어떤 주파수가 더 두드러지는지 알아냅니다.

웨이블릿과 주파수를 찾은 다음 두 가지를 모두 맞추는 이 방법을 호출합니다. 웨이블릿 변환. 웨이블릿 변환에는 계수가 있으며 이러한 계수는 데이터 세트에 있는 측정값을 얻는 데 사용되었습니다.

데이터세트 가져오기

이 섹션에서 사용할 지폐 데이터 세트는 분류 섹션에서 사용된 것과 동일합니다. 의사 결정 트리 튜토리얼.

참고 : 데이터 세트를 다운로드할 수 있습니다. 여기에서 지금 확인해 보세요..

데이터를 pandas로 가져오겠습니다. dataframe 구조를 살펴보고 처음 XNUMX개 행을 head() 방법.

데이터가 txt (텍스트) 파일 형식이며 쉼표로 구분되며 헤더가 없습니다. 우리는 이것을 다음과 같이 읽어 테이블로 재구성할 수 있습니다. csv, 지정 separator 쉼표로 표시하고 열 이름을 names 논의.

이 세 단계를 한 번에 수행한 다음 데이터의 처음 XNUMX개 행을 살펴보겠습니다.

import pandas as pd data_link = "https://archive.ics.uci.edu/ml/machine-learning-databases/00267/data_banknote_authentication.txt"
col_names = ["variance", "skewness", "curtosis", "entropy", "class"] bankdata = pd.read_csv(data_link, names=col_names, sep=",", header=None)
bankdata.head()

결과 :

	variance skewness curtosis entropy class
0 3.62160 8.6661 -2.8073 -0.44699 0
1 4.54590 8.1674 -2.4586 -1.46210 0
2 3.86600 -2.6383 1.9242 0.10645 0
3 3.45660 9.5228 -4.0112 -3.59440 0
4 0.32924 -4.4552 4.5718 -0.98880 0

참고 : 데이터를 로컬에 저장하고 대체할 수도 있습니다. data_link for data_path, 로컬 파일의 경로를 전달합니다.

데이터 세트에 XNUMX개의 열이 있음을 알 수 있습니다. variance, skewness, curtosis, entropyclass. 3.62160개의 행에서 처음 8.6661개의 열은 2.8073, XNUMX, -XNUMX 또는 끊임없는 값, 그리고 마지막 class 열에는 처음 0개의 행이 XNUMX으로 채워져 있거나 이산 값.

우리의 목표는 은행 지폐의 진위 여부를 예측하는 것이므로 지폐의 네 가지 속성을 기반으로 이를 수행할 수 있습니다.

  • variance 웨이블릿 변환 이미지. 일반적으로 분산은 데이터 포인트가 데이터의 평균값에 얼마나 가깝거나 먼지를 측정하는 연속 값입니다. 포인트가 데이터의 평균값에 가까우면 분포가 정규 분포에 가깝습니다. 이는 일반적으로 해당 값이 더 잘 분포되어 있고 예측하기가 다소 쉽다는 것을 의미합니다. 현재 이미지 컨텍스트에서 이것은 웨이블릿 변환으로 인한 계수의 분산입니다. 분산이 적을수록 계수가 실제 이미지를 변환하는 데 더 가깝습니다.

  • skewness 웨이블릿 변환 이미지. 왜도는 분포의 비대칭성을 나타내는 연속 값입니다. 평균 왼쪽에 더 많은 값이 있으면 분포는 다음과 같습니다. 부정적으로 왜곡, 평균 오른쪽에 더 많은 값이 있으면 분포는 긍정적으로 치우친이고 평균, 최빈값 및 중앙값이 같으면 분포는 다음과 같습니다. 대칭적인. 분포가 대칭적일수록 정규 분포에 가까워지고 값이 더 잘 분포됩니다. 현재 맥락에서 이것은 웨이블릿 변환으로 인한 계수의 왜도입니다. 대칭이 클수록 계수가 더 가까워집니다.variance, skewness, curtosis, entropy실제 이미지를 다시 번역합니다.

Python의 Scikit-Learn PlatoBlockchain 데이터 인텔리전스를 사용하여 SVM 및 커널 SVM 구현. 수직 검색. 일체 포함.

  • curtosis (또는 첨도) Wavelet 변환 이미지. 첨도는 왜도와 마찬가지로 분포의 모양을 설명하는 연속 값입니다. 첨도 계수(k)에 따라 분포는 정규 분포와 비교할 때 다소 편평하거나 사지 또는 꼬리에 데이터가 더 많거나 적을 수 있습니다. 분포가 더 넓게 퍼지고 평평해지면 플라티쿠르트; 덜 퍼지고 중앙에 더 집중될 때, 메소쿠르트; 분포가 거의 완전히 중앙에 집중되어 있을 때 렙토쿠르트. 이는 분산 및 왜도 이전 사례와 동일한 경우이며 분포가 중배엽적일수록 계수가 실제 이미지를 변환하는 데 더 가깝습니다.

Python의 Scikit-Learn PlatoBlockchain 데이터 인텔리전스를 사용하여 SVM 및 커널 SVM 구현. 수직 검색. 일체 포함.

  • entropy 이미지의. 엔트로피는 또한 연속적인 값이며 일반적으로 시스템의 무작위성 또는 무질서를 측정합니다. 이미지의 맥락에서 엔트로피는 픽셀과 인접 픽셀 간의 차이를 측정합니다. 우리의 맥락에서 계수의 엔트로피가 많을수록 이미지를 변환할 때 더 많은 손실이 있었고 엔트로피가 작을수록 정보 손실이 적습니다.

Python의 Scikit-Learn PlatoBlockchain 데이터 인텔리전스를 사용하여 SVM 및 커널 SVM 구현. 수직 검색. 일체 포함.

다섯 번째 변수는 class 아마도 0과 1의 값을 갖는 변수는 지폐가 진짜인지 위조되었는지를 나타냅니다.

다섯 번째 열에 Pandas의 XNUMX과 XNUMX이 포함되어 있는지 확인할 수 있습니다. unique() 방법:

bankdata['class'].unique()

위의 메서드는 다음을 반환합니다.

array([0, 1]) 

위의 메서드는 0과 1 값을 가진 배열을 반환합니다. 즉, 클래스 행에 포함된 유일한 값은 XNUMX과 XNUMX입니다. 로 사용할 준비가 되었습니다. 목표 지도 학습에서.

  • class 이미지의. 이것은 정수 값으로 이미지가 위조된 경우 0, 실제 이미지인 경우 1입니다.

실제 이미지와 망각 이미지에 대한 주석이 있는 열이 있으므로 이는 우리의 학습 유형이 감독.

조언: 지폐 이미지와 SVM 사용에 대한 웨이블릿 변환의 추론에 대해 자세히 알아보려면 저자의 출판된 논문을 읽으십시오.

또한 다음을 통해 데이터의 행 수를 확인하여 얼마나 많은 레코드 또는 이미지가 있는지 확인할 수 있습니다. shape 재산:

bankdata.shape

이 결과는 다음과 같습니다.

(1372, 5)

위의 줄은 변환된 지폐 이미지의 행이 1,372개이고 열이 5개임을 의미합니다. 이것이 우리가 분석할 데이터입니다.

데이터 세트를 가져오고 몇 가지 확인을 했습니다. 이제 데이터를 더 잘 이해하기 위해 데이터를 탐색할 수 있습니다.

데이터 세트 탐색

우리는 방금 클래스 열에 XNUMX과 XNUMX만 있다는 것을 보았지만, 그것들이 어떤 비율로 있는지도 알 수 있습니다. 즉, XNUMX보다 XNUMX이 더 많고, XNUMX보다 XNUMX이 더 많거나, XNUMX은 XNUMX의 수와 동일합니다. 균형이 잡힌.

비율을 알기 위해 데이터의 XNUMX과 XNUMX 값을 각각 계산할 수 있습니다. value_counts() 방법:

bankdata['class'].value_counts()

이 결과는 다음과 같습니다.

0 762
1 610
Name: class, dtype: int64

위의 결과에서 우리는 762개의 610과 152개의 5500, 즉 610보다 XNUMX개의 XNUMX이 더 많다는 것을 알 수 있습니다. 이것은 우리가 실제 이미지를 조금 더 위조했다는 것을 의미하며, 불일치가 더 클 경우(예: XNUMX개의 XNUMX과 XNUMX개의 XNUMX) 결과에 부정적인 영향을 미칠 수 있습니다. 모델에서 해당 예시를 사용하려고 하면 – 예시가 많을수록 일반적으로 모델이 위조 지폐와 실제 지폐 사이에서 결정해야 하는 정보가 더 많다는 것을 의미합니다. 실제 지폐 예시가 거의 없다면 모델은 그들을 인식하려고 할 때 실수.

우리는 이미 152개의 위조 지폐가 더 있다는 것을 알고 있지만 모델이 학습하기에 충분한 예라고 확신할 수 있습니까? 학습에 얼마나 많은 예제가 필요한지 아는 것은 대답하기 매우 어려운 질문입니다. 대신 클래스 간의 차이가 얼마나 되는지 백분율로 이해하려고 노력할 수 있습니다.

첫 번째 단계는 팬더를 사용하는 것입니다 value_counts() 메서드를 다시 사용하지만 이제 인수를 포함하여 백분율을 확인하겠습니다. normalize=True:

bankdata['class'].value_counts(normalize=True)

XNUMXD덴탈의 normalize=True 각 클래스에 대한 데이터의 백분율을 계산합니다. 지금까지 위조(0)와 실제 데이터(1)의 비율은 다음과 같습니다.

0 0.555394
1 0.444606
Name: class, dtype: float64

이는 데이터 세트의 약 (~) 56%가 위조되고 44%가 진짜임을 의미합니다. 이는 56%-44% 비율을 제공하며 이는 12% 차이와 동일합니다. 이는 통계적으로 작은 차이로 간주됩니다. 10%보다 약간 높기 때문에 데이터가 균형을 이룬 것으로 간주됩니다. 56:44 비율 대신 80:20 또는 70:30 비율이 있는 경우 데이터가 불균형한 것으로 간주되어 불균형 처리가 필요하지만 다행스럽게도 그렇지 않습니다.

또한 다음을 사용하여 Pandas 주입 히스토그램으로 클래스 또는 대상의 분포를 살펴봄으로써 이 차이를 시각적으로 확인할 수 있습니다.

bankdata['class'].plot.hist();

이는 데이터 프레임 구조를 직접 사용하여 히스토그램을 플로팅합니다. matplotlib 배후에 있는 도서관.

Python의 Scikit-Learn PlatoBlockchain 데이터 인텔리전스를 사용하여 SVM 및 커널 SVM 구현. 수직 검색. 일체 포함.

히스토그램을 보면 대상 값이 0 또는 1이고 데이터가 균형을 이룬다는 것을 확인할 수 있습니다.

이것은 우리가 예측하려고 했던 열에 대한 분석이었지만 데이터의 다른 열을 분석하는 것은 어떻습니까?

우리는 통계 측정을 볼 수 있습니다 describe() 데이터프레임 방식. 우리는 또한 사용할 수 있습니다 .T of transpose – 열과 행을 반전하여 여러 값을 더 직접적으로 비교합니다.

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!

bankdata.describe().T

결과 :

 count mean std min 25% 50% 75% max
variance 1372.0 0.433735 2.842763 -7.0421 -1.773000 0.49618 2.821475 6.8248
skewness 1372.0 1.922353 5.869047 -13.7731 -1.708200 2.31965 6.814625 12.9516
curtosis 1372.0 1.397627 4.310030 -5.2861 -1.574975 0.61663 3.179250 17.9274
entropy 1372.0 -1.191657 2.101013 -8.5482 -2.413450 -0.58665 0.394810 2.4495
class 1372.0 0.444606 0.497103 0.0000 0.000000 0.00000 1.000000 1.0000

왜도 및 첨도 열에는 표준 편차 값에서 멀리 떨어진 평균 값이 있습니다. 이는 데이터의 중심 경향에서 더 멀리 떨어져 있거나 변동성이 더 큰 값을 나타냅니다.

for 루프 내부에 각 기능의 히스토그램을 표시하여 각 기능의 분포를 시각적으로 살펴볼 수도 있습니다. 분포를 보는 것 외에도 각 기능과 관련하여 각 클래스의 포인트가 어떻게 분리되어 있는지 살펴보는 것도 흥미로울 것입니다. 이를 위해 우리는 그들 사이의 기능 조합을 만드는 산점도를 그릴 수 있고 클래스와 관련하여 각 포인트에 다른 색상을 할당할 수 있습니다.

각 기능의 분포부터 시작하여 다음을 제외한 각 데이터 열의 히스토그램을 플로팅합니다. class 기둥. 그만큼 class 열은 bankdata 열 배열의 위치에 따라 고려되지 않습니다. 마지막 열을 제외한 모든 열이 선택됩니다. columns[:-1]:

import matplotlib.pyplot as plt for col in bankdata.columns[:-1]: plt.title(col) bankdata[col].plot.hist() plt.show();

위의 코드를 실행하면 둘 다 skewnessentropy 데이터 분포가 부정적으로 왜곡되고 curtosis 긍정적으로 왜곡되어 있습니다. 모든 분포는 대칭이며, variance 정규분포에 가까운 유일한 분포이다.

이제 두 번째 부분으로 이동하여 각 변수의 산점도를 그릴 수 있습니다. 이를 위해 클래스를 제외한 모든 열을 선택할 수도 있습니다. columns[:-1], Seaborn의 사용 scatterplot() 각 기능에 대한 페어링의 변형을 얻기 위한 두 개의 for 루프. 첫 번째 기능이 두 번째 기능과 동일한지 테스트하여 기능 자체와의 페어링을 제외할 수도 있습니다. if statement.

import seaborn as sns for feature_1 in bankdata.columns[:-1]: for feature_2 in bankdata.columns[:-1]: if feature_1 != feature_2: print(feature_1, feature_2) sns.scatterplot(x=feature_1, y=feature_2, data=bankdata, hue='class') plt.show();

모든 그래프에는 서로 명확하게 구분되지 않은 실제 데이터 포인트와 위조 데이터 포인트가 모두 있습니다. 이는 일종의 클래스 중첩이 있음을 의미합니다. SVM 모델은 선을 사용하여 클래스를 구분하므로 그래프의 그룹 중 하나를 선만 사용하여 구분할 수 있습니까? 그럴 것 같지 않습니다. 이것이 대부분의 실제 데이터의 모습입니다. 우리가 분리에 도달할 수 있는 가장 가까운 것은 다음의 조합입니다. skewnessvarianceentropyvariance 플롯. 이것은 아마도 variance 정규에 가까운 분포 형태를 갖는 데이터.

그러나 모든 그래프를 순서대로 보는 것은 조금 어려울 수 있습니다. 우리는 Seaborn의 pairplot().

우리가 수행한 이전 for 루프는 모두 다음 줄로 대체될 수 있습니다.

sns.pairplot(bankdata, hue='class');

페어플롯을 보면 실제로는 curtosisvariance 가장 쉬운 기능 조합이므로 다른 클래스를 줄로 구분할 수 있습니다. 선형으로 분리 가능한.

대부분의 데이터가 선형적으로 분리 가능하지 않은 경우 크기를 줄임으로써 전처리를 시도하고 값을 정규화하여 분포를 정규에 더 가깝게 만들 수 있습니다.

이 경우 추가 전처리 없이 데이터를 그대로 사용하고 나중에 한 단계 뒤로 돌아가서 데이터 전처리에 추가하고 결과를 비교할 수 있습니다.

조언: 데이터로 작업할 때 더 많은 데이터를 수집하는 대신 근사치를 만들기 때문에 일반적으로 정보를 변환할 때 정보가 손실됩니다. 가능한 경우 초기 데이터를 있는 그대로 먼저 사용하여 다른 전처리 기술을 시도하기 전에 기준선을 제공합니다. 이 경로를 따를 때 원시 데이터를 사용하는 초기 결과를 데이터에 전처리 기술을 사용하는 다른 결과와 비교할 수 있습니다.

참고 : 보통 통계학에서는 모형을 만들 때 자료의 종류(이산형, 연속형, 범주형, 수치형), 그 분포, 모형 가정에 따라 절차를 따르는 것이 일반적이다. 컴퓨터 과학(CS)에서는 시행착오, 새로운 반복을 위한 더 많은 공간이 있습니다. CS에서는 비교할 기준선이 있는 것이 일반적입니다. Scikit-learn에는 더미 모델(또는 더미 추정기) 구현이 있으며, 일부는 동전 던지기보다 낫지 않고 그냥 대답합니다. (또는 1) 시간의 50%. 결과를 비교할 때 더미 모델을 실제 모델의 기준선으로 사용하는 것이 흥미롭습니다. 실제 모델 결과가 무작위 추측보다 더 나을 것으로 예상됩니다. 그렇지 않으면 기계 학습 모델을 사용할 필요가 없습니다.

Scikit-Learn으로 SVM 구현

SVM 작동 방식에 대한 이론을 자세히 알아보기 전에 데이터를 사용하여 첫 번째 기본 모델을 구축할 수 있으며 Scikit-Learn의 서포트 벡터 분류기 or SVC 클래스입니다.

우리 모델은 웨이블릿 계수를 수신하고 클래스에 따라 분류하려고 시도합니다. 이 프로세스의 첫 번째 단계는 계수 또는 풍모 수업에서 또는 목표. 그 단계 후, 두 번째 단계는 데이터를 모델의 학습에 사용될 세트로 더 나누는 것입니다. 기차 세트 모델의 평가 또는 테스트 세트.

참고 : 학습, 평가 및 테스트 세트 간에 데이터를 분할할 수도 있기 때문에 테스트 및 평가의 명명법은 약간 혼란스러울 수 있습니다. 이러한 방식으로 두 개의 세트를 보유하는 대신 중간 세트를 사용하여 모델의 성능이 향상되는지 확인하게 됩니다. 이것은 모델이 훈련 세트로 훈련되고 평가 세트로 향상되며 테스트 세트로 최종 메트릭을 얻는다는 것을 의미합니다.

어떤 사람들은 평가가 중간 집합이라고 말하고 다른 사람들은 테스트 집합이 중간 집합이고 평가 집합이 최종 집합이라고 말할 것입니다. 이것은 모델이 어떤 식으로든 동일한 예를 보지 않도록 보장하는 또 다른 방법입니다. 데이터 유출 발생하지 않으며 마지막으로 설정된 메트릭의 개선으로 모델 일반화가 있습니다. 이 접근 방식을 따르고 싶다면 이 문서에 설명된 대로 데이터를 한 번 더 나눌 수 있습니다. Scikit-Learn의 train_test_split() – 교육, 테스트 및 검증 세트 안내서.

데이터를 훈련/테스트 세트로 나누기

이전 세션에서는 데이터를 이해하고 탐색했습니다. 이제 데이터를 두 개의 배열로 나눌 수 있습니다. 하나는 네 가지 기능용이고 다른 하나는 다섯 번째 또는 대상 기능용입니다. 웨이블릿 계수에 따라 클래스를 예측하고 싶기 때문에 y 될 것입니다 class 칼럼과 우리 X ~ 할 것이다 variance, skewness, curtosisentropy 열.

대상과 기능을 분리하기 위해 우리는 class 열에 y, 나중에 데이터 프레임에서 삭제하여 나머지 열을 X.drop() 방법:

y = bankdata['class']
X = bankdata.drop('class', axis=1) 

데이터가 속성과 레이블로 나뉘면 학습 및 테스트 세트로 더 나눌 수 있습니다. 손으로 해도 되지만, model_selection Scikit-Learn 라이브러리에는 train_test_split() 데이터를 무작위로 기차 세트와 테스트 세트로 나눌 수 있는 방법입니다.

이를 사용하려면 라이브러리를 가져오고 다음을 호출할 수 있습니다. train_test_split() 방법, 전달 Xy 데이터를 정의하고 test_size 인수로 전달합니다. 이 경우 다음과 같이 정의합니다. 0.20– 이것은 데이터의 20%가 테스트에 사용되고 나머지 80%는 학습에 사용됨을 의미합니다.

이 방법은 우리가 정의한 비율에 따라 무작위로 샘플을 가져오지만 샘플링이 관계를 완전히 섞지 않도록 Xy 쌍을 고려합니다.

샘플링 프로세스는 본질적으로 무작위이기 때문에 메서드를 실행할 때 항상 다른 결과가 나타납니다. 동일한 결과 또는 재현 가능한 결과를 얻기 위해 값이 42인 SEED라는 상수를 정의할 수 있습니다.

이를 위해 다음 스크립트를 실행할 수 있습니다.

from sklearn.model_selection import train_test_split SEED = 42 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = SEED)

있음을 주목하라 train_test_split() 메소드는 이미 X_train, X_test, y_train, y_test 이 순서로 설정합니다. 의 첫 번째(0) 요소를 가져옴으로써 훈련용과 테스트용으로 분리된 샘플 수를 인쇄할 수 있습니다. shape 속성 반환 튜플:

xtrain_samples = X_train.shape[0]
xtest_samples = X_test.shape[0] print(f'There are {xtrain_samples} samples for training and {xtest_samples} samples for testing.')

이는 교육용 샘플이 1097개이고 테스트용 샘플이 275개임을 보여줍니다.

모델 훈련

데이터를 훈련 세트와 테스트 세트로 나누었습니다. 이제 기차 데이터에서 SVM 모델을 만들고 훈련할 시간입니다. 이를 위해 Scikit-Learn의 svm 도서관과 함께 서포트 벡터 분류기 수업, 또는 SVC 클래스입니다.

클래스를 가져온 후 클래스의 인스턴스를 만들 수 있습니다. 간단한 SVM 모델을 만들고 있기 때문에 데이터를 선형으로 분리하려고 하므로 데이터를 분할하는 선을 그릴 수 있습니다. 선형 함수 – 정의함으로써 kernel='linear' 분류자에 대한 인수로:

from sklearn.svm import SVC
svc = SVC(kernel='linear')

이렇게 하면 분류기가 데이터를 분리하는 선형 함수를 찾으려고 합니다. 모델을 만든 후 학습시키거나 맞게 기차 데이터와 함께 fit() 방법 및 제공 X_train 기능 및 y_train target을 인수로 사용합니다.

모델을 교육하기 위해 다음 코드를 실행할 수 있습니다.

svc.fit(X_train, y_train)

그렇게 모델이 훈련됩니다. 지금까지 데이터를 이해하고 분할하여 간단한 SVM 모델을 만들고 모델을 훈련 데이터에 피팅했습니다.

다음 단계는 적합도가 데이터를 얼마나 잘 설명하는지 이해하는 것입니다. 즉, 선형 SVM이 적절한 선택인지 답하는 것입니다.

예측하기

모델이 데이터를 설명할 수 있는지 대답하는 방법은 일부 분류를 계산하고 살펴보는 것입니다. 통계.

학습이 감독된다는 점을 고려하면 다음과 같이 예측할 수 있습니다. X_test 이러한 예측 결과를 비교합니다. y_pred – 실제와 함께 y_test지상 진실.

일부 데이터를 예측하기 위해 모델의 predict() 방법을 채용할 수 있습니다. 이 메서드는 테스트 기능을 수신하고, X_test, 인수로 각각에 대해 0 또는 1의 예측을 반환합니다. X_test의 행.

를 예측한 후 X_test 데이터, 결과는 y_pred 변하기 쉬운. 따라서 간단한 선형 SVM 모델로 예측된 ​​각 클래스는 이제 y_pred 변하기 쉬운.

다음은 예측 코드입니다.

y_pred = svc.predict(X_test)

예측이 있다고 생각하면 이제 실제 결과와 비교할 수 있습니다.

모델 평가

예측과 실제 결과를 비교하는 방법에는 여러 가지가 있으며 분류의 다양한 측면을 측정합니다. 가장 많이 사용되는 분류 메트릭은 다음과 같습니다.

  1. 혼란 매트릭스: 우리가 얼마나 많은 샘플을 옳고 그른지 알아야 할 때 각 수업. 정확하고 정확하게 예측된 값을 호출합니다. 진정한 긍정, 양성으로 예측되었지만 양성이 아닌 것을 호출합니다. 가양 성. 의 동일한 명칭 진정한 부정거짓 부정 음수 값에 사용됩니다.

  2. Precision: 우리의 목표가 분류기에 의해 올바른 것으로 간주된 올바른 예측 값을 이해하는 것일 때. 정밀도는 이러한 참양성 값을 양성으로 예측된 ​​샘플로 나눕니다.

$$
정밀도 = frac{text{참 긍정}}{text{참 긍정} + text{거짓 긍정}}
$$

  1. 소환: 일반적으로 정확도와 함께 계산되어 분류기에 의해 얼마나 많은 진양성이 식별되었는지 이해합니다. 재현율은 참 양성을 양성으로 예측되어야 하는 항목으로 나누어 계산합니다.

$$
회상 = frac{text{참 긍정}}{text{참 긍정} + text{거짓 부정}}
$$

  1. F1 점수: 균형 또는 고조파 평균 정확도와 재현율. 가장 낮은 값은 0이고 가장 높은 값은 1입니다. f1-score 1과 같으면 모든 클래스가 올바르게 예측되었음을 의미합니다. 이는 실제 데이터로 얻기가 매우 어려운 점수입니다(예외는 거의 항상 존재함).

$$
텍스트{f1-점수} = 2* frac{텍스트{정밀도} * 텍스트{리콜}}{텍스트{정밀도} + 텍스트{리콜}}
$$

우리는 이미 혼동 행렬, 정밀도, 재현율 및 F1 점수 측정에 대해 잘 알고 있습니다. 이를 계산하기 위해 Scikit-Learn의 metrics 도서관. 이 라이브러리에는 classification_reportconfusion_matrix 방법, 분류 보고서 방법은 정밀도, 재현율 및 f1 점수를 반환합니다. 둘 다 classification_reportconfusion_matrix 모든 중요한 메트릭의 값을 찾는 데 쉽게 사용할 수 있습니다.

메트릭을 계산하기 위해 메서드를 가져오고 호출하고 예측된 분류를 인수로 전달합니다. y_test및 분류 레이블 또는 y_true.

혼란 행렬을 더 잘 시각화하기 위해 Seaborn의 heatmap 수량 주석과 함께 분류 보고서의 경우 결과를 인쇄하여 결과 형식을 지정하는 것이 가장 좋습니다. 이것은 다음 코드입니다.

from sklearn.metrics import classification_report, confusion_matrix cm = confusion_matrix(y_test,y_pred)
sns.heatmap(cm, annot=True, fmt='d').set_title('Confusion matrix of linear SVM') print(classification_report(y_test,y_pred))

다음이 표시됩니다.

 precision recall f1-score support 0 0.99 0.99 0.99 148 1 0.98 0.98 0.98 127 accuracy 0.99 275 macro avg 0.99 0.99 0.99 275
weighted avg 0.99 0.99 0.99 275

Python의 Scikit-Learn PlatoBlockchain 데이터 인텔리전스를 사용하여 SVM 및 커널 SVM 구현. 수직 검색. 일체 포함.

분류 보고서에서 우리는 위조 지폐 또는 클래스 0.99에 대해 0.99의 정밀도, 1의 재현율 및 0.99의 f0 점수가 있음을 알고 있습니다. 이러한 측정은 지원 열에 표시된 대로 148개의 샘플을 사용하여 얻었습니다. 한편, 클래스 1 또는 실제 음표의 경우 결과는 한 단위 아래, 정밀도 0.98, 재현율 0.98, 동일한 f1 점수였습니다. 이번에는 이러한 결과를 얻기 위해 127개의 이미지 측정이 사용되었습니다.

혼동 행렬을 보면 148개의 클래스 0 샘플에서 146개가 올바르게 분류되었고 2개의 위양성이 있는 반면 127개의 클래스 1 샘플에 대해 2개의 위음성과 125개의 참 양성이 있음을 알 수 있습니다.

우리는 분류 보고서와 혼란 행렬을 읽을 수 있지만 그것들은 무엇을 의미합니까?

결과 해석

의미를 알아보기 위해 결합된 모든 메트릭을 살펴보겠습니다.

클래스 1에 대한 거의 모든 샘플이 올바르게 분류되었으며 실제 지폐를 식별할 때 모델에 2개의 실수가 있었습니다. 이는 0.98 또는 98% 재현율과 동일합니다. 클래스 0에 대해서도 비슷한 것을 말할 수 있습니다. 단 2개의 샘플만 잘못 분류된 반면 148개는 참 음성으로 전체 정확도는 99%입니다.

이러한 결과 외에도 다른 모든 결과는 0.99를 표시하고 있으며 이는 거의 1에 가까운 매우 높은 수치입니다. 대부분의 경우 이러한 높은 지표가 실제 데이터에서 발생하는 경우 이는 데이터에 대해 과도하게 조정된 모델을 나타내는 것일 수 있습니다. 과적합.

과적합이 있는 경우 모델은 이미 알려진 데이터를 예측할 때 잘 작동할 수 있지만 실제 시나리오에서 중요한 새 데이터로 일반화하는 기능을 잃게 됩니다.

과적합이 발생하는지 확인하기 위한 빠른 테스트는 기차 데이터를 사용하는 것이기도 합니다. 모델이 훈련 데이터를 어느 정도 기억했다면 메트릭은 1 또는 100%에 매우 가깝습니다. 기차 데이터가 테스트 데이터보다 크다는 것을 기억하십시오. 이러한 이유로 일부 과적합이 없는 한 비례적으로, 더 많은 샘플, 더 많은 실수 가능성을 보도록 노력하십시오.

기차 데이터로 예측하기 위해 테스트 데이터에 대해 수행한 작업을 반복할 수 있지만 이제 X_train:

y_pred_train = svc.predict(X_train) cm_train = confusion_matrix(y_train,y_pred_train)
sns.heatmap(cm_train, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with train data') print(classification_report(y_train,y_pred_train))

이 결과는 다음과 같습니다.

 precision recall f1-score support 0 0.99 0.99 0.99 614 1 0.98 0.99 0.99 483 accuracy 0.99 1097 macro avg 0.99 0.99 0.99 1097
weighted avg 0.99 0.99 0.99 1097

Python의 Scikit-Learn PlatoBlockchain 데이터 인텔리전스를 사용하여 SVM 및 커널 SVM 구현. 수직 검색. 일체 포함.

99배 더 많은 데이터가 있을 때 훈련 지표가 4%이면 과적합이 있는 것처럼 보이는 것을 쉽게 볼 수 있습니다. 이 시나리오에서 무엇을 할 수 있습니까?

과대적합을 되돌리기 위해 더 많은 열차 관측을 추가하고 다음과 같이 데이터 세트의 다른 부분으로 교육 방법을 사용할 수 있습니다. 교차 검증, 모델을 생성할 때 교육 전에 이미 존재하는 기본 매개변수를 변경하거나 하이퍼 파라미터. 대부분의 경우 Scikit-learn은 일부 매개변수를 기본값으로 설정하며, 문서를 읽는 데 할애하는 시간이 많지 않은 경우 자동으로 발생할 수 있습니다.

이 가이드의 두 번째 부분(곧 온다!) 교차 유효성 검사를 구현하고 하이퍼파라미터 튜닝을 수행하는 방법을 확인합니다.

결론

이 기사에서는 간단한 선형 커널 SVM을 연구했습니다. 우리는 SVM 알고리즘에 대한 직감을 얻었고, 실제 데이터 세트를 사용하고, 데이터를 탐색했으며, 이 데이터를 Python의 Scikit-Learn 라이브러리로 구현하여 SVM과 함께 사용할 수 있는 방법을 확인했습니다.

계속 연습하려면 다음과 같은 장소에서 사용할 수 있는 다른 실제 데이터 세트를 시도할 수 있습니다. 카글, UCI, BigQuery 공개 데이터 세트, 대학 및 정부 웹사이트.

또한 SVM 모델 이면의 실제 수학을 탐구할 것을 제안합니다. SVM 알고리즘을 사용하기 위해 반드시 필요한 것은 아니지만 알고리즘이 결정 경계를 찾는 동안 배후에서 실제로 무슨 일이 일어나고 있는지 아는 것은 여전히 ​​매우 편리합니다.

타임 스탬프 :

더보기 스택카부스