이어서 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] y = 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 | s = pd.Series(list('abca')) pd.get_dummies(s) | cs |
다시 문제로 돌아와서, 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 |
여기까지 대략적인 데이터 정리를 해보았다.
다음 시간에는 지금까지 정리한 데이터로 모델링을 해서 결과를 도출해보고자 한다.