본문 바로가기

STUDY

파이썬 스터디 5주차(캐글)

https://youtu.be/_-N-kdodS0o

캐글 타이타닉 9. Feature Engineering - Fill Null in Age

- ML을 할 때에는 데이터가 '좋아야'하므로 모델이 학습하기 좋은 피처를 만드는 작업인 Feature Engineering은 (특히 정형 데이터일때)매우 중요한 작업

df_train['Initial'] = df_train['Name'].str.extract('([A-Za-z]+)\.')
df_test['Initial'] = df_test['Name'].str.extract('([A-Za-z]+)\.')
#extract로 Name칼럼에서 '.'이 들어가는 것 추출

pd.crosstab(df_train['Initial'], df_train['Sex']).T
#위에서 만든 Initial칼럼과 Sex칼럼의 크로스탭을 만들고 행과 열의 위치를 바꿈

T를 써주지 않았을 경우 아래로 긴 형태였을 것

- extract는 정규표현식에 맞는 것을 추출해주는 함수

 

df_train['Initial'].replace(['Mlle','Mme','Ms','Dr','Major','Lady','Countess','Jonkheer','Col','Rev','Capt','Sir','Don', 'Dona'],
                        ['Miss','Miss','Miss','Mr','Mr','Mrs','Mrs','Other','Other','Other','Mr','Mr','Mr', 'Mr'],inplace=True)
df_test['Initial'].replace(['Mlle','Mme','Ms','Dr','Major','Lady','Countess','Jonkheer','Col','Rev','Capt','Sir','Don', 'Dona'],
                        ['Miss','Miss','Miss','Mr','Mr','Mrs','Mrs','Other','Other','Other','Mr','Mr','Mr', 'Mr'],inplace=True)
#Initial의 다양한 칼럼들을 Miss, Mr, Mrs, Other의 네 가지로 대체하고 원본 df에 영향을 줌

df_train.groupby('Initial').mean()
#Initial에 따라 나눈 각 칼럼의 평균

 

- null데이터를 통계값으로 채울 때,

1) train데이터와 test데이터를 합쳐 통계값 계산

2) train데이터와 test데이터 각각에 통계값 계산

3) train데이터의 통계값으로 test데이터에 채움

정답은 3이다!

- loc(location) 인덱서 안에 숫자나 조건을 넣어 인덱싱을 할 수 있다.

df_train.loc[(df_train.Age.isnull())&(df_train.Initial=='Mr'),'Age'] = 33
df_train.loc[(df_train.Age.isnull())&(df_train.Initial=='Mrs'),'Age'] = 36
df_train.loc[(df_train.Age.isnull())&(df_train.Initial=='Master'),'Age'] = 5
df_train.loc[(df_train.Age.isnull())&(df_train.Initial=='Miss'),'Age'] = 22
df_train.loc[(df_train.Age.isnull())&(df_train.Initial=='Other'),'Age'] = 46
#각 initial의 age평균나이로 null데이터를 채움

df_test.loc[(df_test.Age.isnull())&(df_test.Initial=='Mr'),'Age'] = 33
df_test.loc[(df_test.Age.isnull())&(df_test.Initial=='Mrs'),'Age'] = 36
df_test.loc[(df_test.Age.isnull())&(df_test.Initial=='Master'),'Age'] = 5
df_test.loc[(df_test.Age.isnull())&(df_test.Initial=='Miss'),'Age'] = 22
df_test.loc[(df_test.Age.isnull())&(df_test.Initial=='Other'),'Age'] = 46
#train데이터의 통계값으로 test데이터의 널값을 맞춰줌

 

 

https://youtu.be/Q9Mry5rJIP8

- 연속형 자료를 카테고리화 할 수 있다

 

df_train['Embarked'].fillna('S', inplace=True)
#Embarked의 널값을 S로 채우고 원본값에도 영향을 줌

#카테고리화 방법 1. 각각에 새로운 칼럼과 그 값 할당해주기
df_train['Age_cat'] = 0
df_train.loc[df_train['Age'] < 10, 'Age_cat'] = 0
df_train.loc[(10 <= df_train['Age']) & (df_train['Age'] < 20), 'Age_cat'] = 1
df_train.loc[(20 <= df_train['Age']) & (df_train['Age'] < 30), 'Age_cat'] = 2
df_train.loc[(30 <= df_train['Age']) & (df_train['Age'] < 40), 'Age_cat'] = 3
df_train.loc[(40 <= df_train['Age']) & (df_train['Age'] < 50), 'Age_cat'] = 4
df_train.loc[(50 <= df_train['Age']) & (df_train['Age'] < 60), 'Age_cat'] = 5
df_train.loc[(60 <= df_train['Age']) & (df_train['Age'] < 70), 'Age_cat'] = 6
df_train.loc[70 <= df_train['Age'], 'Age_cat'] = 7
df_test['Age_cat'] = 0
df_test.loc[df_test['Age'] < 10, 'Age_cat'] = 0
df_test.loc[(10 <= df_test['Age']) & (df_test['Age'] < 20), 'Age_cat'] = 1
df_test.loc[(20 <= df_test['Age']) & (df_test['Age'] < 30), 'Age_cat'] = 2
df_test.loc[(30 <= df_test['Age']) & (df_test['Age'] < 40), 'Age_cat'] = 3
df_test.loc[(40 <= df_test['Age']) & (df_test['Age'] < 50), 'Age_cat'] = 4
df_test.loc[(50 <= df_test['Age']) & (df_test['Age'] < 60), 'Age_cat'] = 5
df_test.loc[(60 <= df_test['Age']) & (df_test['Age'] < 70), 'Age_cat'] = 6
df_test.loc[70 <= df_test['Age'], 'Age_cat'] = 7

#카테고리화 방법 2. 함수 만들어 칼럼에 적용해주기
def category_age(x):
    if x < 10:
        return 0
    elif x < 20:
        return 1
    elif x < 30:
        return 2
    elif x < 40:
        return 3
    elif x < 50:
        return 4
    elif x < 60:
        return 5
    elif x < 70:
        return 6
    else:
        return 7
df_train['Age_cat_2'] = df_train['Age'].apply(category_age)
#apply로 Age컬럼에 category_age 함수를 적용한 것을 Age_cat_2라는 칼럼으로 만듦

- 방법 1과 방법 2는 같은 결과를 냄(all은 모든 게 같으면 True, 하나라도 다르면 False값을 가진다. df_train['Age_cat'] == df_train['Age_cat_2']).all()로 확인해보면 True가 출력됨)

df_train.drop(['Age', 'Age_cat_2'], axis=1, inplace=True)
df_test.drop(['Age'], axis=1, inplace=True)
#원본 df에서 Age_cat_2컬럼과 Age컬럼 제거

df_train.head()를 해보면 이렇게 Age_cat이 잘 있음을 알 수 있다!

'STUDY' 카테고리의 다른 글

파이썬 스터디 7주차(캐글)  (0) 2022.02.18
파이썬 스터디 6주차(캐글)  (0) 2022.02.12
파이썬 스터디 5주차(백준)  (2) 2022.02.03
파이썬 스터디 4주차(캐글)  (0) 2022.01.30
파이썬 스터디 4주차(백준)  (0) 2022.01.30