끄적이는 기록일지

[머신러닝] 02.데이터 전처리_(4) 데이터 정제 및 분리 본문

AI실무

[머신러닝] 02.데이터 전처리_(4) 데이터 정제 및 분리

시시나브로 2021. 9. 15. 01:26
728x90
 

[머신러닝] 02.데이터 전처리_(3) 수치형 자료

[머신러닝] 1.자료형태_(3) 수치형 자료 [머신러닝] 1.자료형태_(2) 범주형 자료 [머신러닝] 1.자료형태_(1) * 머신러닝 : 데이터 자료를 바탕으로 수행하는 분석방식 → 자료의 형태를 파악하는 것은

kcy51156.tistory.com

 

1. 결측값(Missing data)처리

1) 일반적인 머신러닝 모델의 입력 값으로 결측값을 사용X

→ 따라서 Null, None, NaN 등의 결측값을 처리 해야함

 

2. 결측값 처리 방식

1) 결측값이 존재하는 샘플 삭제

2) 결측값이 많이 존재하는 변수 삭제

3) 결측값을 다른 값으로 대체

3. 이상치(Outlier)처리

1) 이상치가 있으면, 모델의 성능을 저하할 수 있음

2) 이상치는 일반적으로 전 처리 과정에서 제거하며, 어떤 값이 이상치 인지 판단하는 기준이 중요

 

3) 이상치 판단 기준 방법

① 통계지표(카이제곱 검정, IQR지표 등)를 사용하여 판단

② 데이터 분포를 보고 직접 판단

③ 머신러닝 기법을 사용하여 이상치 분류

 

4. 데이터 분리하는 이유

- 머신러닝 모델을 평가하기 위해서는 학습에 사용하지 않은 평가용 데이터가 필요

- 약 7:3 ~8:2 비율로 학습용 평가용 데이터를 분리

 

5. 지도학습 데이터 분리

1) 지도학습의 경우 feature 데이터와 label 데이터를 분리하여 저장함

- Feature 데이터: label을 예측하기 위한 입력 값

- Label 데이터: 예측해야 할 대상이 되는 데이터

- ex) 공부시간 대비 시험점수를 예측한다고 하면,

  공부시간이 Feature 예측하는 시험점수가 Label데이터가 된다.

- 앞서 봤던 타이타닉의 예제로 보면, Survived가 lable데이터가 되고 나머지는 feature데이터가 된다.

6. 실습

1. drop 을 사용하여 Cabin 변수를 삭제하고 titanic_1에 저장합니다.
2. titanic_1에서 dropna 를 사용하여 결측값이 존재하는 샘플을 삭제하고 titanic_2에 저장합니다.

 

- 이상치가 존재하는 데이터를 머신러닝에 사용하게 된다면 성능 저하되기 때문에 
- 데이터 전 처리 과정에서는 이상치를 판별하고 처리함

3. Age 변수에서 outlier 에 있는 이상치를 제외한 데이터를 titanic_3에 저장합니다.
 (titanic 데이터에서 Age 변수에 존재하는 이상치(소수점 데이터)를 제거)

 

- 이상치를 처리한 바탕으로 학습용과 평가용으로 나눕니다.
4. titanic_3 에서 Survived 변수를 제거하여 X에 저장하고 Survived 변수의 데이터는 pandas의 Series 형태로 y에 저장합니다.
5. train_test_split 를 사용하여 데이터를 분리합니다. test_size는 0.3, random_state는 42로 설정합니다.

import pandas as pd

import pandas as pd
    
# 데이터를 읽어옵니다.
titanic = pd.read_csv('titanic.csv')
# 변수 별 데이터 수를 확인하여 결측 값이 어디에 많은지 확인합니다.
print(titanic.info(),'\n')

"""
1. Cabin 변수를 제거합니다.
* drop: 특정 변수(columns)를 삭제 
  DataFrame.drop(columns=[변수명])
"""
titanic_1 = titanic.drop(columns=['Cabin'])
# Cabin 변수를 제거 후 결측값이 어디에 남아 있는지 확인합니다.
print('1. Cabin 변수 제거')
print(titanic_1.info(),'\n')

"""
2. 결측값이 존재하는 샘플 제거합니다.
* dropna: 결측값이 있는 샘플을 제거
  DataFrame.dropna()
"""
titanic_2 = titanic_1.dropna()
# 결측값이 존재하는지 확인합니다.
print('2. 결측값이 존재하는 샘플 제거')
print(titanic_2.info(),'\n')

"""
(Age 값 - 내림 Age 값) 0 보다 크다면 소수점을 갖는 데이터로 분류합니다.
소수점 내림(없애주는 메서드) : np.floor()
원래 데이터 - 소수값 없앤 값
"""
outlier = titanic_2[titanic_2['Age']-np.floor(titanic_2['Age']) > 0 ]['Age']

print('소수점을 갖는 Age 변수 이상치')
print(outlier)
print('이상치 처리 전 샘플 개수: %d' %(len(titanic_2)))
print('이상치 개수: %d' %(len(outlier)))

"""
3. 이상치를 처리합니다.
"""
titanic_3 = titanic_2[titanic_2['Age']-np.floor(titanic_2['Age']) == 0 ]
print('3. 이상치 처리 후 샘플 개수: %d' %(len(titanic_3)))

# 데이터 분리하기
"""
4. feature 데이터와 label 데이터를 분리합니다.
>> X = feature데이터 Y = lable데이터
"""
# Survived를 제외한 데이터
X = titanic_3.drop(columns=['Survived'])
y = titanic_3['Survived']

print('4.\n')
print('X 데이터 개수: %d' %(len(X)))
print('y 데이터 개수: %d' %(len(y)))

"""
5. 학습용, 평가용 데이터로 분리합니다.
test_size : 학습용과 평가용을 어떤 비율로 나눌것인가 7:3
>> X_train, X_test, y_train, y_test = train_test_split(feature 데이터, 
label 데이터, test_size= 0~1 값, random_state=랜덤시드값)
"""
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 분리한 데이터의 개수를 출력합니다.
print('5. \n')
print('학습용 데이터 개수: %d' %(len(X_train)))
print('평가용 데이터 개수: %d' %(len(X_test)))



>>> <class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 10  Cabin        204 non-null    object 
 11  Embarked     889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
None 

1. Cabin 변수 제거
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 11 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 10  Embarked     889 non-null    object 
dtypes: float64(2), int64(5), object(4)
memory usage: 76.7+ KB
None 

2. 결측값이 존재하는 샘플 제거
<class 'pandas.core.frame.DataFrame'>
Int64Index: 712 entries, 0 to 890
Data columns (total 11 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  712 non-null    int64  
 1   Survived     712 non-null    int64  
 2   Pclass       712 non-null    int64  
 3   Name         712 non-null    object 
 4   Sex          712 non-null    object 
 5   Age          712 non-null    float64
 6   SibSp        712 non-null    int64  
 7   Parch        712 non-null    int64  
 8   Ticket       712 non-null    object 
 9   Fare         712 non-null    float64
 10  Embarked     712 non-null    object 
dtypes: float64(2), int64(5), object(4)
memory usage: 66.8+ KB
None
소수점을 갖는 Age 변수 이상치
57     28.50
78      0.83
111    14.50
116    70.50
122    32.50
123    32.50
148    36.50
152    55.50
153    40.50
203    45.50
227    20.50
296    23.50
305     0.92
331    45.50
469     0.75
525    40.50
644     0.75
676    24.50
735    28.50
755     0.67
767    30.50
803     0.42
814    30.50
831     0.83
843    34.50
Name: Age, dtype: float64
3. 이상치 처리 전 샘플 개수: 712
이상치 개수: 25
이상치 처리 후 샘플 개수: 687
4. 
X 데이터 개수: 687
y 데이터 개수: 687
5.
학습용 데이터 개수: 480
평가용 데이터 개수: 207
728x90
Comments