ver 2. (2024-10-17)
실습 후 이해한 내용을 덧붙이거나 수정.
ver 3 2024-10-23
데이터 문자열 변환 내용 추가
ver 4 2024년 11월 02일
가독성 추가
전처리 개념
데이터 전처리
데이터 전처리란
데이터를 머신러닝의 학습에 사용하기 전에, 기본적으로 데이터의 질을 높이기 위해서 또는
데이터의 효율을 높이기 위해서 먼저 데이터를 가공하는 것을 의미한다.
이는 머신러닝 모델에서 좀 더 학습하기 쉬운 데이터 타입으로 변경도 하며,
데이터의 특성을 구분하고 추가하고 가꿈으로써 같은 데이터의 양으로도
최고의 효율성을 만들어내려고 하는 것으로 이해하면 된다.
원시데이터
원시데이터란, 데이터의 전처리과정을 거치지않은 실제로 수집한 그 상태 그대로의
원 데이터를 의미한다.
이는 머신러닝 모델에 부합하지 않을 수 있고,
목적에 맞지 않는 특징 또한 포함이 되어 다른 문제를 야기할 수 있다.
원시데이터를 가공하여 모델에 맞는 데이터를 만들어 내는것을 우리는 전처리 라고 한다.
데이터 전처리 기법
결측값 처리
결측값이란, 데이터의 값이 없다 즉 null, none 도는 NaN 이라고 표시가 된다.
이러한 값은 머신러닝 모델의 학습에 사용할 수 없을 뿐더러, 수학적으로 연산을 할수 없는
분류의 데이터이기 때문에, 이를 처리해 주어야 한다.
결측값 처리
결측값를 처리하는 방법에는 3가지가 있다.
- 삭제 : 결측값 자체를 삭제한다.
- 대체 : 결측값를 대푯값으로 변경한다. (평균, 중간값 및 최빈값)
- 예측 : 다른 특성들을 사용하여 값을 예측한다.
1. 삭제
df_drop_rows = df.dropna()
df_drop_cols = dg.dropna(axis = 1)
dropna()를 사용해서 제거 시켜 줄 수 있다.
위는 결측값이 있는 행 자체를 지우는 것이고, 아래는 결측값이 있는 열 자체를 지운다.
2. 대체
df_filled = df.fillna(0)
df_filled_mean = df.fillna(df.mean())
df_filled_median = df.fillna(df.median())
df_filled_mode = df.fillna(df.mode().iloc[0])
fillna()는 값이 없는 데이터에 값을 채운다 라는 pandas의 함수이다.
이때, mean은 평균, median은 중간값, .mode()은 최빈값이다.
최빈값에서 iloc[0]은 최빈값중 첫번째의 값을 반환한다는 뜻이다.
3. 예측
실습필요.
결측값 처리의 유의사항
결측값를 처리할때, 삭제를 하게 된다면, 의도치 않게 너무 많은 데이터를 삭제 할 수도 있다.
이때는 대체나 예측을 사용하게 되는데, 문제는 이들도 제약이 존재한다.
대체는 내가 설정한 특정한 값 또는 평균과 중간값 등으로 대체를 진행 할 수 있는데,
문제는 문자열의 경우에는 이러한 값을 찾기가 힘든 경우도 있다.
예측 또한, 추가적인 다른 모델을 사용하여 예측 할 수 있지만, 보통은 문자열의 경우
대체 또는 삭제를 사용하게 된다.
이상값 처리
데이터에서 비정상적으로 크거나 작은 값을 처리해 주는 것을 의미한다.
값 자체에 오류가 있거나 비정상적인 특이케이스같은 경우는 학습에 문제를 야기할 수 있다.
예시를 들어보자면 자동차의 가격에 대한 데이터셋 인데, 이벤트로 풀린 1달러 짜리 자동차와
한정판으로 나온 다이아몬드가 박힌 부가티 100억달러 이런 값을 의미한다.
이상값의 판별 방법
이상치는 IQR방법으로 판별을 할 수 있다.
IQR은 사분위수 범위를 뜻하며 데이터를 4등분 하여 중간의 50프로의 범위를 나타낸다.
판별하는 코드
# 특정 열의 이상값 확인 (IQR 방법)
Q1 = df['column_name'].quantile(0.25)
Q3 = df['column_name'].quantile(0.75)
IQR = Q3 - Q1
# 이상값 범위 설정
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 이상값 확인
outliers = df[(df['column_name'] < lower_bound) | (df['column_name'] > upper_bound)]
print(outliers)
특정한 열에서 IQR을 생성하는 방법이다. quantile은 데이터를 일정한 간격으로 나눈 값을 의미한다.
만약 IQR의 범위안의 데이터만 사용하게 된다면, 무척이나 많은 데이터를 버리게 되는 것이다.
이때 이상값의 범위를 설정해서 좀더 세분화 하여서 나눌수 있다.
위의 1.5 * IQR은 일반적으로 정형화된 식이라고 보면 된다.
이상값 확인은 쉽게 각 데이터프레임에 범위를 비교해서 반환하는 것이다.
즉 IQR을 처리하게 된다면 데이터셋에서의 상위 0.5프로, 하위 0.5프로 즉 1프로의 데이터를
이상치로 판별하는 것이다.
이상값 처리
이상값의 범위를 특정하는것에 대해서 알아봤다.
이제는 이상값을 처리하는 2가지의 방법에 대해서 알아보겠다.
- 제거 : 이상값을 삭제한다.
- 대체 : 이상값을 다른 값으로 대체한다.
1. 제거
이상값의 제거는 하한값과 상한값을 알면 처리하기가 쉽다.
df_no_outliers = df[(df['column_name'] >= lower_bound) & (df['column_name'] <= upper_bound)]
위의 코드는 이상치의 값을 제거 한 데이터를 불러온다. (제외하고 불러온다 가 좀더 맞는 표현이다)
2. 대체
이상값을 다른 값으로 대체한다.
mean_value = df['column_name'].mean()
df['column_name'] = df['column_name'].apply(lambda x: mean_value if x < lower_bound or x > upper_bound else x)]
위의 코드는, lambda x를 사용하여, 범위밖의 값을 전부 평균값으로 대체하는 코드이다.
★범위 안의 값으로 대체
df['column_name'] = df['column_name'].apply(lambda x: lower_bound if x < lower_bound else (upper_bound if x > upper_bound else x))
위의 코드는, lambda x 를 사용하여, 이상치의 값을 전부 범위 안의 값들로 대체시킨다.
하위 0.5프로 이하의 값과 상위 0.5프로의 값은 딱 그 경계에 있게 설정한다.
중복 데이터 처리
데이터가 잘못 들어가 있거나, 동일한 중복된 데이터가 많은 경우 이를 제거해야 한다.
머신러닝의 경우 데이터에 의존하여 학습을 하게 되는데, 만약 중복된 데이터가 많다면
그만큼 학습이 중복적인 것으로만 하여서 일반적인 문제에는 대응을 하지 못하게 된다.
중복으로 데이터가 많이 들어간다면, 데이터의 가중치가 더해지기 때문에, 중복 데이터를 처리해 줘야 한다.
# 중복된 행 확인
print(df.duplicated().sum())
# 중복된 행 제거
df_no_duplicates = df.drop_duplicates()
중복된 행의 확인에서 sum은 중복된 행의 숫자를 세는 용도이다.
데이터 표준화
데이터 표준화란 데이터를 평균을 0으로 두고, 표준 편차를 1로 변환해서 데이터를
정규 분포에 가깝게 변환을 시키는 것을 의미한다.
만약 키와 몸무게의 데이터가 있다고 하자.
원본 데이터:
Height Weight
0 150 50
1 160 60
2 170 70
3 180 80
4 190 90
이를 데이터 표준화를 하게 된다면 이렇게 된다.
표준화된 데이터:
Height Weight
0 -1.414214 -1.414214
1 -0.707107 -0.707107
2 0.000000 0.000000
3 0.707107 0.707107
4 1.414214 1.414214
데이터 정규화
데이터 정규화는 특정 데이터의 특성의 값이 다른 특성보다 너무 큰 경우,
정규화를 통해서 크기를 줄여 줄 수 있다
.이렇게 하는 이유는, 같은 양의 데이터가 들어간다고 하더라도,
값이 큰 경우 가중치가 생기기 때문에 이를 데이터 정규화를 통해서,
최소값을 0 으로 최대값이을 1로 하는 값으로 변경을 시키는 것이다.
모든 데이터가 정규화가 되기 때문에, 같은 비율의 실수로 변경이 되는것이다.
데이터 인코딩
데이터 인코딩이란 범주형 데이터 즉 카테고리 형 데이터를 머신러닝의 모델이 잘 이해할 수 있는 데이터로
변경을 시키는 과정이다. 머신러닝의 모델은 학습을 할때, 숫자형 데이터를 처리하도록 설계가 되어있다.
이때, 범주형 데이터는 직접적으로 처리를 할 수 없기 때문에, 이를 변환하는 것이다.
데이터 인코딩의 종류
- 레이블 인코딩
- 원 - 핫 인코딩
- 딥러닝에서 임베딩
- 빈도 인코딩
이렇게 있다. 오늘 나는 레이블 인코딩과 원 - 핫 인코딩에 대해서만 설명을 하겠다.
1. 레이블 인코딩
레이블 인코딩은 범주형 데이터를 순차적인 데이터의 숫자 값으로 변환한다.
레이블 인코딩은 코드보다 예시를 들어보겠다.
data = ([["red"],["blue"],["green"]])
특성이 색 인경우, 빨간색, 파란색, 초록색 이렇게 반환을 할 수 있지만, 레이블 인코딩을 하게 된다면
각 색에 고유한 숫자를 부과한다.
즉 빨간색에는 0, 파란색에는 1 그리고 초록색에는 2로 변환하는 것이다.
2. 원 - 핫 인코딩
원 - 핫 인코딩도 비슷한 느낌의 숫자 값으로 변환이 되지만,
고유한 숫자가 아닌 0 과 1로 변환이 된다. (이진 벡터)
그렇게 되면
빨간색은 [ 1, 0, 0 ]
파란색은 [ 0, 1. 0 ]
초록색은 [ 0, 0, 1 ]
으로 변환 한다.
샘플링
샘플링이란 데이터셋에서 무작위의 샘플을 선택하여 분석을 하는 과정이다.
만약 데이터의 크기가 광활하여 전체를 다룰 수 없을때 유용하게 사용된다.
머신러닝에서 모델을 학습시키기위해 모든 데이터를 사용하게 된다면,
오버피터링의 문제와테스트를 할 데이터가 없다는 문제를 해결하기 위해
샘플링을 사용하여서 학습을 시킬 데이터와테스트를 할 데이터로 나누는 것 또한 샘플링의 일종이다.
X = np.array([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6,6]])
y = np.array([1, 2, 3, 4, 5, 6])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
위의 코드는 x와 y의 배열을 생성하고,
학습 데이터와 테스트 데이터를 분할 시키는 것이다.
특징 선택 및 추출
특징 선택 및 추출은 러닝머신의 모델 성능을 높이기 위한 중요한 특징을 선택하거나
새로운 특징을 추출하는 것을 의미한다.
특징 선택
특징 선택이란 기존의 특징에서 특정 모델에 중요한 것들을 골라내는 과정이다.
모델의 성능을 높이고 과적합을 방지하기 위해 사용된다.
특징 추출
특징 추출이란 기존의 특징에서 다른 특징과 조합을 하거나 변환하여 새로운 특징을 만드는 과정이다.
이때 원래 데이터가 가지고 있는 특징보다 더 유용한 특징이 생성되게 된다.
데이터 타입의 변환
모델에 맞게 데이터 타입을 변환 시켜야 할 때가 있다.
만약 숫자로 이루어진 문자열을 정수형으로 바꾼다던지로 말이다.
df[' '] = df[' '].astype(int)
위와같은 코드로 변경이 가능하다.
만약 날짜 데이터로 변경을 하고싶다면
df['PurchaseDate'] = pd.to_datetime(df['PurchaseDate'])
위의 코드를 사용 해 보자.
'용어정리 > Machine-Learning' 카테고리의 다른 글
Machine-Learning 용어정리 (SVM, KNN, 나이브베이즈, 의사결정나무) ver 2 (1) | 2024.10.23 |
---|---|
Machine-Learning 용어정리 (데이터셋) (3) | 2024.10.22 |
Machin-Learning 용어정리 (로지스틱 회귀) (0) | 2024.10.21 |
Machine - Learning 용어정리 (지도학습 - 회귀모델) ver 3 (0) | 2024.10.19 |
machine-learning 용어정리 (머신러닝이란) ver.2 (1) | 2024.10.15 |