머신러닝이란?
알파고의 등장
제가 머신러닝에 관심을 갖기 시작한 계기는 알파고의 등장이었습니다. 당시 저는 컴퓨터공학과 1학년 학생이었습니다. 언론에서는 알파고와 이세돌 9단의 대국으로 뜨겁게 달구어지고 있었습니다. 알파고의 등장으로 한국에도 머신러닝 열풍이 불기 시작하며 저도 자연스럽게 머신러닝에 관심을 가지게 되었습니다.
머신러닝이란?
머신러닝은 기계가 직접 학습을 하여 결정을 내릴 수 있도록 모델링하는 방법입니다. 예를들어 이미지를 제공하면 그 이미지가 어떤 동물인지를 컴퓨터가 직접 결정하도록 만드는 것을 의미합니다. 0과 1만을 인식하는 컴퓨터가 스스로 인지하고 판단하도록 만들기 위해서 과거에는 if-then을 활용하여 구현하였습니다.
대전 알고리즘을 가이드 해주는 인공지능은 과거에도 굉장히 쉽게 만들 수 있습니다. 과거의 인공지능은 위처럼 간단하게 몇가지 정보에 대한 물음을 if-then룰을 활용하여 모델링 되었습니다. 하지만 오늘날의 인공지능이라면 조금 더 복잡하게 모델링이 됩니다. 데이터에 기반하여 학습을 진행하여 과거의 경험을 토대로 판단하는 모델이 형성됩니다. 그렇게 형성된 오늘날의 인공지능은 그 날의 날씨, 손님의 성향등을 파악하여 좀 더 개인에게 맞춤화된 가이드를 진행하게 될 것입니다.
최근에는 머신러닝의 알고리즘의 발전, 무어의법칙으로 인해 빠른 데이터처리, 데이터 저장, 그리고 모든 사람이 휴대폰을 사용함으로 sns와 같은 곳에서 수많은 데이터의 생산으로인해 많은 데이터를 학습할 수 있는 여력이 생겼으며 그 결과 수 많은 인공지능 알고리즘들이 탄생하게 되었습니다.
지도학습와 비지도 학습
머신러닝이 학습하는 방법으로 지도학습과 비지도학습 그리고 강화학습이 있습니다. 지도학습은 정해진 레이블에 대하여 학습을 수행하는 것이고 비지도학습은 레이블이 정해져있지 않은 상태에서 학습을 진행하는 것 입니다.
레이블이 정해져있다는것은 학습하는 데이터에서 정답을 가지고 있는 데이터를 학습하는 것을 의미합니다. 지도학습의 예시로 이미지를 인식하는 것이 있습니다. 이미지넷 챌린지(ILSVRC)이라는 대회는 사진을 주면 그 사진이 무엇인지 맞추는 대회입니다. 이 때 학습데이터는 사진이며 레이블은 그 사진에 대한 정답이 됩니다. 이 대회를 통해 머신러닝의 우수한 성능을 확인할 수 있습니다.
사람이 직접 이미지를 분류하였을 때 오답을 낼 확률은 5%였습니다. 과거 인공지능은 사람보다 낮은 성과를 내었지만, 최근 딥러닝의 빠른 발전으로 인하여 사람의 능력을 뛰어넘은 AI가 탄생하고 있습니다.
다음으로 비지도학습에 대하여 알아보겠습니다. 레이블이 없는 문제라는 것은 정답이 주어지지 않은 데이터를 학습하는 것을 의미합니다. 대표적으로 클러스터링이 있습니다.
클러스터링이란 데이터를 몇개의 그룹으로 묶어내는 방법을 의미합니다. k-means 클러스터 알고리즘과 같은 것을 활용하여 하이퍼파라미터로 몇개의 그룹으로 나눌 것인지를 정해주면 위와 같이 데이터를 그룹별로 비슷한 특징의 데이터를 묶어줄 수 있습니다.
파이썬으로 머신러닝을 한다면
파이썬의 장점
파이썬은 머신러닝을 위해서 편리한 라이브러리를 제공합니다. 선형대수적으로 다차원의 데이터를 쉽게 다룰수 있도록 도와주는 Numpy, 데이터프레임을 지원하여 2차원 데이터를 쉽게 다룰수 있게 도와주는 Pandas와 같은 것이 대표적인 예입니다. 그리고 머신러닝을 편리하게 수행할 수 있게 머신러닝 알고리즘에 대한 라이브러리 사이킷-런도 제공하며 딥러닝을 위한 텐서플로, 케라스, 파이토치와 같은 다양한 라이브러리를 제공합니다. 많은 사람들이 이용하기 때문에 개발을 하며 모르는 것이 있을 때 쉽게 정보를 구할 수 있는 것도 매우 큰 장점이라고 생각합니다.
개발환경 세팅
파이썬으로 개발환경을 세팅하기 위해 pip를 활용하여 라이브러리를 설치하는 방법이 있습니다. 하지만 라이브러리의 버전까지 맞추어가며 세팅하기에는 굉장히 번거롭다는 단점이 있습니다.
아나콘다를 활용하여 개발환경을 세팅하면 좀 더 편리하게 개발환경을 구축할 수 있습니다. 아나콘다를 설치하면 머신러닝 개발에 필요한 라이브러리들이 모두 다운로드됩니다. 아나콘다는 머신러닝 라이브러리들의 호환성을 고려하여 버전에 맞는 개발환경을 세팅해주기 때문에 개발자가 라이브러리 버전에 대하여 고민할 필요를 줄여줍니다.
아나콘다 설치는 아나콘다 홈페이지에 들어가서 각자 os에 맞추어 설치해주시면 됩니다.
머신러닝을 시작하기 전에
이번 포스팅에서는 머신러닝을 본격적으로 공부하기에 앞서 중요 라이브러리인 Numpy와 Pandas의 기본적인 사용법에 대하여 익혀보는 시간을 갖도록 하겠습니다.
Numpy
판다스의 데이터프레임은 2차원의 데이터까지만 다룰 수 있습니다. 만약 딥러닝을 공부하게 된다면 다차원의 데이터를 다루어야하기 때문에 넘파이를 필수적으로 학습해야 합니다. 넘파이의 ndarray를 활용하여 3차원 이상의 식을 효율적으로 사용할 수 있습니다. 머신러닝을 공부하며 필요한 기본적인 기능을 알아보겠습니다.
ndarray개요(생성,차수)
Numpy를 사용할때 사용하는 array를 ndarray라고 합니다. ndarray를 생성하는 방법은 numpy의 array()를 사용하여 주면 됩니다.
list1 = [1, 2, 3]
array1 = np.array(list1)
array2 = np.array([[1,2,3],
[2,3,4]])
array3 = np.array([[1,2,3]])
print('array1 array 형태:',array1.shape) #(3,)
print('array2 array 형태:',array2.shape) #(2,3)
print('array3 array 형태:',array3.shape) #(1,3)
위 코드의 예시의 np는 불러온 Numpy 모듈을 의미합니다. 파이썬의 list구조를 np.array()에 넣어주어 ndarray로 변경해줄 수 있습니다.
차수를 알아보는 방법은 ndarray에서 shape를 출력해보면 됩니다. shape를 출력하면 차수 정보가 (axis0, axis1 axisn)와 같은 튜플로 나타나게 됩니다.
예제의 list1을 보면 1차원 list를 ndarray로 변경하면 (3,)으로 axis0만 존재하는 값으로 나타나는 것을 알 수 있습니다. list2는 2차원의 리스트이기 때문에 axis0,1의 값을 갖는 것을 볼 수 있습니다. 마지막으로 list3처럼 1차원 list를 두번 묶어서 ndarray로 변경하면 2차원으로 설정됨을 알 수 있습니다.
2차원의 데이터는 axis를 행렬로 인식하여 이해가 편리하였습니다.(axis0은 행 axis1은 열) 그런데 3차원 이상의 데이터의 경우 axis를 생각하는 것은 약간 어려울 수 있습니다. 3차원 이상의 ndarray의 axis를 이해하기 위하여 기하학적으로 3차원공간을 설명하도록 하겠습니다.
1차원은 데이터들(점)이 모여 선이 만들어집니다. 2차원은 면으로 선들이 모여 이루어집니다. 마지막으로 3차원은 면들을 모아 만든것이라고 생각해볼 수 있습니다. 만약 3차원의 데이터를 axis값이 의미하는 것을 알아보면 다음과 같습니다.
- axis0 : 면의 개수
- axis1 : 면을 구성하는 선의 개수
- axis2 : 선에 포함되는 데이터 개수
n차원의 데이터를 axis로 표현하면 axis0은 기하학적으로 가장 큰 것을 구성하는 것 axis1은 큰것을 제외한 것 중 큰 것을 구성 axis(n-1)은 그 배열에 포함되어있는 데이터의 개수를 의미하게 됩니다.
즉 axis0부터 가장 큰 값들이 나열됩니다. 따라서 위 array1은 1차원의 데이터로 (3,), array2는 2차원 데이터로(2,3), array3는 괄호 두개로 2차원 데이터 (1,3)이 됩니다.
데이터 타입
Python의 list는 데이터타입이 다르더라도 무방하지만, ndarray의 경우 동일한 데이터타입을 요구합니다. 만약 Python의 list에 문자열과 숫자가 함께 포함되어 있다면 숫자를 문자열로 변경되어 저장되며 int형과 float형이 함께 있다면 int형이 float형으로 변환되어 저장됩니다.
데이터타입을 변경하는 방법은 np.astype(타입)을 활용할 수 있습니다. 데이터 타입을 변경하면 메모리를 활용함에 있어 큰 이득을 얻을 수 있는 경우가 있기 때문에 유용하게 사용이 가능합니다.
array_int = np.array([1, 2, 3])
array_float = array_int.astype('float64')
array_float2 =array_int.astype(np.float64)
astype으로 변경할 때 위처럼 문자열로 'float64', 'int32'로 인자를 넘기거나 np.float64로 넘겨줄 수도 있습니다.
차원 변경
reshape를 활용하면 원하는 차원으로 데이터를 변경할 수 있습니다.
array1 = np.arange(10)
# (2, 5) shape으로 변환
array2 = array1.reshape(2, 5)
#(5, 2) shape으로 변환.
array3 = array1.reshape(5,-1)
reshape에 적절한 axis의 값을 넣어주어 결정할 수 있습니다. 이 때 중요한 점은 인자 axis의 곱이 항상 데이터의 개수와 일치해야한다는 것 입니다. 즉 데이터의 개수와 차원의 크기가 동일해야 오류 없이 차원이 변경됩니다. 차원에 -1을 넣게되면 데이터를 넣을 수 있는 값으로 변환되어 사용됩니다. 따라서 array3의 reshape값의 -1은 2로 처리된다고 보시면 됩니다.
indexing
ndarray의 데이터를 인덱스하는 방법은 배열과 동일하게 처리할 수 있습니다.
다만 조금 특이한 방법으로 :연산자를 활용하여 범위로 데이터 처리가 가능합니다.
array = np.arange(start=1, stop=10)
array[1:3] #인덱스 1부터 3이전까지 데이터
array[3:] # 인덱스 3부터 모든 데이터
array[:2] # 인덱스 2이전까지 데이터
array[:] # 모든 데이터
array[:-1] # 마지막 데이터 제외
:을 기준으로 왼쪽은 시작하는 인덱스 값 오른쪽은 마지막 인덱스 값을 의미하며 특히 오른쪽에 작성된 인덱스는 포함하지 않습니다. 즉 위에서 언급한 1:3의 경우 index값이 1,2인 데이터만 포함하게 됩니다.
index -1이 의미하는 바는 맨 뒤의 데이터를 의미합니다. -2는 맨뒤의 데이터 바로 앞 데이터를 의미하게 됩니다. 이렇게 index에 -값이 붙으면 가장 끝쪽 index라고 이해하시면 됩니다.
array = np.arange(start=1, stop=10)
array[[1,4,5]] #팬시 인덱싱
array[array > 5] #boolean 인덱싱
그 외 다른 방법으로 팬시 인덱싱과 boolean 인덱싱이 있습니다.
팬시 인덱싱은 위처럼 리스트로 인덱스를 주어 원하는 인덱스를 정하여 가져올 수 있습니다.
그리고 boolean index를 활용하면 조건으로 넣어준 값이 해당 조건을 만족하는 값만 가져오게 됩니다. 사실 array > 5만 출력하여보면 각 데이터에 대하여 True와 False에 대한 정보가 있는 list가 주어집니다. boolean index를 사용한다는 것은 데이터에 대한 True와 False에 대한 정보의 list를 주어 원하는 데이터를 index하는 것이라고 이해하시면 됩니다.
기타(정렬, 데이터 생성, 내적, 전치행렬)
- 정렬
정렬은 sort()와 argsort()가 있습니다. sort()는 데이터를 정렬하는 것을 의미하며 argsort()는 데이터를 정렬했을 때의 인덱스를 리턴하는 것을 의미합니다.
np.sort()를 활용하여 정렬을 할 수 있습니다. default로 오름차순 정렬을 제공하지만 [::-1]를 뒤에 붙여주어 내림차순으로 결과를 변경할 수 있습니다.array1d= np.array([78, 95, 84, 98, 88]) sort_array1_asc = np.sort(array1d) # 오름차순 정렬 sort_array1_desc = np.sort(array1d)[::-1] # 내림차순 정렬 sort_array1d_index = np.argsort(array1d) # argsort array2d = np.array([[8, 12], [7, 1 ]]) sort_array2d_axis0 = np.sort(array2d, axis=0) #2차원 정렬
np.argsort를 활용하면 Array가 정렬되었을 때 인덱스의 값을 반환받으며 위 경우에는 [0,2,4,1,3]의 결과를 얻을 수 있습니다.
다차원의 데이터를 정렬하는 경우에는 axis를 지정하여 어느 방향으로 정렬할지를 정해줄 수 있습니다.
- 데이터 생성(arange,zeros,ones)
- arange : 특정 범위의 데이터를 포함한 ndarray를 생성하는 방법입니다.
- ones : 모든 값이 1인 ndarray를 만들어줍니다. axis값을 받아 원하는 shape의 데이터 생성이 가능합니다.
- zeros : one과 동일하며 다만 1이 아닌 0 값이 들어가게 됩니다.
- 행렬 내적행렬 내적은 행렬의 곱을 의미합니다. np.dot()을 활용하여 두개의 ndarray를 내적할 수 있습니다.
- 전치행렬전치행렬은 각 행렬의 위치를 A(i,j)라고 할 때 A(j,i)로 변경하는 방법입니다.
np.transpose()를 활용하여 처리할 수 있습니다.
Pandas
Pandas는 2차원의 데이터를 효율적으로 다룰 수 있는 DataFrame과 1차원의 데이터를 다룰 수 있는 시리즈를 가지고 있는 라이브러리입니다. DataFrame의 특징은 열의 이름을 지정할 수 있다는 것입니다. 그리고 각 열에 들어가는 데이터의 타입이 다르더라도 상관이 없습니다. 그리고 index를 보유하고 있습니다.
DataFrame의 생성과 출력
# csv파일로 읽기
titanic_df = pd.read_csv('titanic_train.csv')
#dictionary 사용하여 생성
dict = {'Name': ['Chulmin', 'Eunkyung','Jinwoong','Soobeom'],
'Year': [2011, 2016, 2015, 2015],
'Gender': ['Male', 'Female', 'Male', 'Male']
}
df = pd.DataFrame(dic1)
데이터프레임을 생성하는 방법은 csv파일을 읽어오거나 python의 dictionary를 활용하는 방법이 있습니다. 그 외에도 Numpy의 ndarray를 활용하는 방법 등 다양한 방법을 제공합니다.
titanic_df.head(3)
titanic_df.tail(3)
생성한 데이터프레임을 출력하는 방법은 head()와 tail()이 있으며 head의 경우 데이터의 앞부분을 tail()은 뒷 부분을 출력하게 됩니다.
dataframe의 데이터에 대한 정보를 요약해서 확인하는 방법으로 info와 decribe이 있습니다.
df.info()
df.describe()
- info : DataFrame내의 컬럼명, 데이터 타입, Null건수, 데이터 건수 정보를 제공합니다.
- describe : 데이터값들의 평균,표준편차,4분위 분포도 그리고 숫자형 컬럼들에 대해서 해당 정보를 제공합니다.
특정 값 개수(value_counts)
DataFrame에서는 동일한 개별 데이터 값이 몇건이 있는지 정보를 제공합니다. value_counts를 활용하면 분포도를 확인할 수 있습니다.
value_counts = titanic_df['Pclass'].value_counts()
# 3 491
# 1 261
# 2 184
캐글의 타이타닉 데이터셋을 활용하여 value_counts를 적용한 결과입니다. 항상 데이터의 수량으로 내림차순 정렬이 되어 나타나게 됩니다. 왼쪽 3 1 2는 DataFrame의 index이며 Pclass의 데이터들을 의미합니다. 즉 Pclass가 3인 값이 491개, 1인 값이 261개, 2인 값이 184개 있다는 것을 알 수 있습니다.
DataFrame을 ndarray로 변경하기
DataFrame을 ndarray로 변경하는 방법은 values()를 활용하면 됩니다.
df.values()를 활용하면 열의 이름과 인덱스는 제거되고 값에 대하여 2차원의 ndarray를 얻을 수 있습니다.
ndarray를 활용하면 df.values().tolist()와 같이 사용하여 python의 list로도 변환이 가능하기 때문에 반드시 알아두는 것이 좋습니다.
DataFrame 칼럼 수정과 추가
DataFrame은 칼럼을 수정하거나 추가하는 것이 굉장히 편리합니다. 기존에 존재하는 DataFrame에 df[Name] = x를 입력하여 처리할 수 있습니다. 만약 Name이 기존에 존재한 정보라면 수정을 없다면 새로운 칼럼을 생성해줍니다.
DataFrame 삭제
titanic_drop_df = titanic_df.drop('Age_0', axis=1, inplace=false)
titanic_drop_df.head(3)
DataFrame을 삭제하는 방법은 drop()을 사용하면 됩니다. 이 때 axis를 지정하여 열을 삭제할지 행을 삭제할지를 결정하게 됩니다.
axis가 0이라면 행에 대한 삭제를 수행해주며 axis가 1이라면 열에 대한 삭제를 해줍니다.
inplace라는 조건은 다른 곳에서도 많이 사용되는 조건입니다. DataFrame에 삭제나 정렬과 같은 것을 처리할 때 기존의 데이터를 유지해야하는 경우가 있습니다. 이 때 inplace를 false로 사용한다면, 기존의 데이터는 유지되며 처리한 데이터를 따로 받아서 사용하면 됩니다. inplace를 True로 사용하게 되면 기존의 데이터가 변경이 되고 return값은 None이 나오게 되므로 반환받아 사용할 수 없습니다.
DataFrame 인덱싱 및 필터링
DataFrame을 인덱싱하고 필터링하는 방법은 []연산자를 활용하여 처리합니다.
titanic_df['Name'] #시리즈
titanic_df[['Name', 'Age']]
titanic_df[['Name']]
[]안에 원하는 열의 이름을 넣어주면 원하는 값을 가져올 수 있습니다. 만약 값을 하나만 넣어주게 된다면 시리즈로 데이터가 나오게 됩니다. 리스트를 넣어주게 된다면 데이터프레임으로 데이터를 가져옵니다.
[]안에 조건을 넣어주게 된다면 특정 조건의 데이터로 필터링된 결과가 나오게 됩니다.
titanic_df[ titanic_df['Pclass'] == 3]
위 코드는 Pclass의 값이 3인 정보들만 필터링하여 가져오는 방법입니다. 이 결과는 titanic_df의 Pclass가 3인 데이터만 남아 있게 됩니다.
data_df.iloc[0, 0]
data_df.loc['one', 'Name']
또 다른 인덱싱 방법으로 iloc과 loc가 있습니다. iloc는 위치기반으로 데이터를 인덱싱하는 방법입니다. Numpy의 ndarray와 동일하게 데이터를 찾아갈 수 있습니다. iloc[0,0]이 의미하는 데이터는 1행 1열의 데이터 값을 의미하게 됩니다.
loc는 명령을 기반으로 데이터를 찾아가는 방법입니다. [행,열]을 넣어주는 것은 동일하나 특이점으로 행에는 index를 열에는 칼럼이름을 넣어주어야합니다.
정렬
titanic_df.sort_values(by=['Pclass', 'Name'], ascending=False)
DataFrame을 정렬하는 방법은 sort_values()에서 인자에 by를 넣어 정렬할 값을 넣어주면 됩니다. 이 때 ascending은 오름차순으로 정렬할지 내림차순으로 정렬할지를 결정해주는 것입니다. 정렬에서도 inplace값이 default로 False로 설정되어있기 때문에 정렬을 한 값을 따로 저장하여 사용해야 합니다.
Aggregation함수와 GroupBy
DataFrame에 Aggregation 함수를 사용하면 모든 DataFrame 열에 대하여 값을 처리하게 됩니다.
titanic_df.count()
DataFrame의 각 열별로 null이 아닌 데이터 개수를 알고 싶다면 count()를 사용하여 처리하면 됩니다. 이 결과는 na값을 제외한 데이터의 개수를 보여줍니다.
titanic_df.mean()
DataFrame의 각 열의 평균을 알고 싶다면 mean()을 활용하면 됩니다.
titanic_df.sum()
각 열의 데이터의 총 합은 sum()을 처리하면 됩니다.
집합에 대한 함수를 사용할 때 GroupBy를 사용하면 특정 그룹으로 묶어 처리할 수 있습니다. GroupBy로 데이터를 묶게되면 DataFrame이 아니라 DataFrameGroupBy로 데이터 타입이 변경됩니다. 다시 DataFrame으로 변경하기 위해서는 적절한 Aggregation을 수행하면 됩니다.
titanic_groupby = titanic_df.groupby(by='Pclass')
titanic_groupby.count()
위 처럼 Pclass로 groupby를 활용해 묶어주고 count() 집계함수를 사용해주면 groupby를 한 Pclass의 각 원소별로 count된 결과를 가져옵니다. 즉 Pclass가 1일 때 각 열의 개수 2일때 각 열의 개수 3일 때 각 열의 개수가 나오게 됩니다.
groupby를 활용하여 묶은 데이터에서 count()도 하고 sum()도 해야하는 경우가 있습니다. 그 때 번거롭게 groupby를 두번 처리하여 count와 sum을 따로 할 필요 없이 agg()라는 메소드를 활용하면 한번에 처리가 가능합니다.
titanic_df.groupby('Pclass')['Age'].agg([max, min])
agg()에 list로 처리할 집계함수를 넣어주게 되면 한번에 처리가 가능합니다.
agg_format={'Age':'max', 'Age':'mean', 'Fare':'mean'}
titanic_df.groupby('Pclass').agg(agg_format)
서로다른 열에 대해서 집계함수를 처리하게 되는 경우에는 dictionary를 활용하여 처리하여주면 됩니다. dictionary의 key값으로 칼럼명을 value로 처리할 집계함수를 넣어주면 됩니다. Python의 dictionary의 경우 동일한 key값이 들어오면 안됩니다. 하지만 위 경우와 같이 동일한 칼럼에 대하여 두개의 집계함수를 사용해야하는 경우가 있습니다. 위 경우에는 가장 마지막에 작성한 Age의 mean을 처리하는 집계함수만 나오게 됩니다.
titanic_df.groupby('Pclass').agg(
age_max=pd.NamedAgg(column='Age', aggfunc='max'),
age_mean=pd.NamedAgg(column='Age', aggfunc='mean'),
fare_mean=pd.NamedAgg(column='Fare', aggfunc='mean')
)
이를 해결하기 위해 NamedAgg를 제공합니다. 이는 agg에 넣어서 사용하면되며 출력되는 값의 이름을 지정하여 줄 수 있습니다. 그리고 처리하는 열과 처리할 함수를 넣어주면 처리가 가능합니다.
결손 데이터 처리
DataFrame의 결측치를 처리하기 위해 결측치가 있는지 여부를 확인하는 함수로 inna()가 있습니다.
titanic_df.isna()
titanic_df.isna( ).sum( )
isna()를 사용하면 결측값은 True, 아닌 값은 False로 반환됩니다. 그리고 isna()에 대하여 sum을 하게 되면 boolean에 대한 연산이며 false는 0이고 true는 1이므로 결측 데이터의 개수를 구할 수 있습니다.
결측치를 처리하는 것은 fillna()를 사용하면 됩니다. fillna는 결측치를 채워 넣어주는 역할을 수행합니다. 결측치를 처리하는 방법은 평균값으로, 최빈값으로, 혹은 그냥 0으로 등 다양한 방법이 있으며 적절한 방법을 활용하여 처리하는 것이 모델링에 효과적일 수 있습니다.
titanic_df['Embarked'].fillna('S')
위 처럼 결측치를 임의의 값으로 넣어주는 것이 가능합니다. 이 때 inplace가 false이므로 변경된 값을 사용하려면 반드시 변수에 저장하여 사용해야합니다.
기타(nunique, replace)
- nunique
nunique는 특정 열의 데이터에 몇 건의 고유값이 있는지 확인해주는 함수입니다.
만약 Pclass가 1,2,3 이 3개의 데이터로 구성된다고 하면 nunique를 적용하면 3이라는 결과를 얻을 수 있습니다.titanic_df['Pclass'].nunique()
- replace
replace는 열에서 특정 값을 대체하는 방법입니다.
DataFrame에 성별 칼럼에 남자를 'male'이라고 저장해둔 데이터를 'Man'으로 변경하려고 한다면 replace를 활용하여 쉽게 변경이 가능합니다.replace_test_df['Sex'].replace('male', 'Man') replace_test_df['Cabin'].replace(np.nan, 'C001')
만약 2개 이상의 값을 변경하고자한다면 dictionary로 변경하고자 하는 데이터를 넘겨주면 됩니다.replace_test_df['Sex'].replace({'male':'Man', 'female':'Woman'})
replace를 활용하면 결측치에 대한 처리도 가능합니다.replace_test_df['Cabin'].replace(np.nan, 'C001')
포스팅을 마치며
이번 포스팅에서는 파이썬을 활용하여 머신러닝에 대한 공부를 시작하기 위하여 알아야하는 라이브러리에 대하여 간단히 알아보는 시간을 가졌습니다. 다음 포스팅부터는 본격적으로 파이썬의 사이킷런 라이브러리를 활용하여 머신러닝을 학습하도록 하겠습니다.
'Artificial intelligence > Etc' 카테고리의 다른 글
Hello RL : Frozen Lake 소개 및 기본 코드 (1) | 2022.09.15 |
---|---|
Object Detection의 개요 (0) | 2022.07.30 |
모델 평가(Evaluation) (0) | 2022.07.12 |
Sklearn 라이브러리를 활용하여 데이터 전처리하기 (0) | 2022.07.08 |
머신러닝이란? (0) | 2021.07.16 |