'분류 전체보기'에 해당되는 글 48건

  1. 2019.04.18 KoNLPy (코엔엘파이)
  2. 2019.04.05 Docker : Docker Compose 편
  3. 2019.04.04 JAVA를 이용해 세콤 출입기록 가져오기 (3)
  4. 2019.04.04 K-최근접 이웃법 (Nearest Neighbor)

자연어 처리에서 각 언어마다 모두 특징이 다르기 때문에 동일한 방법을 사용하기는 어려울 것이다. 한글에도 NLTK나 Spacy 같은 도구를 사용할 수 있으면 좋겠지만 언어 특성상 영어를 위한 도구를 사용하기에는 적합하지 않다. 하지만 많은 사람들의 노력으로 개발된 한글 자연어 처리를 돕는 훌륭한 도구를 사용할 수있다. 그중 한글 자연어 처리에 많이 사용하는 파이썬 라이브버리 KoNLPy에 대해 알아보겠다.

 

KoNLPy는 한글 자연어 처리를 쉽고 간결하게 처리할 수 있도록 만들어진 오픈소스 라이브러리다. 또한 국내에 이미 만들어져 사용되고 있는 여러 형태소 분석기를 사용할 수 있게 허용한다. 일반적인 어절 단위에 대한 토크나이징은 NLTK로 충분히 해결할 수 있으므로 형태소 단위에 대한 토크나이징에 대해 알아보도록 하겠다.

설치

리눅스 또는 macOS에서는 다음과 같이 pip를 이용해 간단하게 설치할 수 있다.

pip install konlpy #python2.x
pip3 install konlpy #python2.x

형태소 단위 토크나이징

한글 텍스트의 경우 형태소 단위 토크나이징이 필요할 떄가 있는데 KoNLPy에서는 여러 형태소 분석기를 제공하며, 각 형태소 분석기별로 분석한 결과는 다를 수 있다. 각 형태소 분석기는 클래스 형태로 되어 있고 이를 객체로 생성한 후 매서드를 호출해서 토크나이징할 수 있다.

형태소 분석 및 품사 태깅

형태소란 의미를 가지는 가장 작은 단위로서 더 쪼개지면 의미를 상실하는 것들을 말한다. 따라서 형태소 분석이란 의미를 가지는 단위를 기준으로 문장을 살펴보는 것을 의미한다. KoNLPy는 기존에 C, C++, Java 등의 언어를 통해 형태소 분석을 할 수 있는 좋은 라이브러리들을 파이썬 라이브러리로 통합해서 사용할 수 있록 하여 한국어 구문 분석을 쉽게 할 수 있도록 만들어진 라이브러리이다. KoNLPy에는 다양한 형태소 분석기들이 객체 형태로 포함돼 있으며 다음과 같은 각 형태소 분석기 목록이 있다.

  • Hannanum
  • Kkma
  • Komoran
  • Mecab
  • Okt(Twitter)

모두 동일한 형태소 분석기능을 제공하는데, 각기 성능이 조금씩 다르다고 하니 직접 비교해보고 자신의 데이터를 가장 잘 분석하는 분석기를 사용하는 것이 좋다. (단, Mecab는 윈도우에서 사용할 수 없다.)

여기에서는 Okt 예로 들어 설명 하도록 하겠다. Okt는 원래 이름이 Twitter였으나 0.5.0 버전 이후부터 이름이 Okt 바뀌었다.

import konlpy.tag import Okt okt = Okt() # 객체 생성

 

Okt 에서 제공되는 함수를 살펴보자.

  • okt.morphs() 텍스트를 형태소 단위로 나눈다. 옵션으로 norm과 stem이 있다. norm은 문장을 정규화. stem은 각 단어에서 어간을 추출.(기본값은 둘다 False)
  • okt.nouns() 텍스트에서 명사만 뽑아낸다.
  • okt.phrases() 텍스트에서 어절을 뽑아낸다.
  • okt.pos() 각 품사를 태깅하는 역할을 한다. 품사를 태깅한다는 것은 주어진 텍스트를 형태소 단위로 나누고, 나눠진 각 형태소를 그에 해당하는 품사와 함께 리스트화하는 것을 의미한다. 옵션으로 norm, stem, join이 있는데 join은 나눠진 형태소와 품사를 ‘형태소/품사’ 형태로 같이 붙여서 리스트화한다.

다음 문장을 직접 각 함수에 적용해서 살펴보자.

 

모바일 게임은 재밌다 열심히 해서 만랩을 찍어야지~ ㅎㅎㅎ

from konlpy.tag import Okt
okt = Okt()

text = "모바일 게임은 재밌다 열심히 해서 만랩을 찍어야지~ ㅎㅎㅎ"

print(okt.morphs(text))
print(okt.morphs(text, stem=True))

['모바일', '게임', '은', '재밌다', '열심히', '해서', '만', '랩', '을', '찍어야지', '~', 'ㅎㅎㅎ']

['모바일', '게임', '은', '재밌다', '열심히', '하다', '만', '랩', '을', '찍다', '~', 'ㅎㅎㅎ']

 

어간 추출을 한 경우 찍어야지의 어간인 찍다로 추출된 것을 볼 수 있다.

이제 명사와 어절을 추츨헤 보자

print(okt.nouns(text))
print(okt.phrases(text))

['모바일', '게임', '랩']

['모바일', '모바일 게임', '만랩', '게임']

 

nouns 함수를 사용한 경우에는 명사만 추출되었고 phrases 함수의 경우 어절 단위로 나뉘어서 추출 되었다.

품사 태깅을 하는 함수 pos를 사용해보자.

print(okt.pos(text))
print(okt.pos(text, join=True))

[('모바일', 'Noun'), ('게임', 'Noun'), ('은', 'Josa'), ('재밌다', 'Adjective'), ('열심히', 'Adverb'), ('해서', 'Verb'), ('만', 'Modifier'), ('랩', 'Noun'), ('을', 'Josa'), ('찍어야지', 'Verb'), ('~', 'Punctuation'), ('ㅎㅎㅎ', 'KoreanParticle')]

['모바일/Noun', '게임/Noun', '은/Josa', '재밌다/Adjective', '열심히/Adverb', '해서/Verb', '만/Modifier', '랩/Noun', '을/Josa', '찍어야지/Verb', '~/Punctuation', 'ㅎㅎㅎ/KoreanParticle']

 

join 옵션을 True로 설정 하면 형태소와 품사가 함께 나오는 것을 볼 수 있다. 경우에 따라 옵션을 설정하면서 사용하면 된다.

KoNLPy 데이터

KoNLPy 라이브러리는 한글 자연어 처리에 활용할 수 있는 한글 데이터를 포함하고 있어 라이브러리를 통해 데이터를 바로 사용할 수 있다.

  • kolaw 한국 법률 말뭉치. ‘constitution.txt’파일
  • kobill 대한민국 국회 의안 말뭉치. 각 id값을 가지는 의안으로 구성. 파일은 ‘1809890.txt’ 부터 ‘1809899.txt’까지로 구성.

라이브러리를 사용해 각 말뭉치를 불러오자.

from konlpy.corpus import kolaw
from konlpy.corpus import kobill

kolaw.open('constitution.txt').read()[:30]

'대한민국헌법\n\n유구한 역사와 전통에 빛나는 우리 대한국'

kobill.open('1809890.txt').read()[:30]

'지방공무원법 일부개정법률안\n\n(정의화의원 대표발의 )\n'

 

위 데이터들을 가지고 여러 가지 한글 자연어 처리 문제를 연습하는 데 활용할 수 있다.

마치며

KoNLPy 홈페이지에 가보면 나름의 철학을 가지고 프로젝트를 진행하는 듯한 글을 볼 수 있다.

KoNLPy는 같은 기능을 하는 또 하나의 도구를 만들려는 것이 아닙니다. 이 프로젝트에는 세 가지 철학이 있습니다.

  • 사용법이 간단해야 한다.
  • 누구나 쉽게 이용할 수 있어야 한다.
  • “인터넷 민주주의는 효과적이다.”

개인적으로 마음에 드는 글귀이다. 인터넷 민주주의를 위해 직접 참여도 가능하니 한국어 NLP에 관심이 많다면 아래 공식홈을 방문하여 살펴보길 바란다.

 

KoNLPy 공식홈 : https://konlpy-ko.readthedocs.io

Posted by @위너스

댓글을 달아 주세요

지난 도커파일 편에서 원하는 기능이 담긴 이미지를 손쉽게 만들 수 있는 도커파일의 작성방법과 이미지 생성, 컨테이너 생성 실습을 진행 했었다. 이번 Docker Compose(이하 도커 컴포즈) 편 에서는 도커 컴포즈의 개요와 YAML파일의 작성 및 실습을 진행 해보도록 하겠다.

 

 

Docker Compose 개요

 

웹서버 기능을 하는 어플리케이션이 있다고 가정 해보자 여기에는 DB와 Web Server가 필요하고 이것을 각각의 컨테이너로 나누었다. 제대로 동작 하는지 확인 해보기 위해서는 각 컨테이너들을 실행 시켜야 하는데 docker run 명령어를 이용하여 컨테이너를 생성하려면 두 번의 run 명령어 입력이 필요하다.

컨테이너를 가끔 생성하는 경우라면 괜찮겠지만 컨테이너의 생성빈도가 높고 실행 시켜야하는 컨테이너가 지금보다 더 늘어난다면 상당히 번거로운 작업이 된다. 이런 경우 여러개의 컨테이너를 한번에 실행 시키고 관리 할 수 있다면 효율적일 것이다. 도커 컴포즈는 위와 같이 여러 컨테이너를 한번에 관리 할 때 아주 유용하다. YAML(확장자 *.yml) 파일을 이용하여 어떠한 이미지를 사용하여 어떤 컨테이너를 어떻게 실행 시킬 것인지 기술해주면 도커는 해당 내용대로 컨테이너를 순차적으로 실행 시킨다.

 

 

Docker Compose YAML 파일 작성

 

먼저 한 어플리케이션의 구성요소인 MariaDB, Apache를 일반적으로 컨테이너화 할 경우 보통은 아래와 같이 run 명령어를 사용하여 이미지를 내려받고 컨테이너를 실행 시킬 것이다.

[root@localhost testuser]# docker run \
--name mdb \
-e MYSQL_ROOT_PASSWORD='1234' \
-d mariadb:latest
da6943f279767932259d28dfd6d0f92cb3c90499569c3907a6e08594e58b8b54

[root@localhost testuser]# docker run \
--name web \
-it \
-p 80:80 \
--link mdb:mdb docker_img
 * Restarting OpenBSD Secure Shell server sshd
 root@2ae7ab2da8df:/#

 

위 두개의 run 명령어를 YAML 파일로 작성해보자. (※주의 : 탭 인식 못하므로 스페이스 두칸으로 구분)

version: '3'
services:
  mdb:
    image: mariadb:latest
    environment:
      MYSQL_ROOT_PASSWORD: 1234
  web:
    build: ./dockerfile
    image: apache_df:web
    ports:
      - "80:80"
    links:
      - mdb:mdb

version : YAML파일 포멧의 버전을 의미하고 여기서는 3버전을 사용하였다.

services : 생성될 컨테이너의 정보를 담고 있다. services 바로 아래에 서비스명을 기술 할 수 있으며 위에 기술 된 mdb, web이 서비스명이 된다.

image : docker images 명령어를 실행하면 노출되는 repository명이다.

environment : docker run 명령어 옵션 -e와 같으며 위에 기술한 MYSQL_ROOT_PASSWORD와 같이 컨테이너 생성 시 들어갈 환경 변수를 지정 해줄 수 있다.

build : 지정된 경로 내에 존재하는 도커파일을 실행하여 이미지로 만들고 그 이미지로 컨테이너를 생성한다.

ports : docker run 명령어 옵션 -p와 같으며 해당 컨테이너 내에서 오픈 할 포트번호를 지정 할 수 있다.

links : docker run 명령어 옵션 --link와 같으며 연결할 서비스명을 입력하여 해당 서비스로 접근 할 수 있다.

 

 

Docker Compose 실행

YAML 파일 작성이 완료 되었으면 도커 컴포즈 파일을 docker-compose.yml이라는 이름으로 저장해준다. 필자는 /home/testuser/docom 경로에 저장하였다. 도커 컴포즈 실행 전 실습을 위해 이전에 만들었던 컨테이너들을 모두 지워주도록 하자.

# docker rm -f $(docker ps -a -q)
2ae7ab2da8df
da6943f27976
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

 

이어서 도커 컴포즈를 다운로드 받는다.

# sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   617    0   617    0     0     98      0 --:--:--  0:00:06 --:--:--   163
100 15.4M  100 15.4M    0     0   754k      0  0:00:20  0:00:20 --:--:-- 1840k
# sudo chmod +x /usr/local/bin/docker-compose
# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# docker-compose --version
docker-compose version 1.24.0, build 0aa59064

 

다운로드가 완료 되었으면 위에 작성한 YAML파일을 기반으로 도커 컴포즈를 실행 시켜보자.

Apache2는 미리 기술해둔 dockerfile을 통해 image를 생성하였다. 그리고 해당 이미지를 통해 docom_web_1 이라는 컨테이너를 생성한 것을 확인하였다.

# pwd
/home/testuser/docom
# docker-compose up -d
Creating network "docom_default" with the default driver
Building web
Step 1/6 : FROM ubuntu:14.04
 ---> 5dbc3f318ea5
Step 2/6 : MAINTAINER pamtrak06 <pamtrak06@gmail.com>
 ---> Using cache
 ---> 9c561b8834f8
Step 3/6 : RUN apt-get update && apt-get install -y apache2 apache2-threaded-dev
 ---> Using cache
 ---> 09fa1cec80dc
Step 4/6 : RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
 ---> Using cache
 ---> ff1eee1b0bdb
Step 5/6 : CMD apachectl -D FOREGROUND
 ---> Using cache
 ---> e8563809e2c6
Step 6/6 : EXPOSE 80
 ---> Using cache
 ---> d307433464d8
Successfully built d307433464d8
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating docom_mdb_1 ... done
Creating docom_web_1 ... done

 

docker ps -a 명령을 통해 컨테이너가 제대로 생성 되었는지 다시 한번 확인 해보고 이번 편을 마치도록 하겠다.

[root@localhost docom]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
044eba02fb3c        apache_df:web       "apachectl -D FORE..."   11 seconds ago      Up 10 seconds       0.0.0.0:80->80/tcp   docom_web_1
ede97239d9bc        mariadb:latest      "docker-entrypoint..."   11 seconds ago      Up 11 seconds       3306/tcp             docom_mdb_1

컨테이너가 잘 생성되었다.

 

 

이번 Docker : Docker Compose 편 에서는 여러개의 컨테이너를 도커 컴포즈를 이용하여 하나로 묶는 개념으로 다소 복잡할 수 있는 분산된 컨테이너를 효과적으로 관리할 수 있도록 YAML파일을 기술하고 실습해보았다. 특히 Dockerfile을 같이 활용하여 사용 할 경우 언제 어느 환경에서도 즉시 컨테이너를 생성하고 관리 할 수 있게 되었다.

 

 

Docker : Docker Compose 편

끝.

'Article' 카테고리의 다른 글

Scouter Slack Plugin 알림 설정하기  (2) 2020.06.03
Google AMP 개요 편  (0) 2019.05.30
Docker : Docker Compose 편  (0) 2019.04.05
자연어처리 - 데이터 정제  (0) 2019.03.22
REST API 디자인 가이드 적용기  (0) 2019.03.08
자연어처리 - Bag of words, n-gram  (0) 2019.03.08
Posted by DevStream

댓글을 달아 주세요

사내에서 출입관리시스템으로 세콤을 사용하고 있다. 

세콤에서 지급한 카드를 태그하면 출입문이 열리는 식이다. 

출입문 옆에는 세콤의 단말기가 있고 여기에 카드를 태그하면 사내에 있는 세콤 서버에 태그정보가 저장이 된다.

세콤에서 제공하는 전용프로그램으로 이 세콤 서버에 접속을 하면 출입기록을 조회할 수 있다.

 

이 태그 기록을 이용하면 직원들의 근태기록을 관리할 수 없을까 하는 생각을 했다.

그래서 다른곳에서는 어떻게 사용하는지 검색해보았다.

 

찾아보니 유료로 제공되는 솔루션들이 많았다.

상용 그룹웨어 대부분에서 세콤의 출입기록과 근태관리 시스템의 연동을 지원하고 있었다.

 

하지만 여러가지 이유로 연동을 직접 구축 하기로 정하였다.

 

 

근태정보 파일 가져오기

세콤에서는 출입기록을 어디에 남기는지 찾아보았다. 

  1. 세콤 서버에 접속하는 방법 : 접속 방법 자체를 알기 힘들어서 포기.

  2. 세콤 전용프로그램 : 전용프로그램에서 기록을 남기는 폴더가 따로 있었다. 이곳의 파일을 가져오기로 결정!

세콤 전용프로그램에서 남기는 파일 중 아래 위치에서 출입기록이 담겨있었다.

세콤설치폴더/DataBase/MainDB/Alarm/ALARM_YYYYMMDD.VMD

 

이곳에 있는 VMD 파일은 MdbPlus 라는 프로그램을 이용하여 오픈하였다.

http://www.alexnolan.net/software/mdb_viewer_plus.htm

 

이 VMD 파일은 MS Access 형식으로 되어있다. 

 

JAVA에서 JDBC를 이용해 MS Access 형식의 파일DB 에 접속하여 데이터를 가져가기 위해서 ucanaccess 라는 라이브러리를 이용하였다.

아래는 ucanaccess 라이브러리를 메이븐에서 추가하기 위한 코드이다.

<dependency>
  <groupId>net.sf.ucanaccess</groupId>
  <artifactId>ucanaccess</artifactId>
  <version>4.0.2</version>
</dependency>

 

VMD 데이터 사용하기

vmd 파일을 열어보면 다양한 컬럼들이 있다. 

이중에 시간, 카드번호, 고유값 정도의 정보를 확인하여서 사용중이다.

단말기 이름 등 정보가 다양하게 들어가 있으니 필요에 따라 더 가져다가 사용해도 좋을것이다.

 

id : 고유값. 1개의 VMD 파일 안에서만 고유한듯.

atime : 태그한 시간

cardnum : 카드 고유번호

 

결론으로 다가가자.

파일DB에 접속해서 쿼리를 보내고 결과를 받아오는 코드이다.

try {

  String secomQuery = "SELECT [ID],[ATime],[CardNum],[EqCode],[Master],[Param],[Ack],[AckUser],[AckTime]," +

       "[AckContent],[Transfer],[State]FROM [Alarm] ORDER BY [ATime]";

  String conUrl = "jdbc:ucanaccess://C:\[세콤설치위치]\DataBase\MainDB\Alarm\ALARM_날짜.VMD";

  Connection conn = DriverManager.getConnection(conUrl);

  Statement s = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,

          ResultSet.CONCUR_READ_ONLY);

  ResultSet rs = s.executeQuery(secomQuery);

  while (rs.next()) {

    //가져온 결과를 처리하는 로직..

  }

} catch (UcanaccessSQLException ex) {
  //파일DB 연결 및 쿼리 관련 Exception 처리
} catch (Exception ex) {
  //일반 Exception 처리
}

rs 에 받아온 결과를 가져다가 처리하면 된다. 

나의 경우는 이걸 30초에 한번씩 호출하고 있다.

 

가져온 정보는 별도 DB에 저장하고, 저장한 내역을 토대로 새로 들어온 데이터만 쌓고 있다.

[ID] 컬럼은 파일(1일치)안에서 고유한 값이니, 날짜 정보와 함께 저장해 두었다가 중복검사 할 때 활용하면 좋다.

Posted by panpid

댓글을 달아 주세요

  1. 2020.09.10 17:57  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  2. 2020.10.28 14:36  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  3. 2020.12.15 15:52  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

최근접 이웃법은 새로운 데이터를 입력받았을 때 가장 가까이 있는 것이 무엇이냐를 중심으로 새로운 데이터의 종류를 정해주는 알고리즘이다.

그림에서 보는것 처럼 기존 데이터가 파랑색과 주황색으로 데이터가 분류되었다고 한다면 물음표 데이터가 들어왔을때 이 데이터는 어떤 색상으로 분류가 되어야 할까?

 

최근접 이웃법 말그대로 가까운 것에 따른 분류이기 때문에 주황색으로 분류 할 것이다 . 정말 간단하고 직관적인 알고리즘 이다. 하지만 단순히 가장 가까이에 있는 것으로 분류를 하는것이 문제가 되는 경우도 있다.

 

다음의 경우를 살펴 보자.

 

knn

이번에는 문제가 약간 복잡해 진다. 이론대로 라면 가장 가까운 것은 파란색이기 때문에 파란색으로 분류를 해야 할것 같지만, 주변을 보면 대부분 주황색이 보인다. 왠지.. 파랑색으로 분류하면 안될 것 같다는 생각이 든다....

 

따라서 단순히 가까운것에 따른 분류에서 주변에 있는 몇개의 것들중에 많은 것으로 분류하게 되면 이 문제는 어느정도 해결이 된다.

 

물음표 주변(큰원)에는 4개의 데이터가 있는데 그중 세개가 주황색, 한개가 파랑색 이다. 가장 많은 색인 주황색으로 물음표는 분류가 된다.

 

그렇다면 주변의 범위 즉 주변 데이터의 갯수에 대한 기준이 있어야 할 것 같은데.. 위에서는 4개로 정하였다. 즉 K=4가 되는 최근접 이웃법이 된다. 그래서 KNN 알고리즘 이라고 하는 것이다.

knn

만약 K=1로 한다면 처음 정의했던 것처럼 물음표는 가장 가까운 한개의 요소만 바라보게 될 테니 파랑색으로 분류를 하게 될 것이다. 즉, K의 값에 따라 물음표가 어느 범주로 분류 될 것인지가 결정 된다.

 

그럼 과연 K는 몇이어야 좋은 것일까? 최선의 K값을 선택하는 것은 데이터마다 다르게 접근해야 한다.

실습

간단하게 mglearn 라이브러리에 있는 데이터셋을 이용하여 실습해 보자.

(mglearn : 그래프와 데이터셋을 손쉽게 다루기 위한 샘플데이터 라이브러리)

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import mglearn

mglearn.plots.plot_knn_classification(n_neighbors=3)

결과

knn

n_neighbors=3 즉 K=3으로 할 경우 테스트 데이터가 어느 분류로 될지를 보여주는 그래프이다.

앞에서 설명했듯이 가장 가까운 3개의 점들에 의해 분류가 결정이 된다.

여기서는 세개의 별이 테스트로 들어온 데이터고 결과적으로는 두개는 주황색, 한개는 파랑색으로 분류가 되었다.

mglearn.plots.plot_knn_classification(n_neighbors=3)

결과

knn

만약 n_neighbors=1 즉 K=1으로 할 경우 다른 결과를 얻게 된다.

mglearn의 make_forge 함수를 이용하여서 data와 target을 x와 y에 대입하여 해당 데이터로 모델을 만들고 검증해보자.

from sklearn.model_selection import train_test_split
x, y = mglearn.datasets.make_forge()

x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=0)

mglearn.discrete_scatter(x[:, 0], x[:, 1], y)

결과

knn

from sklearn.neighbors import KNeighborsClassifier
knn_classifier = KNeighborsClassifier(n_neighbors=3)

knn_classifier.fit(x_train, y_train)

print("테스트 데이터 예측 : {}".format(knn_classifier.predict(x_test)))
print("테스트 데이터 정확도 : {}".format(knn_classifier.score(x_test, y_test)))
테스트 데이터 예측 : [1 0 1 0 1 0 0]
테스트 데이터 정확도 : 0.8571428571428571

정확도는 약 86%

이 말은 모델이 테스트 데이터셋에 있는 데이터들중 86%를 제대로 맞췄다는 의미이다.

실제 핵심 로직은 sklearn에서 제공해 주고 있기 때문에 코드는 굉장히 간단해 보일 것이다.

K-NN알고리즘은 지도학습의 분류 알고리즘의 하나로 로직이 간단하여 구현하기 쉽다. 하지만 학습 모델이 따로 없고, 전체 데이터를 스캔하여 데이터를 분류하기 때문에 데이터의 양이 많아지면 분류 속도가 현저하게 느려진다. 그래서 K-NN알고리즘을 게으른 알고리즘 이라고도 한다.

Posted by @위너스

댓글을 달아 주세요