검색
검색
공개 노트 검색
회원가입로그인

[이솦] 파이선으로 배우는 AI 기초 15

요약
  • 머신러닝 프로젝트의 전처리 작업은 매우 중요하다.
  • 데이터의 수집과 정제는 모델 성능에 직접적인 영향을 미친다.
  • 파이썬에서는 문자열과 리스트 조작을 위한 다양한 함수를 제공한다.

이솦 | EBS 소프트웨어·인공지능 교육

이제 파이썬의 기초는 다 배웠다. 이제 응용을 배워 보도록 하겠다. (응? 벌써?)

개발 방법론중 CRISP-DM (Cross industry Standard Process for Data Minning) 이라는 방법론이 있다. 데이터 과학 프로젝트를 진행할때 어떤 작업을 어떤 순서로 진행할지를 계획하고 분석하는 방법론이다.

인공지능 교육과정과 내용을 만든 글로벌 기업에서는 이 방법론을 응용하여 머신러닝 프로젝트 사이클을 제시했다.

problem scoping-> data acquisition -> data exploration-> modeling-> evalutaion-> deployment.

이렇게 사이클은 6단계로 이루어지는데 인공지능으로 해결할수 있는 문제를 찾아 설정부터, 문제 해결을 위한 데이터를 수집하고 정리하고, 모델을 만들어 성능을 평가하고 만족한 만한 성능이 나오는, 모델에 대하여 배포하여 활용하는 과정을 나태낸다. 평가시 만족할만한 성능이 나오지 않으면 데이터를 추가 수집하고 정리하며, 모델을 변경하는 작업을 통해, 좋은 모델을 만들려고 노력할 것이다.

그런데 실제 머신러닝 기반의 인공지능 모델 개발 프로젝터를 진행할때 어떤 단계가 가장 힘들까? 사람들은 모델링에 관심이 많지만 실제로는 데이터의 획득과 탐색에 많은 어려움과 인력 투입과 시간 투입을 필요로 한다. 모델링에 한달이라면 데이터 수집에는 일년 가까이 걸리기도 한다.

문자열과 리스트 조작 함수

파이썬에서 다루는 기초자료는 여러가지 종류가 있다. 데이터를 전처리하기 위해 다양한 방법으로 자료형을 다루는 방법이 있다.

자료형은 숫자, 문자(열), 컨테이너 타입(리스트, 튜플, 딕셔너리)이 있다. 오늘은 문자열과 리스트를 심도 있게 다루는 방법을 배워보자. 그럼 왜 문자열과 리스트일까? 인공지능에서는 문자열을 많이 사용한다. 문자열의 일부를 바꿔보자.

a = "펭수는 오늘 기분이 좋습니다.".replace("좋습", "나쁩")
aout = a.replace("좋습", "나쁩")
print(aout)
b="펭수는 펭수 굿즈를 좋아합니다."
cnt = b.count("펭수")
print(cnt)
c="펭수,20,176,65"
cout = c.split()
print(cout)
d="펭수, 20, 176,65"
dout = d.split(",")
print(dout)
e=''.join(["펭수", "20", "176", "65"])
print(e) 
f=';'.join(["펭수", "20", "176", "65"])
print(f)

replace는 글자를 바꾸는 함수이다. 메소드이지만 오늘은 함수라고 해보자.

count라는 함수를 쓰면 간단히 처리할수 있다. b라는 문자열에서 펭수를 카운트 해준다.

d는 문자열이다. 리스트가 아니다. 문자열을 공백를 기준으로 하나씩 쪼개려면 또는 컴마를 기준으로 떼어서 쓰려면 split()함수를 사용한다.

join은 리스트를 합쳐준다. 리스트를 문자열로 바꿔준다. 앞에 빈 문자열을 넣어준다.

;을 넣어주면 값을 ;으로 구별하면서 합쳐준다.

join은 문서를 전처리할때 사용되는 기능중 하나이다.

g="           펭수            "
gout=g.strip()
print(g)
print(gout)
leftstrip = g.lstrip()
rightstrip = g.rstrip()
print(leftstrip)
print(rightstrip)

다음 함수는 문자열에서 공백을 없애 주는 함수이다. 문서를 수집해서 내용을 처리할때 많이 사용한다. 해당문자열에 strip()함수를 사용한다.

strip()에는 lstrip(), rstrip()가 있다. 문자열 기준으로 왼쪽의 공백을 없앨 것인가? 오른쪽의 공백을 없앨 것인가 하는 함수이다.

머신러닝 프로그램을 작성하다 보면 리스크를 복사해야 할때가 많다. 자료를 복사하는것이다. 리스트도 객체이다.

리스트 할당 방식

x=[1,2,3,4]

y=x

x 라는 리스트를 만들고 y=x라고 해주면 실제 리스트가 두개 만들어 지는것이 아니다. 하나의 리스트가 2개의 이름을 가지는 것이다. 다시한번 이렇게 하면 리스트가 2개가 만들어 진것이 아니다.

X = [1, 2, 3, 4, 5]
y = X  
y[2] = 0
print(X)
print(y)
print(id(X))
print(id(y))

그럼 검증해 보자, 이렇게 만들었다면 y만 인덱스 2번 (3번째)가 0으로 바뀌어야 한다. x는 안바뀌어야 한다. id()함수는 리스트의 메모리상의 고유 번호를 알려 준다. 이렇게 해보면 y뿐만 아니라 x도 바뀌고 값도 같다는걸 알수 있다. id도 같다는걸 알수 있다.

리스트 복사를 하려면

x=[1,2,3,4,5]

y=x.copy()

이렇게 .copy()함수를 사용한다. 복사할 리스트에 copy함수 추가

주의할점은 리스트를 복사하면 리스트 하나더 만들수 있지만 다차원 리스트는 copy()가 아닌 deepcopy()를 이용해야 한다. 다차원 리스트는 x=[[1,2],[3,4,5]], y=[[1,2],[3,4,5]] 같은 형태이다. deepcopy는 모듈을 불러와야 한다.

import copy
c = [[1, 2], [3, 4, 5]]
d = copy.deepcopy(c)
d[0][0] = 0
print(c)
print(d)

c라는 값의 요소는 몇개인가? 2개 이다. 리스트 2개 요소이다. 복사 하고 싶다면 copy.deepcopy라고 해주면 된다. 다차원은 요소가 여러개 이다 보니 d[0][0]는 첫번째 요소의 첫번째 값이라는 뜻이다. 이렇게 중첩 리스트의 값을 바꿀수 있었다.

머신러닝 코드에서는 데이터를 자르거나 조정하거나 합치거하 하는 작업들을 데이터 전처리과정에서 많이 수행한다.

xy = np.array(data, dtype=np.float32)
#xy_test = np.array(test, dtype=np.float32)
#독립변수 입력
x_data = xy[:, 0:-1]
x_test = xy[3101:3150,0:-1]
#label 입력
y_data = xy[:, [-1]]
print(y_data)

이 코드는 영화의 흥행 예측에서 사용되는 코드이다.

x_data라는 변수에서 데이터를 잘라서 넣고 있는것을 볼수 있다. x_test라는 변수에는 xy데이터에서 다른 부분을 잘라서 넣을것을 볼수 있다. 즉 x_data는 처음부터 끝까지 넣으라는 의미이고, x_test 는 3010-3050까지의 데이터를 넣으라는 뜻이다. 이런것을 슬라이싱이라고 하는데 슬라이싱을 이용하는 경우외에도 strip, join등 다양한 함수를 사용한다.

실습

오늘의 실습은 시간을 입력 받아서 분으로 바꿔 보자.

3가지 경우를 보자. 1, 분만 있는 경우, 2, 시간만 있는 경우 3, 시간과 분이 있는 경우들이 있다. 이런 경유 시간과 분이라는 글자를 떼고 숫자로 바꿔서 처리해보자.

time= input("시간을 입력하세요>>>")
#1. 분만 있는 경우 ex) 30분
#2. 시간만 있는 경우 ex) 2시간
#3. 시간과 분이 있는 경우 ex) 1시간 30분
if time.find('시간') == -1:
    #분만 있는 경우
    result = int(time.split('분')[0]) #'분'이라는 글자 잘라 내기
else:
    if time.find('분') == -1:
        #시간만 있는 경우
        result = int(time.split('시간')[0]) * 60 #'시간'이라는 글자 잘라내기
    else:
        #시간과 분이 있는 경우
        sub = time.split('시간')
        result = int(sub[0]) * 60+ int(sub[1].split('분')[0])
print(result)

if time.find('시간') == -1: 에서 -1은 아니라는 뜻이다. 그래서 시간이 없다면= 분만 있다는 뜻이고, 분을 짤라내고 0번째 요소 숫자만 int로 ㅂ다는다. 시간인 경우는 비슷하지만 60을 곱한다.

시간과 분이 있는 경우라면 split를 써서 시간을 나눠서 0번째 요소에 60을 곱하고, 그 다음은 분으로 나눠서 0번째 요소를 나오는것을 더한다. 어려워 보일수도 있겠지지만, ( 교수님이 잘 가르쳐서 그런지 별로 어렵지는 않은듯.)

요약

머신러닝 프로젝트에서는 다양한 전처리 작업이 꼭 필요하다.

하나의 객체가 여러 이름을 가질수 있음. 이름은 다르지만 결국 모두 같은것

문자열에 대해서는 replace(), join(), count()등 문자열을 제어하는 함수를 사용한다.

리스트를 복사하는 경우는 copy(), deepcopy()등의 함수를 이용한다.

머신 러닝 개발은 모델을 생각하지만 올바른 모델을 위해서는 데이터의 수집과 정체가 매우 중요하다.

머신러닝에서는 GIGO 즉 garbage in garbage out말을 많이 사용한다. 즉 머신러닝 훈련에 사용되는 데이터가 좋지 않으면 결과가 좋을수 없다. 따라서 데이터를 수집한 뒤 정리하는 작업은 매우 중요한 작업이다.

공유하기
카카오로 공유하기
페이스북 공유하기
트위터로 공유하기
url 복사하기
조회수 : 79
heart
T
페이지 기반 대답
AI Chat