지도학습 유형 중 분류 문제를 살펴보겠습니다.
[데이터 로딩]
# 라이브러리 환경
import pandas as pd
import numpy as np
기본 라이브러리를 불러옵니다.
# skleran 데이터셋에서 iris 데이터셋 로딩
from sklearn import datasets
iris = datasets.load_iris()
# iris 데이터셋은 딕셔너리 형태이므로, key 값을 확인
iris.keys()
사이킷런 패키지는 붓꽃 데이터셋을 내장하고 있습니다.
load_iris() 함수를 통해 불러옵니다.
# DESCR 키를 이용하여 데이터셋 설명(Description) 출력
print(iris['DESCR'])
3가지 품종 중에서 하나를 선택하는 다중 분류 문제입니다.
4개의 피처(설명 변수)에는 꽃받침과 꽃잎에 대한 각각의 가로길이, 세로 길이 값이 들어있습니다.
분류 대상이 되는 목표 레이블은 3가지 범주(클래스)에 속하는 붓꽃 품종을 나타냅니다.
# target 속성의 데이터셋 크기
print("데이터셋 크기:", iris['target'].shape)
# target 속성의 데이터셋 내용
print("데이터셋 내용: \n", iris['target'])
'target' 키를 이용하여 목표 데이터를 확인합니다.
150개의 샘플 데이터에 대한 레이블 값이 1차원 배열에 들어있습니다.
클래스 0, 1, 2 각각 50개씩 들어있습니다.
# data 속성의 데이터셋 크기
print("데이터셋 크기:", iris['data'].shape)
# data 속성의 데이터셋 내용 (첫 7개 행을 추출)
print("데이터셋 내용: \n", iris['data'][:7, :])
'data' 키를 사용하여 추출합니다.
shape 속성으로 확인하면 150개의 행(붓꽃 샘플)과 4개의 열(피처)로 구성된 2차원 배열입니다.
추출한 배열의 첫 7개 행을 출력해서 내용을 확인합니다.
# data 속성을 판다스 데이터프레임으로 변환
df = pd.DataFrame(iris['data'], columns=iris['feature_names'])
print("데이터프레임의 형태:", df.shape)
df.head()
2차원 배열을 판다스 데이터프레임으로 변환합니다.
열의 이름도 변경하여 확인합니다.
# 열(column) 이름을 간결하게 변경
df.columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
df.head(2)
열의 이름을 간결하게 바꿔줍니다.
head 함수에 숫자를 입력하면 해당 수의 행을 추출합니다.
# Target 열 추가
df['Target'] = iris['target']
print('데이터셋의 크기: ', df.shape)
df.head()
타깃 테이블 열을 새로 만들어 추가해줍니다.
'target'에 입력하면 데이터프레임의 가장 오른쪽 열로 추가되는 것을 확인할 수 있습니다.
[데이터 탐색]
# 데이터프레임의 기본정보
df.info()
info 메소드는 데이터프레임의 기본 정보를 보여줍니다.
모든 열에는 150개의 유효 데이터가 있고, 64비트 실수형과 정수형으로 구성되어 있습니다.
# 통계정보 요약
df.describe()
descrive 메소드는 통계 정보를 요약해줍니다.
# 결측값 확인
df.isnull().sum()
innull 메소드를 적용하면 결측 값인지의 여부를 체크합니다. 결측값이면 True, 정상 데이터면 False입니다.
sum 메소드를 적용하면 결측값의 개수를 계산해 줍니다.
# 중복 데이터 확인
df.duplicated().sum()
duplicated 메소드를 적용하면 동일 샘플 중복 존재 여부를 체크합니다. 중복이면 True, 아니면 False입니다.
# 중복 데이터 출력
df.loc[df.duplicated(), :]
중복 행을 확인합니다.
loc의 인덱서의 행 위치에서 bool을 입력합니다. bool은 중복 데이터일 경우 True를 표시해줍니다.
# 중복 데이터 제거
df = df.drop_duplicates()
df.loc[(df.sepal_length==5.8)&(df.petal_width==1.9), :]
결과를 통해 중복인 데이터를 찾아냅니다.
# 중복 데이터 제거
df = df.drop_duplicates()
df.loc[(df.sepal_length==5.8)&(df.petal_width==1.9), :]
drop_duplicates 메소드를 이용해 중복 데이터를 제거합니다.
위에서의 체크된 142번은 사라지고 101번만 남은 것을 확인할 수 있습니다.
# 변수 간의 상관관계 분석
df.corr()
corr 메소드는 변수 간의 상관 계수 행렬을 출력합니다.
# 시각화 라이브러리 설정
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(font_scale=1.2)
시각화 패키지인 맷플롯립과 시본을 불러옵니다.
# 상관계수 히트맵
sns.heatmap(data=df.corr(), square=True, annot=True, cbar=True)
plt.show()
시본 heatmap 함수를 이용하여 상관 계수 행렬을 히트맵으로 나타냅니다.
각 변수 간의 상관 계수를 다른 색으로 표현합니다.
annot 옵션은 상과 계수 숫자를 표시할지 여부를 지정합니다.
# Target 값의 분포 - value_counts 함수
df['Target'].value_counts()
시리즈 객체에 value_counts 메소드를 적용하면 데이터 종류별 샘플 개수를 출력합니다.
목표 레이블의 클래스별 분표를 확인합니다.
# sepal_length 값의 분포 - hist 함수
plt.hist(x='sepal_length', data=df)
plt.show()
data 옵션에 그래프를 그릴 데이터 프레임을 지정하고, x옵션에 피처(열 이름)를 입력합니다.
맷플록립 hist 함수를 이용하여 sepal_length 열의 데이터를 히스토그램으로 그립니다.
# sepal_widgth 값의 분포 - displot 함수 (histogram)
sns.displot(x='sepal_width', kind='hist', data=df)
plt.show()
data 옵션에 그래프를 그릴 데이터 프레임을 지정하고, x옵션에 피처(열 이름)를 입력합니다. 동일합니다.
다만 그래프 종류를 지정하는 kind 옵션에 히스토그램을 나타내는 'hist'값으 입력합니다.
시본 displot 함수를 이용하여 sepal_width 데이터의 분포를 히스토그램으로 표현합니다.
# petal_length 값의 분포 - displot 함수 (kde 밀도 함수 그래프)
sns.displot(x='petal_width', kind='kde', data=df)
plt.show()
시본 displot 함수를 이용하여 히스토그램이 아닌 KDE 밀도 함수 그래프를 그릴 수 있습니다.
petal_length 데이터의 분포를 그려봅니다. kind 옵션에 'kde'를 입력합니다.
두 개의 봉우리 형태로 분포된 것을 보아 서로 다른 이질적인 데이터가 섞여 있다고 추정해 볼 수 있습니다.
# 품종별 sepal_length 값의 분포 비교
sns.displot( x='sepal_length', hue='Target', kind='kde', data=df)
plt.show()
품종별 sepal_length 데이터의 분표를 그려봅니다. 시본 displot에 hue 옵션을 적용합니다.
목표 변수인 'Target' 열의 품종 (클래스) 별로 데이터를 구분하여 KDE 밀도 함수 그래프를 그립니다.
모델 학습에 고려해야 하는 유의한 피처로 보입니다.
# 나머지 3개 피처 데이터를 한번에 그래프로 출력
for col in ['sepal_width', 'petal_length', 'petal_width']:
sns.displot(x=col, hue='Target', kind='kde', data=df)
plt.show()
나머지도 시각화해봅니다.
# 두 변수 간의 관계
sns.pairplot(df, hue = 'Target', height = 2.5, diag_kind = 'kde')
plt.show()
시본 pairplot을 이용하면 서로 다른 피처 간 관계를 나타내는 그래프를 한 번에 그릴 수 있습니다.
hue 옵션에 Target 열을 지정하여 목표 클래스별로 구분해서 표시합니다.
'kde'를 지정하여 대각 방향에는 밀도 함수로 나타냅니다. ->'hist'로 변경 시 히스토그래프로 표시됩니다.
[Train-Test 데이터셋 분할]
모델 학습에 사용할 훈련(Train) 데이터와 모델 성능을 평가하는 데 사용할 테스트 데이터(Test)를 분할합니다.
사이킷런 train_test_split 함수를 사용하면 편리하게 나눌 수 있습니다.
from sklearn.model_selection import train_test_split
X_data = df.loc[:, 'sepal_length':'petal_width']
y_data = df.loc[:, 'Target']
X_train, X_test, y_train, y_test = train_test_split(X_data, y_data,
test_size=0.2,
shuffle=True,
random_state=20)
print(X_train.shape, y_train.shape)
print(X_test.shape, y_test.shape)
입력 데이터(X_data)에는 모델 학습에 사용할 피처로 4개의 열을 선택합니다.
목표 레이블(y_data)에 Target 열을 지정합니다.
test_size 옵션 값을 (0,2)에 따라 전체 데이터 중 20%를 테스트용으로 분할하고, 나머지 80%를 훈련용으로 분할합니다.
shuffle 옵션을 True로 지정하면 데이터를 무작위로 섞어서 추출합니다.
random_state 옵션을 지정해두면 무작위 추출을 할 때 항상 일정한 기준으로 분할합니다.
따라서 코드를 다시 실행해도 같은 결과를 얻습니다.
본 내용은 '파이썬 딥러닝 머신러닝 입문'을 기반으로 공부한 내용을 정리한 글입니다.
'머신러닝' 카테고리의 다른 글
[머신러닝] 일차함수 관계식 찾기 (0) | 2022.04.28 |
---|---|
[머신러닝] 머신러닝 (0) | 2022.04.28 |
[머신러닝] 판다스 자료구조 (0) | 2022.04.28 |