KT 에이블스쿨 15일차(1)

박기범·2023년 2월 20일
0

에이블스쿨

목록 보기
19/95

오늘부터 머신러닝에 대해 본격적으로 들어갔습니다.



머신러닝

인간은 경험을 토대로 예측을 합니다. 인간의 경험이 머신러닝에서는 데이터라고 불립니다. 방대한 양의 데이터를 예측 혹은 분류하고자 할 때 기계를 학습시키는데 그것을 머신러닝이라고 부릅니다.

머신러닝 즉, 기계가 학습하기 위해서는 적정량의 데이터가 필요합니다. 또한 기계는 언어를 모르므로 숫자 데이터만 입력해야합니다.(단, 타겟값은 제외) 적정량의 데이터를 선정하는 과정을 전처리라고 합니다. 데이터를 잘 가공해야만 머신러닝의 성능이 향상됩니다.



전처리

필요하지 않은 컬럼을 제거하는 것을 말합니다.(유니크한 값을 가지는 컬럼이나 결측치가 너무 많은 컬럼) 결측치가 있는 데이터들에 대해서 조치를 해줍니다.

NaN값을 확인하는 방법은 아래와 같습니다.

	데이터프레임.isna().sum()

위처럼 작성해주면 결측치의 행 갯수를 확인할 수 있습니다.

NaN 값에 대해 제거하거나 중앙값 혹은 다른 방법으로 채워주는 것이 전처리 입니다.

▶결측치 제거
결측치가 있는 행을 제거하는 방법은 아래와 같습니다.

	데이터프레임.dropna(axis = 0, inplace=True)

결측치 제거할 때는 dropna()를 사용해줍니다. axis=0옵션은 행을 삭제해주는 옵션이고 inplace=True는 변경된 사항을 저장해주는 옵션입니다.

컬럼에 대해서 결측치를 제거하는 방법은 아래와 같습니다.

	데이터프레임.dropna(subset['컬럼명'], axis=0, inplace=True)

subset옵션을 사용해서 특정 컬럼만 제거할 수 있습니다.

만약 열에 대해서 너무 많은 결측치를 가지고 있어 해당 열 자체를 없애기 위해서는 axis=1의 옵션을 사용해주면 열 자체가 없어집니다.

※항상 어떤 값을 삭제한다는 것은 리스크가 큰 행위임으로 백업을 해두거나 .copy()를 통해 진행해서 원본은 살려두는 것이 좋은 방법입니다.

▶결측치 채우기
위에서는 결측치가 있는 데이터 행 혹은 열을 모두 지웠다면 이제는 결측치를 채우는 방법에 대해서 알아보겠습니다.

결측치에 대해 중앙값 채우는 방법은 아래와 같습니다.

	mean_a = 데이터프레임['컬럼'].mean()

mean()을 사용해서 결측치 채울 컬럼의 중앙 값을 먼저 구해줍니다.

	데이터프레임['컬럼'].fillna(mean_a, inplace=True)

결측치를 채우는 방법으로 .fillna()를 사용해주면 결측치를 채울 수 있습니다.


최빈값으로 채우기
최빈값으로 채운다는 의미는 결측치가 있는 행에서 가장 많은 변수의 값으로 결측치를 채운다는 의미입니다.
예를들어 타이타닉의 자료를 살펴보면

	titanic['Embarked'].fillna('S', inplace=True)

Embarked의 가장 많은 값은 'S'이므로 fillna()를 통해 결칙치를 채워주는데 가장 많은 값인 'S'의 값으로 채워줍니다.


결측치의 앞 또는 뒤에 있는 값으로 결측치를 채우는 방법
fillna()의 옵션으로 method=라는 옵션이 있는데 옵션 값을 설정해주면 앞의 값 혹은 뒤에 값을 가져와서 결측치를 채웁니다.

    # Ozone 변수 NaN 값을 바로 앞의 값으로 채우기
    data['Ozone'].fillna(method='ffill', inplace=True)
    # Solar.R 변수 NaN 값을 바로 뒤의 값으로 채우기
    data['Solar.R'].fillna(method='bfill', inplace=True)

위 예시를 보게 되면 Ozone의 컬럼에서 결측치들은 method='ffill'옵션 값에 의해서 앞의 값을 가져와 결측치를 채웁니다. 반대로 method='bfill'을 사용해주면 뒤에 있는 값을 가져와 결측치를 채웁니다.


선형 보간법으로 결측치를 채우는 방법

    # 선형 보간법으로 채움
    air['Ozone'].interpolate(method='linear', inplace=True)

    air['Solar.R'].interpolate(method='linear', inplace=True)

위 코드를 살펴보면 method='linear'라는 옵션을 볼 수 있는데 해당 옵션을 사용하면 선형 보간법으로 결측치를 채우는 것입니다. 선형 보간법이란 앞과 뒤의 평균을 구해서 채워주는 방식입니다.



▶가변수화
가변수화는 결측치를 채우는 방법이라기 보다는 머신러닝을 위한 전처리 방법중 하나입니다.
One-Hot Encoding은 범주형 값을 갖는 변수들에게 진행을 해줍니다.
가변수화를 진행하면 문자를 숫자로 바꾸어주거나 숫자로된 범주형을 숫자로써 비교하지 않기 위해 사용해줍니다.

가변수화는 위에 말했듯이 전처리의 마지막 단계입니다. 인간의 데이터가 아닌 기계의 데이터로 머신러닝을 시키기 전에 마지막에 가변수화를 진행합니다.

다중공선성이 발생한 경우 하나의 컬럼은 제거해줍니다. 다중공선성을 해결해주기 위해 사용하는 옵션은 drop_first=True를 사용해줍니다.

다중공선성을 제거했을 때 성능이 더 좋아질 수도 있고 더 안 좋은 경우도 있기 때문에 둘 다 진행해서 성능평가를 하는 것이 좋습니다.

가변수화의 방법은 먼저 가변수화 대상을 식별합니다.(타겟값 제외)

    # 가변수 대상 변수 식별
    dumm_cols = ['컬럼1', '컬럼2']

    # 가변수화
    데이터프레임 = pd.get_dummies(데이터프레임, columns=dumm_cols, drop_first=True)

위 코드와 같이 pd.get-dummies()를 사용해서 컬럼값을 가변수화 해줍니다.

※절대 타겟 값은 건드는 것이 아닙니다.

전처리의 목표는 좋은 머신러닝을 만들기 위한 준비단계입니다. 따라서 어떤 전처리가 옳은 전처리인지 답은 정해져있지 않습니다.

전처리와 가변수가 끝나면 이제 최종적으로 .info()를 통해 변수 값 중에 Object 타입이 있는지 없는지 확인을 하고 없다면 머신러닝을 진행합니다.



머신러닝 종류

머신러닝은 학습 방법에 따라 종류가 다릅니다.
지도학습은 데이터에 정답을 주어 규칙성패턴을 배워 학습하는 방법입니다.
비지도학습은 정답이 없는 데이터로 학습하는 방법입니다.
강화학습은 선택한 결과에 대해 보상을 받아 행동을 개선하면서 배우는 학습입니다.

분류문제는 분류규칙을 찾아서 새롭게 주어진 데이터를 분류합니다.(지도학습)
회귀문제는 결과 값이 있는 데이터를 통해서 연관성을 찾고 해당 연관성으로 새롭게 주어진 값에 대해 예측합니다.(지도학습)
클러스터링은 주어진 데이터를 학습하여 적절한 분류 규칙을 찾아 데이터를 분류하지만 정답이 없습니다.



분류와 회귀

원하는 결과가 분류인지 회귀인지 정확하게 정해야합니다. 분류는 얼마나 정확하게 맞췄는지에 대해서 목적을 가지고 있는 것이고 회귀는 얼마나 가까운 값에 맞췄는지에 대해 목적을 가지고 있습니다. 회귀는 연속적인 숫자를 예측하는 것이고 분류는 범주에 대해서 예측하는 것입니다.

분류와 회귀는 알고리즘이 다르고 평가 방법이 다르기 때문에 혼동해서는 안됩니다.



용어정리

모델이란 데이터로부터 패턴을 찾아서 수학식으로 정리해놓은 것입니다.
모델링이란 오차가 적은 모델을 만드는 것입니다.
모델의 목적은 샘플을 가지고 전체를 추정하는 것입니다,
컬럼은 변수 행은 관측치라고 합니다.
독립변수는 원인 종속변수는 결과입니다.
y는 타겟 즉 종속변수이고 x는 독립변수로 설정해줍니다.
평균도 모델 중 하나입니다. 관측값과 모델의 차이를 이탈도 즉, 오차라고 합니다.
과대적합은 학습데이터에서 평가 점수가 높았는데 평가 데이터에서 점수가 매우 낮은 경우를 의미합니다.
과소적합은 학습데이터보다 평가 데이터 점수가 더 높거나 두 점수 모두 낮은 경우입니다.



데이터분리

데이터를 학습용, 검증용, 평가용 데이터로 분류합니다.
평가용 데이터는 미래의 데이터입니다.(ex수능)
검증용 데이터는 평가 전 모델 성능을 검증하는 데이터입니다.(ex
모의고사)

데이터분리

    target = 타겟변수이름
    x = data.drop(target, axis=1)
    y = data.loc[:,target]

x, y에 각 각 변수와 타겟의 컬럼을 저장합니다. x와 y는 학습용, 평가용 데이터입니다.



모델링 코드 구조

지도/비지도 학습 알고리즘을 제공하는 파이썬 라이브러리 중 하나가 사이킷런입니다.
모델링 순서는 아래와 같습니다.
▶순서
1. 불러오기 : 팔요한 패키지를 불러옵니다.
2. 선언하기 : 사용할 알고리즘을 모델로 선언합니다.
3. 학습하기 : 모델.fit을 통해 학습합니다.
4. 예측하기 : 모델.predict로 예측값을 만듭니다.
5. 평가하기 : 실제값과 예측값으로 평가합니다.



머신러닝 실습

먼저 머신러닝을 위한 데이터를 준비합니다.

▶환경준비 : 필요한 패키지를 import합니다.

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns

▶데이터의 이해 : 데이터의 정보 및 컬럼 확인 등이 이뤄집니다.
head(),describe(),info(),corr()등의 함수를 이용합니다.

▶데이터 준비 : 전처리가 이루어집니다.
먼저 .isna().sum()을 통해 결측치를 확인합니다.
결측치를 채워줍니다.

data = data.fillna(method='ffill')

method='ffill'을 사용했으므로 앞의 데이터를 가져와 결측치를 채웁니다.

머신러닝에 필요없는 변수(컬럼)을 날려줍니다.

drop_columns = ['컬럼1','컬럼2']
data.drop(drop_columns, axis=1)

옵션 값 axis=1이므로 행이 아닌 열이 지워집니다.

▶데이터 분리 : 학습용과 평가용 데이터로 쓰일 데이터를 분리합니다.
타겟 값으로 컬럼 하나를 선정해줍니다.

	target = '컬럼명'
    # 데이터 분리
    x = data.drop(target, axis=1)
    y = data.loc[:,target]

위와 같이 코드를 작성해서 데이터를 분리해줍니다.

이제 7:3으로 학습용과 평가용 데이터로 분리하겠습니다.
먼저 필요 모듈을 불러옵니다.

	from sklearn.model_selection import train_test_split

모듈을 불러왔다면 이제 학습용 평가용으로 나눠줍니다.

	x_train, x_test, y_train, y_test =train_test_split(x,y, test_size=0.3, random_state=1)

random_state는 시드를 1로 고정해주는 옵션입니다.

위 단계를 모두 완료했으면 모델링 준비가 완료된 것입니다.

이제는 모델링을 진행하겠습니다.

▶환경준비 : 모델링에 필요한 모듈을 준비합니다.

	from sklearn.linear_model import LinearRegression
	from sklearn.metrics import mean_absolute_error

회귀 모델을 사용해서 회귀 알고리즘과 회귀 평가모델을 불러옵니다.

▶선언하기 : 모델이 어떤 모델인지 선언해줍니다.

	model = LinearRegression()

▶학습하기 : 모델을 학습용 데이터를 통해 학습시킵니다.

	model.fit(x_train, y_train)

▶ 예측하기 : 학습시킨 모델로 평가용 데이터를 가지고 예측값을 만드는 단계입니다.

	y_pred = model.predict(x_test)

▶ 평가하기 : 실제 정답과 예측을 통해 나온 정답(에측답)을 가지고 모델 성능을 평가합니다.

	mean_absolute_error(정닶값, 예측값)

변수의 명은 약속이므로 임의로 다른 변수명을 쓰면 동료검토나 해석할 때 힘들어질 수 있으므로 약속을 지켜서 변수명을 쓰도록 합시다.







오늘부터 머신러닝 학습을 시작하는데 매우 설렙니다.




※공부하고 있어 다소 틀린점이 있을 수 있습니다. 언제든지 말해주시면 수정하도록 하겠습니다.
※용어에 대해 조금 공부 더 해서 수정하겠습니다.

profile
개발자가 되기 위한 한걸음

0개의 댓글