일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 가중치 업데이트
- 경사하강법
- LinearRegression 모델
- 항공지연
- 명목형
- 딥러닝 역사
- 알고리즘 기술
- 학습용데이터
- ICDL 파이썬
- 뉴런 신경망
- 데이터 분리
- 결측값 처리
- 지도학습
- 다중선형 회귀
- 지니 불순도
- 지도학습 분류
- 평가용 데이터
- 웹 크롤링
- 수치형 자료
- 머신러닝 과정
- 스케이링
- 수치 맵핑 기법
- 불순도
- 데이터 전 처리
- 이상치 처리
- 더미 기법
- 회귀 알고리즘 평가
- 분류 머신러닝 모델
- MSEE
- 퍼셉트론
- Today
- Total
끄적이는 기록일지
[머신러닝] 02.데이터 전처리_(4) 데이터 정제 및 분리 본문
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
'AI실무' 카테고리의 다른 글
[머신러닝] 03.지도학습-회귀_(2) 단순 선형 회귀 (0) | 2021.09.25 |
---|---|
[머신러닝] 03.지도학습-회귀_(1) 회귀 (0) | 2021.09.25 |
[머신러닝] 02.데이터 전처리_(3) 수치형 자료 (0) | 2021.09.14 |
[머신러닝] 02.데이터 전처리_(2) 범주형 자료 (0) | 2021.09.13 |
[머신러닝] 02.데이터 전처리_(1) 머신러닝 이해 (0) | 2021.09.13 |