- 수강한 강의
: Ch03.sklearn-전처리 기본-01.sklearn의 전처리 기능에 대하여 소개합니다 / Ch03.sklearn-전처리 기본-02.train_test_split으로 학습 데이터 준비하기 / Ch03.sklearn-전처리 기본-03. 빈값 처리 (Imputer) / Ch03.sklearn-전처리 기본-04.Label Encoder / Ch03.sklearn-전처리 기본-05.One Hot Encoding / Ch03.sklearn-전처리 기본-06.Normalization(정규화)
오늘은 scikit-learn에서 전처리 기능, train_test_split, 빈값 처리 (Imputer), Label Encoder, One Hot Encoding, Normalization(정규화)에 관하여 작성해보겠습니다.
Ch03.sklearn-전처리 기본-01.sklearn의 전처리 기능에 대하여 소개합니다
전처리(pre-processing) : 데이터 분석에 적합하게 데이터를 가공/변형/처리/클리닝 하는 작업 (Garbage in, Garbage out), 전처리의 결과에 따라 최종 결과값에 영향을 많이 미치게 된다.
분석가의 80% 시간을 데이터 수집 및 전처리에 사용한다. 그만큼 전처리의 중요성이 높다.
대표적인 몇 가지 전처리 과정
1. 결측치 - Imputer
2. 이상치
3. 정규화 (Normalization)
4. 표준화 (Standardization)- 샘플링 (Over/Under Sampling)
- 적은 샘플링을 많게 하거나 많은 샘플링을 적게 하는 것
- 피처 공학(Feature Engineering)
- 컬럼들끼리의 연산, 컬럼들을 통해서 새로운 컬럼을 만드는 것
- feature 생성/ 연산
- 구간 생성, 스케일 변형....
- 컬럼들끼리의 연산, 컬럼들을 통해서 새로운 컬럼을 만드는 것
- 샘플링 (Over/Under Sampling)
다음 사진은 정규화와 표준화에 관련된 식을 나타낸 사진이다.
정규화를 하는 이유가 따로 있다. 정규화를 하는 이유는 다른 스케일의 데이터를 동일한 스케일 데이터로 만들고자 할 때, 값에 대한 수치화 값이 넓은 범위(Ex) -10000 ~ 10000)로 존재할 때 머신러닝이 동작을 잘 못하는 경우가 있다. 이러한 경우 범위를 -10000 ~ 10000가 아닌 0 ~ 1 사이의 실수로 맞춰주는 것이다.
그리고 표준화는 사진에 나와 있는 것처럼 평균을 0으로, 표준 편차를 1로 맞추는 것이다.
Ch03.sklearn-전처리 기본-02.train_test_split으로 학습 데이터 준비하기
train_test_split을 실습하기 위해서 먼저 사용할 기본 타이나닉 데이터 셋을 준비합니다.
타이타닉 데이터 셋을 활용하기 위해서 numpy와 pandas를 먼저 import 해주고 그 다음에 train 변수에 캐클에서 제공해주는 데이터인 타이타닉 데이터 셋 주소를 입력하여 타이타닉 데이터 셋을 불러온다.
다음 사진이 기본 타이타닉 데이터 셋을 불러오는 코드이다.
다음 사진은 타이타닉 데이터 셋에 있는 컬럼을 설명한 내용이다.
여기서 Survived 컬럼이 label 값이 되게 된다.
이렇게 준비된 데이터 셋을 활용하여 먼저 feature와 label을 정의해준다.
feature에는 'Pclass', 'Sex', 'Age', 'Fare' 의 컬럼을 넣어서 정의를 해주고, label에는 'Survived' 컬럼의 넣어서 정의해주면 된다.
여기서 feature는 내가 학습을 하기 위한 컬럼값이 되게 된다. 그리고 label은 우리가 예측해야할 컬럼의 값이 되게 된다.
위에 정의한 feature와 label 값과 train_test_split을 활용하여 학습 데이터를 준비하면 된다.
from sklearn.model_selection import train_test_split
- 위 코드를 입력하면 train_test_split을 사용할 수 있다.
다음 사진을 보면 x_train, x_valid, y_train, y_valid 각 변수에 train_test_split을 사용하여 train의 feature값과 train의 label 값들을 나눠서 지정을 해주게 되는 test_size = 0.2로 설정이 되어 있는데, 이것은 validation set에 할당할 비율에 해당하게 된다. 0.2로 설정이 된 것은 20%의 범위로 validation set을 설정해주겠다는 것이다. shuffle은 데이터를 나눠주면서 나눠진 데이터를 섞을 건지 말건지를 정하는 것이다. random_state에 경우에는 랜덤 시드 값에 해당하는 값이다. 여기서 랜덤 시드 값을 지정해주는 이유는 모델 학습을 시킬 때 동일한 데이터에 대해서 모델 성능을 끌어 올려야 하기 때문에 섞일 때도 동일하게 섞이게 하기 위해서 랜덤하게 섞이는 값을 고정시키기 위해서 랜덤 시드 값을 지정해주게 되는 것이다.
Ch03.sklearn-전처리 기본-03. 빈값 처리 (Imputer)
sklearn에서 빈값 처리를 하기 위해서 먼저 각 컬럼별로 결측치가 있는지 확인해본다.
pandas에서 각 컬럼의 타입과 값이 채워진 값들의 양을 확인하는
데이터변수.info()
를 통해서 확인을 하면 된다. 다음을 통해서 확인해본 결과 'Age', 'Cabin', 'Embarked' 에 결측치가 존재하는 것을 확인할 수 있다. 그런데info()
함수를 통해서 보게 되면 차이가 많이 나는 값들에 대해서는 확인이 쉽게 가능하지만 비슷한 값들에 대해서는 확인하기가 쉽지는 않다. 그래서.info()
대신에.isnull().sum()
을 사용하게 되면 훨씬 쉽게 결측치 여부에 관하여 쉽게 알 수 있다.다음 사진이
.isnull().sum()
을 통해서 각 컬럼별로 결측치가 얼마나 존재하는지를 한 눈에 보기 쉽게 확인을 할 수가 있다.아까 봤던 결과값보다 휠씬 알아보기 쉬운 것을 확인할 수가 있다. 그리고 개별 컬럼의 결측치를 알아볼 수도 있다.
다음과 같이 코드를 작성을 하게 되면 train 데이터에서 'Age' 에 해당하는 컬럼의 결측치 개수를 확인할 수 있게된다.
다음 사이트는 Impute 모듈에 대한 상세한 내용이 적혀있는 사이트이다. 자세한 설명을 확인하고 싶을 때에는 다음 사이트에 들어가서 확인하면 된다.
다음 사진은 수치형(Numerical Column) 데이터에 대한 결측치 처리하는 방법이다. 맨 처음에는 결측치에 대해서 0이라는 숫자를 활용하여 채운 다음에 train['Age'] 에 대한 정보를 확인한 것이다. 결측치에 대하여 0으로 채웠기 때문에 최솟값이 0인 것을 확인할 수 있으면 전체 데이터 891개 모두 값이 채워진 것을 확인할 수 있다.
반면 아래의 코드는 0값이 아니라 기존 데이터에 있는 값들의 평균값을 활용하여 결측치를 채우는 방법이다. 그리고 해당 값으로 채운 다음에 최솟값을 확인하게 되면 0.42로 위 결과값과 다르다는 것을 확인할 수 있다. 그리고 요번에도 891개 모두 값들이 채워진 것을 확인할 수 있다.
하지만 이러한 방식으로 결측치를 채우게 되면 하나의 컬럼만을 활용하여 결측치를 채울 수가 있게 되는데, imputer를 활용하게 되면 2개 이상의 column을 한 번에 처리할 수 있게 된다. imputer를 사용하는 방법은 다음과 같다.
먼저
from sklearn.impute import SimpleImputer
을 먼저 실행을 시켜준다. 그 다음에 imputer 변수에 SimpleImputer() 함수안에 평균값에 해당하는 strategy='mean'을 입력을 해서 저장해 준다. 그리고.fit()
안에 결측치 값을 채우고자 하는 컬럼들을 입력을 해주고, transform 함수를 통해서 실제 결측치에 대한 처리를 해주면 기존에 결측치가 존재하는 부분에 평균 값으로 값이 채워진 것을 확인할수 있다. 하지만 이렇게만 하고 끝을 내면 실제 데이터에 적용은 되지 않기 때문에 각 컬럼에 채워진 값들이 포함된 결과 값을 대입을 해주고, 확실히 채워졌는지.isnull().sum()
을 통해서 최종적으로 확인을 하면 된다.다음 사진은 결측치를 채운 다음에 각 컬럼의 정보를 확인한 결과값이다. 'Age' 컬럼에 경우에는
.fillna()
를 사용해서 평균값을 넣은 것과 동일한 결과가 나왔기 때문에 실행이 제대로 된 것을 확인할 수가 있게 된다.fit과 transform을 한 번에 처리하는 방법이 또 있다. 그러면 위에서 한 것처럼 fit과 tranform을 따로 안해줘도 되기 때문에 코드의 길이 자체도 줄어들게 된다.
다음 사진에 나와있는 것처럼 ```.fit_transform()``을 사용하게 되면 fit과 transform을 한 번에 처리하는 방법이 되게된다. 나머지 과정은 동일하기 때문에 생략을 하고 중간에 strategy='median'을 설명하면 아까는 mean으로 평균값에 해당하는 것이였지만, 지금은 median으로 중간 값에 해당하는 값에 해당하게 된다.
지금 까지는 numerical 한 column의 결측치를 채우는 것이 였는데, 요번에는 categorical column 데이터에 대한 결측치 처리 방법이다.
'Embarked' 컬럼이 object 타입에 해당하게 된다. 이러한 타입의 컬럼은 문자열을 통해서 해당 결측치를 채워주게 되면 된다.
categorical column에 대한 column 들도 numerical column 에서 2개 이상의 column에 결측치 처리하는 것과 동일한 방식으로 결측치를 처리할 수 있다.
Ch03.sklearn-전처리 기본-04.Label Encoder
Label Encoding을 하는 경우는 기계 학습을 시킬 때 문자형 데이터가 있을 때 바로 머신러닝에 넣을 수가 없다. 그래서 이러한 데이터는 numerical한 수치로 변환을 해서 넣어주게 되는데 이러한 경우에 Label Encoding을 사용하요 데이터를 변환해 줄 수 있다.
우선 데이터의 정보를 확인해본다. 그리고 해당 데이터에서 'Sex' 에 해당하는 데이터 값에 대해서 수치로 된 데이터로 변환을 해보겠습니다.
수치적인 데이터로 변환을 하기 위해서 convert 함수를 통해서 male은 1로, female은 0이라는 값으로 변환해주는 함수를 만들게 된다. 그리고 성별 컬럼에서 남자가 몇명인지, 여자가 몇명인지를 확인을 해보고, apply() 함수에 covert 함수를 대입하게 되면 male과 female로 작성된 값이 0,1이라는 값으로 변경되어 출력되는 것을 확인할 수 있게 된다.
확인을 한 다음에 LabelEncoder를 총해서 변환된 것을 확인해보자.
다음이 LabelEncoder함수를 사용한 다음에 fit_transfrom을 통하여 'Sex_num' 컬럼을 새로 만들어 값을 저장하고 저장된 값의 갯수를 확인하고 classes_ 속성값은 기존에 해당하는 값이 어떤 것이였는지 확인할 수 있는 것이다. 그리고 inverse_transform은 numerical한 수치로 변환된 값을 다시 male, female의 값으로 재 변환해주는 코드이다.
해당 방식은 데이터에 NaN 값이 포함되어 있다면 LabelEncoder가 정상적을 동작하지 않게 된다.
Ch03.sklearn-전처리 기본-05.One Hot Encoding
One Hot Encoding은 단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여하는 단어의 벡터 표현 방식이다.
요번에는 타이타닉 데이터에서 Embarked 컬럼을 활용하여 One hot Encoding을 해보겠습니다.
우선 Embarked 컬럼의 데이터가 어떻게 구성되어 있고 값의 개수는 각각 몇개씩 있는지부터 확인을 해본다. 처음 확인했을 때는 결측치가 있기 때문에 해당 부분에 대해서는 'S' 에 해당하는 값으로 채워준다.
그리고 Label Encoder를 통해서 'S', 'C', 'Q' 에 해당하는 값들을 0, 1, 2 에 해당하는 값으로 변환을 해준다.
하지만, 이대로 데이터를 기계학습을 시키게 되면, 기계는 데이터 안에서 관계를 학습하게 된다. 즉, 'S' = 2, 'Q' = 1 이라고 되어 있는데 'Q' + 'Q' = 'S' 가 된다고 학습을 하게 된다는 것이다. 그렇기 때문에, 독립적인 데이터는 별도의 column으로 분리하고, 각각의 컬럼에 해당 값에만 True 나머지는 False 라는 값을 가지게 된다. 우리는 이것을 원 핫 인코딩한다라고 한다.
다음 사진의 첫 번째는 기존 'Embarked' 컬럼에서 6번째까지의 값을 출력한 것이고, 그 다음은 Label Encoder를 통해서 변화한 데이터 값을 출력한 것이다. 이렇게 Label Encoder를 통해서 만들어진 데이터를
.get_dummies()
함수를 통해서 각각에 해당하는 데이터 값에 맞게 True이면 1, False이면 0이라는 값으로 출력을 하게 된다. 그리고 다음 사진에 나와 있는 컬럼명으로 학습을 시키면 오류가 날 수 있기 때문에, 각 컬럼명을 기존 데이터 값에 있던 값들로 맞춰서 컬럼명을 지정해 주면 된다.위와 같이 column 을 분리시켜 카테고리형 -> 수치형으로 변환하면서 생기는
수치형 값
의 관계를 끊어주어서 독립적인 형태로 바꾸어 줍니다.원핫인코딩은 카테고리 (계절, 항구, 성별, 종류, 한식/일식/중식...)의 특성을 가지는 column에 대해서 적용 합니다.
Ch03.sklearn-전처리 기본-06.Normalization(정규화)
정규화 : column 간에 다른 min, max 값을 가지는 경우, 정규화를 통해 최소치/최대값의 척도를 맞추어 주는 것
정규화를 하기 위한 기본 데이터이다.
다음 사진을 보게되면 네이버와 넷플릭스에서 사용하는 영화 평점 수치에 대한 값들이 보이게 된다. 해당 값들을 dict 자료형을 묶어서 저장을 한다. 그리고 그 값으로 DataFrame을 만들은 값이 출력되게 된다. 작성된 데이터 프레임을 보게되면 같은 위치에 값들이 서로 다른 것을 확인할 수 있다. 이것은 같은 영화를 기준을 넷플리스에서는 최고 평점인 5점을 받았는데, 해당 평점을 가지고 네이버에서 비교를 하게 되면 좋지 않은 평점에 해당하게 된다. 그래서 이러한 현상을 해결하기 위해서 각 데이터의 정규화를 하게 된다.
정규화를 하게 되면 무조건 0과 1 사이의 값으로 나와야 한다.
다음 사진이 MinMaxScaler를 활용하여 네이버와 넷플릭스 영화 평점 값을 정규화한 결과값이다. MinMaxScaler를 먼저 import 해주고 min_max_scaler 변수에 MinMaxScaler() 함수를 적용시켜주고, 적용된 변수에
.fit_transform(movie)
를 하여 movie 데이터를 정규화 시킨 다음에 컬럼명 'naver'와 'netflix'라는 값으로 지정해준 정규화 데이터 프레임을 출력하게 된다.
이렇게 scikit-learn에서 전처리 기능, train_test_split, 빈값 처리 (Imputer), Label Encoder, One Hot Encoding, Normalization(정규화)에 관하여 작성해보았습니다.
- 데이터 분석
- 홈페이지에서 강의 찾는 방법
패스트 캠퍼스 -> 온라인 -> 올인원 패키지 -> [데이터 분석 강의 보러 가기] -> 직장인을 위한 파이썬 데이터 분석 올인원 패키지 Online.
패스트 캠퍼스 - [데이터 사이언스] 직장인을 위한 파이썬 데이터 분석
직장인을 위한 파이썬 데이터 분석 올인원 패키지 Online
'데이터 분석' 카테고리의 다른 글
[패스트 캠퍼스 수강 후기] 직장인을 위한 파이썬 데이터 분석 올인원 패키지 Online 21일차 (0) | 2021.04.20 |
---|---|
[패스트 캠퍼스 수강 후기] 직장인을 위한 파이썬 데이터 분석 올인원 패키지 Online 20일차 (0) | 2021.04.19 |
[패스트 캠퍼스 수강 후기] 직장인을 위한 파이썬 데이터 분석 올인원 패키지 Online 18일차 (0) | 2021.04.12 |
[패스트 캠퍼스 수강 후기] 직장인을 위한 파이썬 데이터 분석 올인원 패키지 Online 17일차 (0) | 2021.04.06 |
[패스트 캠퍼스 수강 후기] 직장인을 위한 파이썬 데이터 분석 올인원 패키지 Online 16일차 (0) | 2021.04.05 |
댓글