본문 바로가기
머신러닝

Kaggle 풀어보기 - DonorsChoose - 2

by 스클루지 2018. 4. 14.
반응형

이어서 DonorsChoose 문제를 계속 풀어보자

지난번, project_essay_1 과 3, project_essary_2 와 4를 각각 합쳤으므로,

필요 없는 column 들을 제거해주자.

1
2
3
columns_to_remove = ["id","project_essay_1","project_essay_2","project_essay_3","project_essay_4"]
train_joined.drop(columns_to_remove,inplace=True,axis=1)
test_joined.drop(columns_to_remove,inplace=True,axis=1)
cs

그리고 모델에 넣기 전, 데이터들을 분류해준다.

카테고리 중 선택이 가능한 categorical_columns, 카테고리가 아닌 non_cat_columns, 에세이 등의 text_columns

train 결과 값인 project_is_approved 값은 y 에 넣어준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
categorical_columns = ['teacher_prefix','school_state''project_grade_category','project_subject_categories''project_subject_subcategories']
non_cat_columns = ["project_submitted_datetime","teacher_number_of_previously_posted_projects","quantity","price"]
text_columns = ["project_title","project_resource_summary","projectessay_1_3","projectessay_2_4"]
 
train_cat = train_joined[categorical_columns]
train_non_cat = train_joined[non_cat_columns]
train_text = train_joined[text_columns]
test_cat = test_joined[categorical_columns]
test_non_cat = test_joined[non_cat_columns]
test_text = test_joined[text_columns]
= train_joined['project_is_approved']
 
train_cat = pd.get_dummies(train_cat)
test_cat = pd.get_dummies(test_cat)
cs

위 코드 중 맨 아래 get_dummies 는 데이터 중 해당하는 인덱스를 1로 표시해준다.

※ 예를 들어, 문자열 'abca' 에 아래처럼 get_dummies 를 적용한다면,

1
2
= pd.Series(list('abca'))
pd.get_dummies(s)
cs

아래와 같은 결과가 나올 것이다
   a  b  c
0  1  0  0
1  0  1  0
2  0  0  1
3  1  0  0

다시 문제로 돌아와서, train 데이터와 test 데이터의 column들을 살펴보자

test_columns 변수에는 test_cat 의 column 들을, train_columns 변수에는

train_cat 의 column 들을 각각 넣은 후에 all_columns 에 합쳐준다.

1
2
3
test_columns = test_cat.columns 
train_columns = train_cat.columns
all_columns = train_columns.union(test_columns)
cs

그리고 각각 어떤 column 들이 빠져있는지 살펴보고 추가해주자

train_add_columns 는 all_columns 에 있지만 train_columns 에 없는 column이다.

1
2
train_add_columns = all_columns.difference(train_columns)
test_add_columns = all_columns.difference(test_columns)
cs

train_cat 과 test_cat 에 기존에 없던 카테고리를 각각 추가하고, 비어있는 값들은 0 으로 세팅해준다.

1
2
3
4
test_copy = test_cat
test_cat = pd.concat([test_copy , test_copy.reindex(columns = test_add_columns, fill_value = 0.0)], axis = 1)
train_copy = train_cat
train_cat = pd.concat([train_copy , train_copy.reindex(columns = train_add_columns, fill_value = 0.0)], axis = 1)
cs

이제 연/월 데이터를 정리해주자.

아래 코드는 train 과 test 데이터에서 각각 datetime 을 읽어와서, 연/월 로 구분한 후, 

기존 datetime 행을 삭제하는 코드이다.

1
2
3
4
5
6
7
8
9
10
11
from datetime import datetime
train_non_cat["project_submitted_datetime"= pd.to_datetime(train_non_cat["project_submitted_datetime"])
test_non_cat["project_submitted_datetime"= pd.to_datetime(test_non_cat["project_submitted_datetime"])
 
train_non_cat["Project_submitted_month"= train_non_cat["project_submitted_datetime"].map(lambda x: x.month)
train_non_cat["Project_submitted_year"= train_non_cat["project_submitted_datetime"].map(lambda x: x.year)
test_non_cat["Project_submitted_month"= test_non_cat["project_submitted_datetime"].map(lambda x: x.month)
test_non_cat["Project_submitted_year"= test_non_cat["project_submitted_datetime"].map(lambda x: x.year)
 
train_non_cat.drop(["project_submitted_datetime"],inplace=True,axis=1)
test_non_cat.drop(["project_submitted_datetime"],inplace=True,axis=1)
cs

여기까지 대략적인 데이터 정리를 해보았다.

다음 시간에는 지금까지 정리한 데이터로 모델링을 해서 결과를 도출해보고자 한다.

반응형